1
0
Fork 0
mirror of https://github.com/plankanban/planka.git synced 2025-07-18 20:59:44 +02:00
planka/client/patches/redux-orm+0.16.2.patch
Maksim Eltyshev 2ee1166747 feat: Version 2
Closes #627, closes #1047
2025-05-10 02:09:06 +02:00

2543 lines
1.9 MiB

diff --git a/node_modules/redux-orm/dist/redux-orm.js b/node_modules/redux-orm/dist/redux-orm.js
index 9298fea..d53d03e 100644
--- a/node_modules/redux-orm/dist/redux-orm.js
+++ b/node_modules/redux-orm/dist/redux-orm.js
@@ -103,7 +103,7 @@ return /******/ (function(modules) { // webpackBootstrap
/*! no static exports found */
/***/ (function(module, exports) {
-eval("function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanM/NWE0MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\n");
+eval("function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanM/NWE0MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\n");
/***/ }),
@@ -114,7 +114,7 @@ eval("function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.len
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ \"./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzPzIyMzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMscUZBQW9COztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheVwiKTtcblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhvdXRIb2xlczsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js\n");
+eval("var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ \"./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzPzIyMzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsd0ZBQXVCOztBQUV0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js\n");
/***/ }),
@@ -125,7 +125,7 @@ eval("var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ \"./n
/*! no static exports found */
/***/ (function(module, exports) {
-eval("function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzPzViYzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/createClass.js\n");
+eval("function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzPzViYzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzcztcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/createClass.js\n");
/***/ }),
@@ -134,9 +134,9 @@ eval("function _defineProperties(target, props) {\n for (var i = 0; i < props.l
!*** ./node_modules/@babel/runtime/helpers/inheritsLoose.js ***!
\**************************************************************/
/*! no static exports found */
-/***/ (function(module, exports) {
+/***/ (function(module, exports, __webpack_require__) {
-eval("function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2UuanM/NTViNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNMb29zZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHNMb29zZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/inheritsLoose.js\n");
+eval("var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ \"./node_modules/@babel/runtime/helpers/setPrototypeOf.js\");\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2UuanM/NTViNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxvRkFBcUI7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzTG9vc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzTG9vc2U7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/inheritsLoose.js\n");
/***/ }),
@@ -147,7 +147,7 @@ eval("function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Ob
/*! no static exports found */
/***/ (function(module, exports) {
-eval("function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcz8xMWIwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaXRlcmFibGVUb0FycmF5OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/iterableToArray.js\n");
+eval("function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcz8xMWIwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/iterableToArray.js\n");
/***/ }),
@@ -158,7 +158,18 @@ eval("function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" &
/*! no static exports found */
/***/ (function(module, exports) {
-eval("function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableSpread;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzA2NzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVNwcmVhZDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/nonIterableSpread.js\n");
+eval("function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzPzA2NzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/nonIterableSpread.js\n");
+
+/***/ }),
+
+/***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js":
+/*!***************************************************************!*\
+ !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
+ \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzPzRhNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js\n");
/***/ }),
@@ -169,7 +180,7 @@ eval("function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt t
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ \"./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js\");\n\nvar iterableToArray = __webpack_require__(/*! ./iterableToArray */ \"./node_modules/@babel/runtime/helpers/iterableToArray.js\");\n\nvar unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ \"./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js\");\n\nvar nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ \"./node_modules/@babel/runtime/helpers/nonIterableSpread.js\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsdUZBQXFCOztBQUVyRCxzQkFBc0IsbUJBQU8sQ0FBQyxtRkFBbUI7O0FBRWpELGlDQUFpQyxtQkFBTyxDQUFDLHlHQUE4Qjs7QUFFdkUsd0JBQXdCLG1CQUFPLENBQUMsdUZBQXFCOztBQUVyRDtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWRcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/toConsumableArray.js\n");
+eval("var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles.js */ \"./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js\");\n\nvar iterableToArray = __webpack_require__(/*! ./iterableToArray.js */ \"./node_modules/@babel/runtime/helpers/iterableToArray.js\");\n\nvar unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ \"./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js\");\n\nvar nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread.js */ \"./node_modules/@babel/runtime/helpers/nonIterableSpread.js\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzPzQ0OGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCLG1CQUFPLENBQUMsMEZBQXdCOztBQUV4RCxzQkFBc0IsbUJBQU8sQ0FBQyxzRkFBc0I7O0FBRXBELGlDQUFpQyxtQkFBTyxDQUFDLDRHQUFpQzs7QUFFMUUsd0JBQXdCLG1CQUFPLENBQUMsMEZBQXdCOztBQUV4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5V2l0aG91dEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXkuanNcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgbm9uSXRlcmFibGVTcHJlYWQgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiKTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/toConsumableArray.js\n");
/***/ }),
@@ -180,7 +191,7 @@ eval("var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ \".
/*! no static exports found */
/***/ (function(module, exports) {
-eval("function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcz83MDM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/typeof.js\n");
+eval("function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcz83MDM3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/typeof.js\n");
/***/ }),
@@ -191,7 +202,7 @@ eval("function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Sy
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ \"./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMscUZBQW9COztBQUVuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js\n");
+eval("var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ \"./node_modules/@babel/runtime/helpers/arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzPzY2MTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsd0ZBQXVCOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js\n");
/***/ }),
@@ -262,6 +273,17 @@ eval("/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _
/***/ }),
+/***/ "./node_modules/lodash/_baseGet.js":
+/*!*****************************************!*\
+ !*** ./node_modules/lodash/_baseGet.js ***!
+ \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+eval("/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXQuanM/NjU2YiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxFQUFFO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/lodash/_baseGet.js\n");
+
+/***/ }),
+
/***/ "./node_modules/lodash/_baseIteratee.js":
/*!**********************************************!*\
!*** ./node_modules/lodash/_baseIteratee.js ***!
@@ -291,7 +313,7 @@ eval("/**\n * A specialized version of `_.map` for arrays without support for it
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("var arrayMap = __webpack_require__(/*! ./_arrayMap */ \"./node_modules/lodash/_arrayMap.js\"),\n baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\"),\n baseMap = __webpack_require__(/*! ./_baseMap */ \"./node_modules/lodash/_baseMap.js\"),\n baseSortBy = __webpack_require__(/*! ./_baseSortBy */ \"./node_modules/lodash/_baseSortBy.js\"),\n baseUnary = __webpack_require__(/*! ./_baseUnary */ \"./node_modules/lodash/_baseUnary.js\"),\n compareMultiple = __webpack_require__(/*! ./_compareMultiple */ \"./node_modules/lodash/_compareMultiple.js\"),\n identity = __webpack_require__(/*! ./identity */ \"./node_modules/lodash/identity.js\");\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzPzZhNWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFpQjtBQUM1QyxjQUFjLG1CQUFPLENBQUMscURBQVk7QUFDbEMsaUJBQWlCLG1CQUFPLENBQUMsMkRBQWU7QUFDeEMsZ0JBQWdCLG1CQUFPLENBQUMseURBQWM7QUFDdEMsc0JBQXNCLG1CQUFPLENBQUMscUVBQW9CO0FBQ2xELGVBQWUsbUJBQU8sQ0FBQyxxREFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyw2QkFBNkI7QUFDeEMsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsWUFBWTtBQUNaLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGJhc2VTb3J0QnkgPSByZXF1aXJlKCcuL19iYXNlU29ydEJ5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY29tcGFyZU11bHRpcGxlID0gcmVxdWlyZSgnLi9fY29tcGFyZU11bHRpcGxlJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XSwgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/lodash/_baseOrderBy.js\n");
+eval("var arrayMap = __webpack_require__(/*! ./_arrayMap */ \"./node_modules/lodash/_arrayMap.js\"),\n baseGet = __webpack_require__(/*! ./_baseGet */ \"./node_modules/lodash/_baseGet.js\"),\n baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\"),\n baseMap = __webpack_require__(/*! ./_baseMap */ \"./node_modules/lodash/_baseMap.js\"),\n baseSortBy = __webpack_require__(/*! ./_baseSortBy */ \"./node_modules/lodash/_baseSortBy.js\"),\n baseUnary = __webpack_require__(/*! ./_baseUnary */ \"./node_modules/lodash/_baseUnary.js\"),\n compareMultiple = __webpack_require__(/*! ./_compareMultiple */ \"./node_modules/lodash/_compareMultiple.js\"),\n identity = __webpack_require__(/*! ./identity */ \"./node_modules/lodash/identity.js\"),\n isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\");\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzPzZhNWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLHVEQUFhO0FBQ3BDLGNBQWMsbUJBQU8sQ0FBQyxxREFBWTtBQUNsQyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBaUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLHFEQUFZO0FBQ2xDLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFlO0FBQ3hDLGdCQUFnQixtQkFBTyxDQUFDLHlEQUFjO0FBQ3RDLHNCQUFzQixtQkFBTyxDQUFDLHFFQUFvQjtBQUNsRCxlQUFlLG1CQUFPLENBQUMscURBQVk7QUFDbkMsY0FBYyxtQkFBTyxDQUFDLG1EQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLDZCQUE2QjtBQUN4QyxXQUFXLFNBQVM7QUFDcEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFlBQVk7QUFDWixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlT3JkZXJCeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGJhc2VTb3J0QnkgPSByZXF1aXJlKCcuL19iYXNlU29ydEJ5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY29tcGFyZU11bHRpcGxlID0gcmVxdWlyZSgnLi9fY29tcGFyZU11bHRpcGxlJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/lodash/_baseOrderBy.js\n");
/***/ }),
@@ -467,7 +489,7 @@ eval("var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ \"./node_modul
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ \"./node_modules/lodash/_baseFlatten.js\"),\n baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ \"./node_modules/lodash/_baseOrderBy.js\"),\n baseRest = __webpack_require__(/*! ./_baseRest */ \"./node_modules/lodash/_baseRest.js\"),\n isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ \"./node_modules/lodash/_isIterateeCall.js\");\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzP2M3MDciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLHlCQUF5QjtBQUNwQztBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNO0FBQ047QUFDQTtBQUNBLGlDQUFpQyxlQUFlLEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NvcnRCeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICogXTtcbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF0sIFsnZnJlZCcsIDQ4XV1cbiAqL1xudmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbXTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gIH1cbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/lodash/sortBy.js\n");
+eval("var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ \"./node_modules/lodash/_baseFlatten.js\"),\n baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ \"./node_modules/lodash/_baseOrderBy.js\"),\n baseRest = __webpack_require__(/*! ./_baseRest */ \"./node_modules/lodash/_baseRest.js\"),\n isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ \"./node_modules/lodash/_isIterateeCall.js\");\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzP2M3MDciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsNkRBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLDZEQUFnQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsdURBQWE7QUFDcEMscUJBQXFCLG1CQUFPLENBQUMsbUVBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLHlCQUF5QjtBQUNwQztBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNO0FBQ047QUFDQTtBQUNBLGlDQUFpQyxlQUFlLEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NvcnRCeS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogMzAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICogXTtcbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAqL1xudmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbXTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gIH1cbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/lodash/sortBy.js\n");
/***/ }),
@@ -4426,7 +4448,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _int
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
-eval("(function (global, factory) {\n true ? factory(exports, __webpack_require__(/*! reselect */ \"./node_modules/reselect/lib/index.js\")) :\n undefined;\n}(this, function (exports, reselect) { 'use strict';\n\n function isStringOrNumber(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n\n var FlatObjectCache =\n /*#__PURE__*/\n function () {\n function FlatObjectCache() {\n this._cache = {};\n }\n\n var _proto = FlatObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FlatObjectCache;\n }();\n\n var defaultCacheCreator = FlatObjectCache;\n\n var defaultCacheKeyValidator = function defaultCacheKeyValidator() {\n return true;\n };\n\n function createCachedSelector() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return function (polymorphicOptions, legacyOptions) {\n // @NOTE Versions 0.x/1.x accepted \"options\" as a function\n if (typeof legacyOptions === 'function') {\n throw new Error('[re-reselect] Second argument \"options\" must be an object. Please use \"options.selectorCreator\" to provide a custom selectorCreator.');\n }\n\n var options = {};\n\n if (typeof polymorphicOptions === 'function') {\n Object.assign(options, legacyOptions, {\n keySelector: polymorphicOptions\n }); // @TODO add legacyOptions deprecation notice in next major release\n } else {\n Object.assign(options, polymorphicOptions);\n } // https://github.com/reduxjs/reselect/blob/v4.0.0/src/index.js#L54\n\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : [].concat(funcs);\n\n var resultFuncWithRecomputations = function resultFuncWithRecomputations() {\n recomputations++;\n return resultFunc.apply(void 0, arguments);\n };\n\n funcs.push(resultFuncWithRecomputations);\n var cache = options.cacheObject || new defaultCacheCreator();\n var selectorCreator = options.selectorCreator || reselect.createSelector;\n var isValidCacheKey = cache.isValidCacheKey || defaultCacheKeyValidator;\n\n if (options.keySelectorCreator) {\n options.keySelector = options.keySelectorCreator({\n keySelector: options.keySelector,\n inputSelectors: dependencies,\n resultFunc: resultFunc\n });\n } // Application receives this function\n\n\n var selector = function selector() {\n var cacheKey = options.keySelector.apply(options, arguments);\n\n if (isValidCacheKey(cacheKey)) {\n var cacheResponse = cache.get(cacheKey);\n\n if (cacheResponse === undefined) {\n cacheResponse = selectorCreator.apply(void 0, funcs);\n cache.set(cacheKey, cacheResponse);\n }\n\n return cacheResponse.apply(void 0, arguments);\n }\n\n console.warn(\"[re-reselect] Invalid cache key \\\"\" + cacheKey + \"\\\" has been returned by keySelector function.\");\n return undefined;\n }; // Further selector methods\n\n\n selector.getMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments); // @NOTE It might update cache hit count in LRU-like caches\n\n return cache.get(cacheKey);\n };\n\n selector.removeMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments);\n cache.remove(cacheKey);\n };\n\n selector.clearCache = function () {\n cache.clear();\n };\n\n selector.resultFunc = resultFunc;\n selector.dependencies = dependencies;\n selector.cache = cache;\n\n selector.recomputations = function () {\n return recomputations;\n };\n\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n\n selector.keySelector = options.keySelector;\n return selector;\n };\n }\n\n function createStructuredCachedSelector(selectors) {\n return reselect.createStructuredSelector(selectors, createCachedSelector);\n }\n\n function validateCacheSize(cacheSize) {\n if (cacheSize === undefined) {\n throw new Error('Missing the required property \"cacheSize\".');\n }\n\n if (!Number.isInteger(cacheSize) || cacheSize <= 0) {\n throw new Error('The \"cacheSize\" property must be a positive integer value.');\n }\n }\n\n var FifoObjectCache =\n /*#__PURE__*/\n function () {\n function FifoObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._cacheOrdering.push(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FifoObjectCache;\n }();\n\n var LruObjectCache =\n /*#__PURE__*/\n function () {\n function LruObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._registerCacheHit(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n this._registerCacheHit(key);\n\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n this._deleteCacheHit(key);\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto._registerCacheHit = function _registerCacheHit(key) {\n this._deleteCacheHit(key);\n\n this._cacheOrdering.push(key);\n };\n\n _proto._deleteCacheHit = function _deleteCacheHit(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return LruObjectCache;\n }();\n\n var FlatMapCache =\n /*#__PURE__*/\n function () {\n function FlatMapCache() {\n this._cache = new Map();\n }\n\n var _proto = FlatMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FlatMapCache;\n }();\n\n var FifoMapCache =\n /*#__PURE__*/\n function () {\n function FifoMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FifoMapCache;\n }();\n\n var LruMapCache =\n /*#__PURE__*/\n function () {\n function LruMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n var value = this._cache.get(key); // Register cache hit\n\n\n if (this._cache.has(key)) {\n this.remove(key);\n\n this._cache.set(key, value);\n }\n\n return value;\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return LruMapCache;\n }();\n\n exports.FifoCacheObject = FifoObjectCache;\n exports.FifoMapCache = FifoMapCache;\n exports.FifoObjectCache = FifoObjectCache;\n exports.FlatCacheObject = FlatObjectCache;\n exports.FlatMapCache = FlatMapCache;\n exports.FlatObjectCache = FlatObjectCache;\n exports.LruCacheObject = LruMapCache;\n exports.LruMapCache = LruMapCache;\n exports.LruObjectCache = LruObjectCache;\n exports.createStructuredCachedSelector = createStructuredCachedSelector;\n exports.default = createCachedSelector;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9yZS1yZXNlbGVjdC9kaXN0L2luZGV4LmpzP2YyM2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxFQUFFLEtBQTRELG9CQUFvQixtQkFBTyxDQUFDLHNEQUFVO0FBQ3BHLEVBQUUsU0FDK0U7QUFDakYsQ0FBQyxxQ0FBcUM7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTtBQUNYLE9BQU87QUFDUDtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87OztBQUdQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLHFFQUFxRTs7QUFFckU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7OztBQUd2QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxjQUFjOztBQUU5RCxDQUFDO0FBQ0QiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmUtcmVzZWxlY3QvZGlzdC9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgncmVzZWxlY3QnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ3Jlc2VsZWN0J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbFsnUmUtcmVzZWxlY3QnXSA9IHt9LCBnbG9iYWwuUmVzZWxlY3QpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsIHJlc2VsZWN0KSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBpc1N0cmluZ09yTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgfVxuXG4gIHZhciBGbGF0T2JqZWN0Q2FjaGUgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGbGF0T2JqZWN0Q2FjaGUoKSB7XG4gICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGbGF0T2JqZWN0Q2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlW2tleV0gPSBzZWxlY3RvckZuO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW2tleV07XG4gICAgfTtcblxuICAgIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoa2V5KSB7XG4gICAgICBkZWxldGUgdGhpcy5fY2FjaGVba2V5XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIH07XG5cbiAgICBfcHJvdG8uaXNWYWxpZENhY2hlS2V5ID0gZnVuY3Rpb24gaXNWYWxpZENhY2hlS2V5KGNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmdPck51bWJlcihjYWNoZUtleSk7XG4gICAgfTtcblxuICAgIHJldHVybiBGbGF0T2JqZWN0Q2FjaGU7XG4gIH0oKTtcblxuICB2YXIgZGVmYXVsdENhY2hlQ3JlYXRvciA9IEZsYXRPYmplY3RDYWNoZTtcblxuICB2YXIgZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yID0gZnVuY3Rpb24gZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlZFNlbGVjdG9yKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAocG9seW1vcnBoaWNPcHRpb25zLCBsZWdhY3lPcHRpb25zKSB7XG4gICAgICAvLyBATk9URSBWZXJzaW9ucyAwLngvMS54IGFjY2VwdGVkIFwib3B0aW9uc1wiIGFzIGEgZnVuY3Rpb25cbiAgICAgIGlmICh0eXBlb2YgbGVnYWN5T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tyZS1yZXNlbGVjdF0gU2Vjb25kIGFyZ3VtZW50IFwib3B0aW9uc1wiIG11c3QgYmUgYW4gb2JqZWN0LiBQbGVhc2UgdXNlIFwib3B0aW9ucy5zZWxlY3RvckNyZWF0b3JcIiB0byBwcm92aWRlIGEgY3VzdG9tIHNlbGVjdG9yQ3JlYXRvci4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICAgICAgaWYgKHR5cGVvZiBwb2x5bW9ycGhpY09wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBsZWdhY3lPcHRpb25zLCB7XG4gICAgICAgICAga2V5U2VsZWN0b3I6IHBvbHltb3JwaGljT3B0aW9uc1xuICAgICAgICB9KTsgLy8gQFRPRE8gYWRkIGxlZ2FjeU9wdGlvbnMgZGVwcmVjYXRpb24gbm90aWNlIGluIG5leHQgbWFqb3IgcmVsZWFzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBwb2x5bW9ycGhpY09wdGlvbnMpO1xuICAgICAgfSAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZXNlbGVjdC9ibG9iL3Y0LjAuMC9zcmMvaW5kZXguanMjTDU0XG5cblxuICAgICAgdmFyIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIHZhciByZXN1bHRGdW5jID0gZnVuY3MucG9wKCk7XG4gICAgICB2YXIgZGVwZW5kZW5jaWVzID0gQXJyYXkuaXNBcnJheShmdW5jc1swXSkgPyBmdW5jc1swXSA6IFtdLmNvbmNhdChmdW5jcyk7XG5cbiAgICAgIHZhciByZXN1bHRGdW5jV2l0aFJlY29tcHV0YXRpb25zID0gZnVuY3Rpb24gcmVzdWx0RnVuY1dpdGhSZWNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgcmVjb21wdXRhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIHJlc3VsdEZ1bmMuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgICAgZnVuY3MucHVzaChyZXN1bHRGdW5jV2l0aFJlY29tcHV0YXRpb25zKTtcbiAgICAgIHZhciBjYWNoZSA9IG9wdGlvbnMuY2FjaGVPYmplY3QgfHwgbmV3IGRlZmF1bHRDYWNoZUNyZWF0b3IoKTtcbiAgICAgIHZhciBzZWxlY3RvckNyZWF0b3IgPSBvcHRpb25zLnNlbGVjdG9yQ3JlYXRvciB8fCByZXNlbGVjdC5jcmVhdGVTZWxlY3RvcjtcbiAgICAgIHZhciBpc1ZhbGlkQ2FjaGVLZXkgPSBjYWNoZS5pc1ZhbGlkQ2FjaGVLZXkgfHwgZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yO1xuXG4gICAgICBpZiAob3B0aW9ucy5rZXlTZWxlY3RvckNyZWF0b3IpIHtcbiAgICAgICAgb3B0aW9ucy5rZXlTZWxlY3RvciA9IG9wdGlvbnMua2V5U2VsZWN0b3JDcmVhdG9yKHtcbiAgICAgICAgICBrZXlTZWxlY3Rvcjogb3B0aW9ucy5rZXlTZWxlY3RvcixcbiAgICAgICAgICBpbnB1dFNlbGVjdG9yczogZGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHJlc3VsdEZ1bmM6IHJlc3VsdEZ1bmNcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIEFwcGxpY2F0aW9uIHJlY2VpdmVzIHRoaXMgZnVuY3Rpb25cblxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBmdW5jdGlvbiBzZWxlY3RvcigpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gb3B0aW9ucy5rZXlTZWxlY3Rvci5hcHBseShvcHRpb25zLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkQ2FjaGVLZXkoY2FjaGVLZXkpKSB7XG4gICAgICAgICAgdmFyIGNhY2hlUmVzcG9uc2UgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuXG4gICAgICAgICAgaWYgKGNhY2hlUmVzcG9uc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVSZXNwb25zZSA9IHNlbGVjdG9yQ3JlYXRvci5hcHBseSh2b2lkIDAsIGZ1bmNzKTtcbiAgICAgICAgICAgIGNhY2hlLnNldChjYWNoZUtleSwgY2FjaGVSZXNwb25zZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNhY2hlUmVzcG9uc2UuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKFwiW3JlLXJlc2VsZWN0XSBJbnZhbGlkIGNhY2hlIGtleSBcXFwiXCIgKyBjYWNoZUtleSArIFwiXFxcIiBoYXMgYmVlbiByZXR1cm5lZCBieSBrZXlTZWxlY3RvciBmdW5jdGlvbi5cIik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9OyAvLyBGdXJ0aGVyIHNlbGVjdG9yIG1ldGhvZHNcblxuXG4gICAgICBzZWxlY3Rvci5nZXRNYXRjaGluZ1NlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBvcHRpb25zLmtleVNlbGVjdG9yLmFwcGx5KG9wdGlvbnMsIGFyZ3VtZW50cyk7IC8vIEBOT1RFIEl0IG1pZ2h0IHVwZGF0ZSBjYWNoZSBoaXQgY291bnQgaW4gTFJVLWxpa2UgY2FjaGVzXG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICB9O1xuXG4gICAgICBzZWxlY3Rvci5yZW1vdmVNYXRjaGluZ1NlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBvcHRpb25zLmtleVNlbGVjdG9yLmFwcGx5KG9wdGlvbnMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNhY2hlLnJlbW92ZShjYWNoZUtleSk7XG4gICAgICB9O1xuXG4gICAgICBzZWxlY3Rvci5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWNoZS5jbGVhcigpO1xuICAgICAgfTtcblxuICAgICAgc2VsZWN0b3IucmVzdWx0RnVuYyA9IHJlc3VsdEZ1bmM7XG4gICAgICBzZWxlY3Rvci5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICBzZWxlY3Rvci5jYWNoZSA9IGNhY2hlO1xuXG4gICAgICBzZWxlY3Rvci5yZWNvbXB1dGF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlY29tcHV0YXRpb25zO1xuICAgICAgfTtcblxuICAgICAgc2VsZWN0b3IucmVzZXRSZWNvbXB1dGF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH07XG5cbiAgICAgIHNlbGVjdG9yLmtleVNlbGVjdG9yID0gb3B0aW9ucy5rZXlTZWxlY3RvcjtcbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlZENhY2hlZFNlbGVjdG9yKHNlbGVjdG9ycykge1xuICAgIHJldHVybiByZXNlbGVjdC5jcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3Ioc2VsZWN0b3JzLCBjcmVhdGVDYWNoZWRTZWxlY3Rvcik7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpIHtcbiAgICBpZiAoY2FjaGVTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0aGUgcmVxdWlyZWQgcHJvcGVydHkgXCJjYWNoZVNpemVcIi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY2FjaGVTaXplKSB8fCBjYWNoZVNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJjYWNoZVNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgRmlmb09iamVjdENhY2hlID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmlmb09iamVjdENhY2hlKF90ZW1wKSB7XG4gICAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICAgIGNhY2hlU2l6ZSA9IF9yZWYuY2FjaGVTaXplO1xuXG4gICAgICB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpO1xuICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgIHRoaXMuX2NhY2hlT3JkZXJpbmcgPSBbXTtcbiAgICAgIHRoaXMuX2NhY2hlU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICB9XG5cbiAgICB2YXIgX3Byb3RvID0gRmlmb09iamVjdENhY2hlLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQoa2V5LCBzZWxlY3RvckZuKSB7XG4gICAgICB0aGlzLl9jYWNoZVtrZXldID0gc2VsZWN0b3JGbjtcblxuICAgICAgdGhpcy5fY2FjaGVPcmRlcmluZy5wdXNoKGtleSk7XG5cbiAgICAgIGlmICh0aGlzLl9jYWNoZU9yZGVyaW5nLmxlbmd0aCA+IHRoaXMuX2NhY2hlU2l6ZSkge1xuICAgICAgICB2YXIgZWFybGllc3QgPSB0aGlzLl9jYWNoZU9yZGVyaW5nWzBdO1xuICAgICAgICB0aGlzLnJlbW92ZShlYXJsaWVzdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVba2V5XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShrZXkpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2NhY2hlT3JkZXJpbmcuaW5kZXhPZihrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtrZXldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nID0gW107XG4gICAgfTtcblxuICAgIF9wcm90by5pc1ZhbGlkQ2FjaGVLZXkgPSBmdW5jdGlvbiBpc1ZhbGlkQ2FjaGVLZXkoY2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBpc1N0cmluZ09yTnVtYmVyKGNhY2hlS2V5KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZpZm9PYmplY3RDYWNoZTtcbiAgfSgpO1xuXG4gIHZhciBMcnVPYmplY3RDYWNoZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExydU9iamVjdENhY2hlKF90ZW1wKSB7XG4gICAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICAgIGNhY2hlU2l6ZSA9IF9yZWYuY2FjaGVTaXplO1xuXG4gICAgICB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpO1xuICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgIHRoaXMuX2NhY2hlT3JkZXJpbmcgPSBbXTtcbiAgICAgIHRoaXMuX2NhY2hlU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICB9XG5cbiAgICB2YXIgX3Byb3RvID0gTHJ1T2JqZWN0Q2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlW2tleV0gPSBzZWxlY3RvckZuO1xuXG4gICAgICB0aGlzLl9yZWdpc3RlckNhY2hlSGl0KGtleSk7XG5cbiAgICAgIGlmICh0aGlzLl9jYWNoZU9yZGVyaW5nLmxlbmd0aCA+IHRoaXMuX2NhY2hlU2l6ZSkge1xuICAgICAgICB2YXIgZWFybGllc3QgPSB0aGlzLl9jYWNoZU9yZGVyaW5nWzBdO1xuICAgICAgICB0aGlzLnJlbW92ZShlYXJsaWVzdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckNhY2hlSGl0KGtleSk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtrZXldO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdGhpcy5fZGVsZXRlQ2FjaGVIaXQoa2V5KTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlW2tleV07XG4gICAgfTtcblxuICAgIF9wcm90by5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgIHRoaXMuX2NhY2hlT3JkZXJpbmcgPSBbXTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZWdpc3RlckNhY2hlSGl0ID0gZnVuY3Rpb24gX3JlZ2lzdGVyQ2FjaGVIaXQoa2V5KSB7XG4gICAgICB0aGlzLl9kZWxldGVDYWNoZUhpdChrZXkpO1xuXG4gICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nLnB1c2goa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9kZWxldGVDYWNoZUhpdCA9IGZ1bmN0aW9uIF9kZWxldGVDYWNoZUhpdChrZXkpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX2NhY2hlT3JkZXJpbmcuaW5kZXhPZihrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5pc1ZhbGlkQ2FjaGVLZXkgPSBmdW5jdGlvbiBpc1ZhbGlkQ2FjaGVLZXkoY2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBpc1N0cmluZ09yTnVtYmVyKGNhY2hlS2V5KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIExydU9iamVjdENhY2hlO1xuICB9KCk7XG5cbiAgdmFyIEZsYXRNYXBDYWNoZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZsYXRNYXBDYWNoZSgpIHtcbiAgICAgIHRoaXMuX2NhY2hlID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGbGF0TWFwQ2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChrZXksIHNlbGVjdG9yRm4pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChrZXkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdGhpcy5fY2FjaGVbXCJkZWxldGVcIl0oa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmxhdE1hcENhY2hlO1xuICB9KCk7XG5cbiAgdmFyIEZpZm9NYXBDYWNoZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpZm9NYXBDYWNoZShfdGVtcCkge1xuICAgICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgICBjYWNoZVNpemUgPSBfcmVmLmNhY2hlU2l6ZTtcblxuICAgICAgdmFsaWRhdGVDYWNoZVNpemUoY2FjaGVTaXplKTtcbiAgICAgIHRoaXMuX2NhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fY2FjaGVTaXplID0gY2FjaGVTaXplO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGaWZvTWFwQ2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChrZXksIHNlbGVjdG9yRm4pO1xuXG4gICAgICBpZiAodGhpcy5fY2FjaGUuc2l6ZSA+IHRoaXMuX2NhY2hlU2l6ZSkge1xuICAgICAgICB2YXIgZWFybGllc3QgPSB0aGlzLl9jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlKGVhcmxpZXN0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShrZXkpIHtcbiAgICAgIHRoaXMuX2NhY2hlW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgfTtcblxuICAgIF9wcm90by5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZpZm9NYXBDYWNoZTtcbiAgfSgpO1xuXG4gIHZhciBMcnVNYXBDYWNoZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExydU1hcENhY2hlKF90ZW1wKSB7XG4gICAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICAgIGNhY2hlU2l6ZSA9IF9yZWYuY2FjaGVTaXplO1xuXG4gICAgICB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9jYWNoZVNpemUgPSBjYWNoZVNpemU7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IExydU1hcENhY2hlLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQoa2V5LCBzZWxlY3RvckZuKSB7XG4gICAgICB0aGlzLl9jYWNoZS5zZXQoa2V5LCBzZWxlY3RvckZuKTtcblxuICAgICAgaWYgKHRoaXMuX2NhY2hlLnNpemUgPiB0aGlzLl9jYWNoZVNpemUpIHtcbiAgICAgICAgdmFyIGVhcmxpZXN0ID0gdGhpcy5fY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgICB0aGlzLnJlbW92ZShlYXJsaWVzdCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTsgLy8gUmVnaXN0ZXIgY2FjaGUgaGl0XG5cblxuICAgICAgaWYgKHRoaXMuX2NhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGtleSk7XG5cbiAgICAgICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoa2V5KSB7XG4gICAgICB0aGlzLl9jYWNoZVtcImRlbGV0ZVwiXShrZXkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XG4gICAgfTtcblxuICAgIHJldHVybiBMcnVNYXBDYWNoZTtcbiAgfSgpO1xuXG4gIGV4cG9ydHMuRmlmb0NhY2hlT2JqZWN0ID0gRmlmb09iamVjdENhY2hlO1xuICBleHBvcnRzLkZpZm9NYXBDYWNoZSA9IEZpZm9NYXBDYWNoZTtcbiAgZXhwb3J0cy5GaWZvT2JqZWN0Q2FjaGUgPSBGaWZvT2JqZWN0Q2FjaGU7XG4gIGV4cG9ydHMuRmxhdENhY2hlT2JqZWN0ID0gRmxhdE9iamVjdENhY2hlO1xuICBleHBvcnRzLkZsYXRNYXBDYWNoZSA9IEZsYXRNYXBDYWNoZTtcbiAgZXhwb3J0cy5GbGF0T2JqZWN0Q2FjaGUgPSBGbGF0T2JqZWN0Q2FjaGU7XG4gIGV4cG9ydHMuTHJ1Q2FjaGVPYmplY3QgPSBMcnVNYXBDYWNoZTtcbiAgZXhwb3J0cy5McnVNYXBDYWNoZSA9IExydU1hcENhY2hlO1xuICBleHBvcnRzLkxydU9iamVjdENhY2hlID0gTHJ1T2JqZWN0Q2FjaGU7XG4gIGV4cG9ydHMuY3JlYXRlU3RydWN0dXJlZENhY2hlZFNlbGVjdG9yID0gY3JlYXRlU3RydWN0dXJlZENhY2hlZFNlbGVjdG9yO1xuICBleHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDYWNoZWRTZWxlY3RvcjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/re-reselect/dist/index.js\n");
+eval("(function (global, factory) {\n true ? factory(exports, __webpack_require__(/*! reselect */ \"./node_modules/reselect/lib/index.js\")) :\n undefined;\n}(this, (function (exports, reselect) { 'use strict';\n\n function isStringOrNumber(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n\n var FlatObjectCache = /*#__PURE__*/function () {\n function FlatObjectCache() {\n this._cache = {};\n }\n\n var _proto = FlatObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FlatObjectCache;\n }();\n\n var defaultCacheCreator = FlatObjectCache;\n\n var defaultCacheKeyValidator = function defaultCacheKeyValidator() {\n return true;\n };\n\n function createCachedSelector() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return function (polymorphicOptions, legacyOptions) {\n if (legacyOptions) {\n throw new Error('[re-reselect] \"options\" as second argument is not supported anymore. Please provide an option object as single argument.');\n }\n\n var options = typeof polymorphicOptions === 'function' ? {\n keySelector: polymorphicOptions\n } : Object.assign({}, polymorphicOptions); // https://github.com/reduxjs/reselect/blob/v4.0.0/src/index.js#L54\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : [].concat(funcs);\n\n var resultFuncWithRecomputations = function resultFuncWithRecomputations() {\n recomputations++;\n return resultFunc.apply(void 0, arguments);\n };\n\n funcs.push(resultFuncWithRecomputations);\n var cache = options.cacheObject || new defaultCacheCreator();\n var selectorCreator = options.selectorCreator || reselect.createSelector;\n var isValidCacheKey = cache.isValidCacheKey || defaultCacheKeyValidator;\n\n if (options.keySelectorCreator) {\n options.keySelector = options.keySelectorCreator({\n keySelector: options.keySelector,\n inputSelectors: dependencies,\n resultFunc: resultFunc\n });\n } // Application receives this function\n\n\n var selector = function selector() {\n var cacheKey = options.keySelector.apply(options, arguments);\n\n if (isValidCacheKey(cacheKey)) {\n var cacheResponse = cache.get(cacheKey);\n\n if (cacheResponse === undefined) {\n cacheResponse = selectorCreator.apply(void 0, funcs);\n cache.set(cacheKey, cacheResponse);\n }\n\n return cacheResponse.apply(void 0, arguments);\n }\n\n console.warn(\"[re-reselect] Invalid cache key \\\"\" + cacheKey + \"\\\" has been returned by keySelector function.\");\n return undefined;\n }; // Further selector methods\n\n\n selector.getMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments); // @NOTE It might update cache hit count in LRU-like caches\n\n return cache.get(cacheKey);\n };\n\n selector.removeMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments);\n cache.remove(cacheKey);\n };\n\n selector.clearCache = function () {\n cache.clear();\n };\n\n selector.resultFunc = resultFunc;\n selector.dependencies = dependencies;\n selector.cache = cache;\n\n selector.recomputations = function () {\n return recomputations;\n };\n\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n\n selector.keySelector = options.keySelector;\n return selector;\n };\n }\n\n function createStructuredCachedSelector(selectors) {\n return reselect.createStructuredSelector(selectors, createCachedSelector);\n }\n\n function validateCacheSize(cacheSize) {\n if (cacheSize === undefined) {\n throw new Error('Missing the required property \"cacheSize\".');\n }\n\n if (!Number.isInteger(cacheSize) || cacheSize <= 0) {\n throw new Error('The \"cacheSize\" property must be a positive integer value.');\n }\n }\n\n var FifoObjectCache = /*#__PURE__*/function () {\n function FifoObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._cacheOrdering.push(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FifoObjectCache;\n }();\n\n var LruObjectCache = /*#__PURE__*/function () {\n function LruObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._registerCacheHit(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n this._registerCacheHit(key);\n\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n this._deleteCacheHit(key);\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto._registerCacheHit = function _registerCacheHit(key) {\n this._deleteCacheHit(key);\n\n this._cacheOrdering.push(key);\n };\n\n _proto._deleteCacheHit = function _deleteCacheHit(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return LruObjectCache;\n }();\n\n var FlatMapCache = /*#__PURE__*/function () {\n function FlatMapCache() {\n this._cache = new Map();\n }\n\n var _proto = FlatMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FlatMapCache;\n }();\n\n var FifoMapCache = /*#__PURE__*/function () {\n function FifoMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FifoMapCache;\n }();\n\n var LruMapCache = /*#__PURE__*/function () {\n function LruMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n var value = this._cache.get(key); // Register cache hit\n\n\n if (this._cache.has(key)) {\n this.remove(key);\n\n this._cache.set(key, value);\n }\n\n return value;\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return LruMapCache;\n }();\n\n exports.FifoMapCache = FifoMapCache;\n exports.FifoObjectCache = FifoObjectCache;\n exports.FlatMapCache = FlatMapCache;\n exports.FlatObjectCache = FlatObjectCache;\n exports.LruMapCache = LruMapCache;\n exports.LruObjectCache = LruObjectCache;\n exports.createCachedSelector = createCachedSelector;\n exports.createStructuredCachedSelector = createStructuredCachedSelector;\n exports.default = createCachedSelector;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL25vZGVfbW9kdWxlcy9yZS1yZXNlbGVjdC9kaXN0L2luZGV4LmpzP2YyM2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxFQUFFLEtBQTRELG9CQUFvQixtQkFBTyxDQUFDLHNEQUFVO0FBQ3BHLEVBQUUsU0FDK0U7QUFDakYsQ0FBQyxzQ0FBc0M7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPLG1CQUFtQixzQkFBc0I7O0FBRWhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87OztBQUdQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLHFFQUFxRTs7QUFFckU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDOzs7QUFHdkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxjQUFjOztBQUU5RCxDQUFDO0FBQ0QiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmUtcmVzZWxlY3QvZGlzdC9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgncmVzZWxlY3QnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ3Jlc2VsZWN0J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbFsnUmUtcmVzZWxlY3QnXSA9IHt9LCBnbG9iYWwuUmVzZWxlY3QpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCByZXNlbGVjdCkgeyAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gaXNTdHJpbmdPck51bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH1cblxuICB2YXIgRmxhdE9iamVjdENhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGbGF0T2JqZWN0Q2FjaGUoKSB7XG4gICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGbGF0T2JqZWN0Q2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlW2tleV0gPSBzZWxlY3RvckZuO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW2tleV07XG4gICAgfTtcblxuICAgIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoa2V5KSB7XG4gICAgICBkZWxldGUgdGhpcy5fY2FjaGVba2V5XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgIH07XG5cbiAgICBfcHJvdG8uaXNWYWxpZENhY2hlS2V5ID0gZnVuY3Rpb24gaXNWYWxpZENhY2hlS2V5KGNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmdPck51bWJlcihjYWNoZUtleSk7XG4gICAgfTtcblxuICAgIHJldHVybiBGbGF0T2JqZWN0Q2FjaGU7XG4gIH0oKTtcblxuICB2YXIgZGVmYXVsdENhY2hlQ3JlYXRvciA9IEZsYXRPYmplY3RDYWNoZTtcblxuICB2YXIgZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yID0gZnVuY3Rpb24gZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlZFNlbGVjdG9yKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAocG9seW1vcnBoaWNPcHRpb25zLCBsZWdhY3lPcHRpb25zKSB7XG4gICAgICBpZiAobGVnYWN5T3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tyZS1yZXNlbGVjdF0gXCJvcHRpb25zXCIgYXMgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gUGxlYXNlIHByb3ZpZGUgYW4gb3B0aW9uIG9iamVjdCBhcyBzaW5nbGUgYXJndW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIHBvbHltb3JwaGljT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IHtcbiAgICAgICAga2V5U2VsZWN0b3I6IHBvbHltb3JwaGljT3B0aW9uc1xuICAgICAgfSA6IE9iamVjdC5hc3NpZ24oe30sIHBvbHltb3JwaGljT3B0aW9ucyk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3Jlc2VsZWN0L2Jsb2IvdjQuMC4wL3NyYy9pbmRleC5qcyNMNTRcblxuICAgICAgdmFyIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIHZhciByZXN1bHRGdW5jID0gZnVuY3MucG9wKCk7XG4gICAgICB2YXIgZGVwZW5kZW5jaWVzID0gQXJyYXkuaXNBcnJheShmdW5jc1swXSkgPyBmdW5jc1swXSA6IFtdLmNvbmNhdChmdW5jcyk7XG5cbiAgICAgIHZhciByZXN1bHRGdW5jV2l0aFJlY29tcHV0YXRpb25zID0gZnVuY3Rpb24gcmVzdWx0RnVuY1dpdGhSZWNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgcmVjb21wdXRhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIHJlc3VsdEZ1bmMuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfTtcblxuICAgICAgZnVuY3MucHVzaChyZXN1bHRGdW5jV2l0aFJlY29tcHV0YXRpb25zKTtcbiAgICAgIHZhciBjYWNoZSA9IG9wdGlvbnMuY2FjaGVPYmplY3QgfHwgbmV3IGRlZmF1bHRDYWNoZUNyZWF0b3IoKTtcbiAgICAgIHZhciBzZWxlY3RvckNyZWF0b3IgPSBvcHRpb25zLnNlbGVjdG9yQ3JlYXRvciB8fCByZXNlbGVjdC5jcmVhdGVTZWxlY3RvcjtcbiAgICAgIHZhciBpc1ZhbGlkQ2FjaGVLZXkgPSBjYWNoZS5pc1ZhbGlkQ2FjaGVLZXkgfHwgZGVmYXVsdENhY2hlS2V5VmFsaWRhdG9yO1xuXG4gICAgICBpZiAob3B0aW9ucy5rZXlTZWxlY3RvckNyZWF0b3IpIHtcbiAgICAgICAgb3B0aW9ucy5rZXlTZWxlY3RvciA9IG9wdGlvbnMua2V5U2VsZWN0b3JDcmVhdG9yKHtcbiAgICAgICAgICBrZXlTZWxlY3Rvcjogb3B0aW9ucy5rZXlTZWxlY3RvcixcbiAgICAgICAgICBpbnB1dFNlbGVjdG9yczogZGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHJlc3VsdEZ1bmM6IHJlc3VsdEZ1bmNcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIEFwcGxpY2F0aW9uIHJlY2VpdmVzIHRoaXMgZnVuY3Rpb25cblxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBmdW5jdGlvbiBzZWxlY3RvcigpIHtcbiAgICAgICAgdmFyIGNhY2hlS2V5ID0gb3B0aW9ucy5rZXlTZWxlY3Rvci5hcHBseShvcHRpb25zLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkQ2FjaGVLZXkoY2FjaGVLZXkpKSB7XG4gICAgICAgICAgdmFyIGNhY2hlUmVzcG9uc2UgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuXG4gICAgICAgICAgaWYgKGNhY2hlUmVzcG9uc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVSZXNwb25zZSA9IHNlbGVjdG9yQ3JlYXRvci5hcHBseSh2b2lkIDAsIGZ1bmNzKTtcbiAgICAgICAgICAgIGNhY2hlLnNldChjYWNoZUtleSwgY2FjaGVSZXNwb25zZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNhY2hlUmVzcG9uc2UuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKFwiW3JlLXJlc2VsZWN0XSBJbnZhbGlkIGNhY2hlIGtleSBcXFwiXCIgKyBjYWNoZUtleSArIFwiXFxcIiBoYXMgYmVlbiByZXR1cm5lZCBieSBrZXlTZWxlY3RvciBmdW5jdGlvbi5cIik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9OyAvLyBGdXJ0aGVyIHNlbGVjdG9yIG1ldGhvZHNcblxuXG4gICAgICBzZWxlY3Rvci5nZXRNYXRjaGluZ1NlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBvcHRpb25zLmtleVNlbGVjdG9yLmFwcGx5KG9wdGlvbnMsIGFyZ3VtZW50cyk7IC8vIEBOT1RFIEl0IG1pZ2h0IHVwZGF0ZSBjYWNoZSBoaXQgY291bnQgaW4gTFJVLWxpa2UgY2FjaGVzXG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICB9O1xuXG4gICAgICBzZWxlY3Rvci5yZW1vdmVNYXRjaGluZ1NlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBvcHRpb25zLmtleVNlbGVjdG9yLmFwcGx5KG9wdGlvbnMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNhY2hlLnJlbW92ZShjYWNoZUtleSk7XG4gICAgICB9O1xuXG4gICAgICBzZWxlY3Rvci5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWNoZS5jbGVhcigpO1xuICAgICAgfTtcblxuICAgICAgc2VsZWN0b3IucmVzdWx0RnVuYyA9IHJlc3VsdEZ1bmM7XG4gICAgICBzZWxlY3Rvci5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICBzZWxlY3Rvci5jYWNoZSA9IGNhY2hlO1xuXG4gICAgICBzZWxlY3Rvci5yZWNvbXB1dGF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlY29tcHV0YXRpb25zO1xuICAgICAgfTtcblxuICAgICAgc2VsZWN0b3IucmVzZXRSZWNvbXB1dGF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH07XG5cbiAgICAgIHNlbGVjdG9yLmtleVNlbGVjdG9yID0gb3B0aW9ucy5rZXlTZWxlY3RvcjtcbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlZENhY2hlZFNlbGVjdG9yKHNlbGVjdG9ycykge1xuICAgIHJldHVybiByZXNlbGVjdC5jcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3Ioc2VsZWN0b3JzLCBjcmVhdGVDYWNoZWRTZWxlY3Rvcik7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpIHtcbiAgICBpZiAoY2FjaGVTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0aGUgcmVxdWlyZWQgcHJvcGVydHkgXCJjYWNoZVNpemVcIi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY2FjaGVTaXplKSB8fCBjYWNoZVNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJjYWNoZVNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgRmlmb09iamVjdENhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaWZvT2JqZWN0Q2FjaGUoX3RlbXApIHtcbiAgICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgICAgY2FjaGVTaXplID0gX3JlZi5jYWNoZVNpemU7XG5cbiAgICAgIHZhbGlkYXRlQ2FjaGVTaXplKGNhY2hlU2l6ZSk7XG4gICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgICAgdGhpcy5fY2FjaGVPcmRlcmluZyA9IFtdO1xuICAgICAgdGhpcy5fY2FjaGVTaXplID0gY2FjaGVTaXplO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGaWZvT2JqZWN0Q2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlW2tleV0gPSBzZWxlY3RvckZuO1xuXG4gICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nLnB1c2goa2V5KTtcblxuICAgICAgaWYgKHRoaXMuX2NhY2hlT3JkZXJpbmcubGVuZ3RoID4gdGhpcy5fY2FjaGVTaXplKSB7XG4gICAgICAgIHZhciBlYXJsaWVzdCA9IHRoaXMuX2NhY2hlT3JkZXJpbmdbMF07XG4gICAgICAgIHRoaXMucmVtb3ZlKGVhcmxpZXN0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtrZXldO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fY2FjaGVPcmRlcmluZy5pbmRleE9mKGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlT3JkZXJpbmcuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlW2tleV07XG4gICAgfTtcblxuICAgIF9wcm90by5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICAgIHRoaXMuX2NhY2hlT3JkZXJpbmcgPSBbXTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmlzVmFsaWRDYWNoZUtleSA9IGZ1bmN0aW9uIGlzVmFsaWRDYWNoZUtleShjYWNoZUtleSkge1xuICAgICAgcmV0dXJuIGlzU3RyaW5nT3JOdW1iZXIoY2FjaGVLZXkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmlmb09iamVjdENhY2hlO1xuICB9KCk7XG5cbiAgdmFyIExydU9iamVjdENhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMcnVPYmplY3RDYWNoZShfdGVtcCkge1xuICAgICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgICBjYWNoZVNpemUgPSBfcmVmLmNhY2hlU2l6ZTtcblxuICAgICAgdmFsaWRhdGVDYWNoZVNpemUoY2FjaGVTaXplKTtcbiAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nID0gW107XG4gICAgICB0aGlzLl9jYWNoZVNpemUgPSBjYWNoZVNpemU7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IExydU9iamVjdENhY2hlLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQoa2V5LCBzZWxlY3RvckZuKSB7XG4gICAgICB0aGlzLl9jYWNoZVtrZXldID0gc2VsZWN0b3JGbjtcblxuICAgICAgdGhpcy5fcmVnaXN0ZXJDYWNoZUhpdChrZXkpO1xuXG4gICAgICBpZiAodGhpcy5fY2FjaGVPcmRlcmluZy5sZW5ndGggPiB0aGlzLl9jYWNoZVNpemUpIHtcbiAgICAgICAgdmFyIGVhcmxpZXN0ID0gdGhpcy5fY2FjaGVPcmRlcmluZ1swXTtcbiAgICAgICAgdGhpcy5yZW1vdmUoZWFybGllc3QpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJDYWNoZUhpdChrZXkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVba2V5XTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShrZXkpIHtcbiAgICAgIHRoaXMuX2RlbGV0ZUNhY2hlSGl0KGtleSk7XG5cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtrZXldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICB0aGlzLl9jYWNoZU9yZGVyaW5nID0gW107XG4gICAgfTtcblxuICAgIF9wcm90by5fcmVnaXN0ZXJDYWNoZUhpdCA9IGZ1bmN0aW9uIF9yZWdpc3RlckNhY2hlSGl0KGtleSkge1xuICAgICAgdGhpcy5fZGVsZXRlQ2FjaGVIaXQoa2V5KTtcblxuICAgICAgdGhpcy5fY2FjaGVPcmRlcmluZy5wdXNoKGtleSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fZGVsZXRlQ2FjaGVIaXQgPSBmdW5jdGlvbiBfZGVsZXRlQ2FjaGVIaXQoa2V5KSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9jYWNoZU9yZGVyaW5nLmluZGV4T2Yoa2V5KTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVPcmRlcmluZy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uaXNWYWxpZENhY2hlS2V5ID0gZnVuY3Rpb24gaXNWYWxpZENhY2hlS2V5KGNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmdPck51bWJlcihjYWNoZUtleSk7XG4gICAgfTtcblxuICAgIHJldHVybiBMcnVPYmplY3RDYWNoZTtcbiAgfSgpO1xuXG4gIHZhciBGbGF0TWFwQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZsYXRNYXBDYWNoZSgpIHtcbiAgICAgIHRoaXMuX2NhY2hlID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBGbGF0TWFwQ2FjaGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChrZXksIHNlbGVjdG9yRm4pIHtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChrZXksIHNlbGVjdG9yRm4pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChrZXkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdGhpcy5fY2FjaGVbXCJkZWxldGVcIl0oa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmxhdE1hcENhY2hlO1xuICB9KCk7XG5cbiAgdmFyIEZpZm9NYXBDYWNoZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmlmb01hcENhY2hlKF90ZW1wKSB7XG4gICAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICAgIGNhY2hlU2l6ZSA9IF9yZWYuY2FjaGVTaXplO1xuXG4gICAgICB2YWxpZGF0ZUNhY2hlU2l6ZShjYWNoZVNpemUpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9jYWNoZVNpemUgPSBjYWNoZVNpemU7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90byA9IEZpZm9NYXBDYWNoZS5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KGtleSwgc2VsZWN0b3JGbikge1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgc2VsZWN0b3JGbik7XG5cbiAgICAgIGlmICh0aGlzLl9jYWNoZS5zaXplID4gdGhpcy5fY2FjaGVTaXplKSB7XG4gICAgICAgIHZhciBlYXJsaWVzdCA9IHRoaXMuX2NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICAgICAgdGhpcy5yZW1vdmUoZWFybGllc3QpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChrZXkpO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdGhpcy5fY2FjaGVbXCJkZWxldGVcIl0oa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmlmb01hcENhY2hlO1xuICB9KCk7XG5cbiAgdmFyIExydU1hcENhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMcnVNYXBDYWNoZShfdGVtcCkge1xuICAgICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgICBjYWNoZVNpemUgPSBfcmVmLmNhY2hlU2l6ZTtcblxuICAgICAgdmFsaWRhdGVDYWNoZVNpemUoY2FjaGVTaXplKTtcbiAgICAgIHRoaXMuX2NhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fY2FjaGVTaXplID0gY2FjaGVTaXplO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBMcnVNYXBDYWNoZS5wcm90b3R5cGU7XG5cbiAgICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KGtleSwgc2VsZWN0b3JGbikge1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgc2VsZWN0b3JGbik7XG5cbiAgICAgIGlmICh0aGlzLl9jYWNoZS5zaXplID4gdGhpcy5fY2FjaGVTaXplKSB7XG4gICAgICAgIHZhciBlYXJsaWVzdCA9IHRoaXMuX2NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICAgICAgdGhpcy5yZW1vdmUoZWFybGllc3QpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fY2FjaGUuZ2V0KGtleSk7IC8vIFJlZ2lzdGVyIGNhY2hlIGhpdFxuXG5cbiAgICAgIGlmICh0aGlzLl9jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLnJlbW92ZShrZXkpO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKGtleSkge1xuICAgICAgdGhpcy5fY2FjaGVbXCJkZWxldGVcIl0oa2V5KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTHJ1TWFwQ2FjaGU7XG4gIH0oKTtcblxuICBleHBvcnRzLkZpZm9NYXBDYWNoZSA9IEZpZm9NYXBDYWNoZTtcbiAgZXhwb3J0cy5GaWZvT2JqZWN0Q2FjaGUgPSBGaWZvT2JqZWN0Q2FjaGU7XG4gIGV4cG9ydHMuRmxhdE1hcENhY2hlID0gRmxhdE1hcENhY2hlO1xuICBleHBvcnRzLkZsYXRPYmplY3RDYWNoZSA9IEZsYXRPYmplY3RDYWNoZTtcbiAgZXhwb3J0cy5McnVNYXBDYWNoZSA9IExydU1hcENhY2hlO1xuICBleHBvcnRzLkxydU9iamVjdENhY2hlID0gTHJ1T2JqZWN0Q2FjaGU7XG4gIGV4cG9ydHMuY3JlYXRlQ2FjaGVkU2VsZWN0b3IgPSBjcmVhdGVDYWNoZWRTZWxlY3RvcjtcbiAgZXhwb3J0cy5jcmVhdGVTdHJ1Y3R1cmVkQ2FjaGVkU2VsZWN0b3IgPSBjcmVhdGVTdHJ1Y3R1cmVkQ2FjaGVkU2VsZWN0b3I7XG4gIGV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNhY2hlZFNlbGVjdG9yO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/re-reselect/dist/index.js\n");
/***/ }),
@@ -4450,7 +4472,7 @@ eval("\n\nexports.__esModule = true;\nexports.defaultMemoize = defaultMemoize;\n
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Session__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Session */ \"./src/Session.js\");\n/* harmony import */ var _QuerySet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./QuerySet */ \"./src/QuerySet.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fields */ \"./src/fields/index.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fields/OneToOne */ \"./src/fields/OneToOne.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n\n\n\n\n\n\n/**\n * Generates a query specification to get the instance's\n * corresponding table row using its primary key.\n *\n * @private\n * @returns {Object}\n */\n\nfunction getByIdQuery(modelInstance) {\n const modelClass = modelInstance.getClass();\n const {\n idAttribute,\n modelName\n } = modelClass;\n return {\n table: modelName,\n clauses: [{\n type: _constants__WEBPACK_IMPORTED_MODULE_7__[\"FILTER\"],\n payload: {\n [idAttribute]: modelInstance.getId()\n }\n }]\n };\n}\n/**\n * The heart of an ORM, the data model.\n *\n * The fields you specify to the Model will be used to generate\n * a schema to the database, related property accessors, and\n * possibly through models.\n *\n * In each {@link Session} you instantiate from an {@link ORM} instance,\n * you will receive a session-specific subclass of this Model. The methods\n * you define here will be available to you in sessions.\n *\n * An instance of {@link Model} represents a record in the database, though\n * it is possible to generate multiple instances from the same record in the database.\n *\n * To create data models in your schema, subclass {@link Model}. To define\n * information about the data model, override static class methods. Define instance\n * logic by defining prototype methods (without `static` keyword).\n */\n\n\nconst Model = /*#__PURE__*/function () {\n /**\n * Creates a Model instance from it's properties.\n * Don't use this to create a new record; Use the static method {@link Model#create}.\n * @param {Object} props - the properties to instantiate with\n */\n function Model(props) {\n this._initFields(props);\n }\n\n var _proto = Model.prototype;\n\n _proto._initFields = function _initFields(props) {\n const propsObj = Object(props);\n this._fields = { ...propsObj\n };\n Object.keys(propsObj).forEach(fieldName => {\n // In this case, we got a prop that wasn't defined as a field.\n // Assuming it's an arbitrary data field, making an instance-specific\n // descriptor for it.\n // Using the in operator as the property could be defined anywhere\n // on the prototype chain.\n if (!(fieldName in this)) {\n Object.defineProperty(this, fieldName, {\n get: () => this._fields[fieldName],\n set: value => this.set(fieldName, value),\n configurable: true,\n enumerable: true\n });\n }\n });\n };\n\n Model.toString = function toString() {\n return `ModelClass: ${this.modelName}`;\n }\n /**\n * Returns the options object passed to the database for the table that represents\n * this Model class.\n *\n * Returns an empty object by default, which means the database\n * will use default options. You can either override this function to return the options\n * you want to use, or assign the options object as a static property of the same name to the\n * Model class.\n *\n * @return {Object} the options object passed to the database for the table\n * representing this Model class.\n */\n ;\n\n Model.options = function options() {\n return {};\n }\n /**\n * Manually mark individual instances as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<*>} ids - Array of primary key values\n * @return {undefined}\n */\n ;\n\n Model.markAccessed = function markAccessed(ids) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markAccessed\\` instead.`].join(\"\"));\n }\n\n this.session.markAccessed(this.modelName, ids);\n }\n /**\n * Manually mark this model's table as scanned.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @return {undefined}\n */\n ;\n\n Model.markFullTableScanned = function markFullTableScanned() {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markFullTableScanned\\` instead.`].join(\"\"));\n }\n\n this.session.markFullTableScanned(this.modelName);\n }\n /**\n * Manually mark indexes as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<Array.<*,*>>} indexes - Array of column-value pairs\n * @return {undefined}\n */\n ;\n\n Model.markAccessedIndexes = function markAccessedIndexes(indexes) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markAccessedIndexes\\` instead.`].join(\"\"));\n }\n\n this.session.markAccessedIndexes(indexes.map(([attribute, value]) => [this.modelName, attribute, value]));\n }\n /**\n * Returns the id attribute of this {@link Model}.\n *\n * @return {string} The id attribute of this {@link Model}.\n */\n ;\n\n /**\n * Connect the model class to a {@link Session}.\n *\n * @private\n * @param {Session} session - The session to connect to.\n */\n Model.connect = function connect(session) {\n if (!(session instanceof _Session__WEBPACK_IMPORTED_MODULE_1__[\"default\"])) {\n throw new Error(\"A model can only be connected to instances of Session.\");\n }\n\n this._session = session;\n }\n /**\n * Get the current {@link Session} instance.\n *\n * @private\n * @return {Session} The current {@link Session} instance.\n */\n ;\n\n /**\n * Returns an instance of the model's `querySetClass` field.\n * By default, this will be an empty {@link QuerySet}.\n *\n * @return {Object} An instance of the model's `querySetClass`.\n */\n Model.getQuerySet = function getQuerySet() {\n const {\n querySetClass: QuerySetClass\n } = this;\n return new QuerySetClass(this);\n }\n /**\n * @return {undefined}\n */\n ;\n\n Model.invalidateClassCache = function invalidateClassCache() {\n this.isSetUp = undefined;\n this.virtualFields = {};\n }\n /**\n * @see {@link Model.getQuerySet}\n */\n ;\n\n /**\n * Returns parameters to be passed to {@link Table} instance.\n *\n * @private\n */\n Model.tableOptions = function tableOptions() {\n if (typeof this.backend === \"function\") {\n Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"warnDeprecated\"])(\"`Model.backend` has been deprecated. Please rename to `.options`.\");\n return this.backend();\n }\n\n if (this.backend) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"warnDeprecated\"])(\"`Model.backend` has been deprecated. Please rename to `.options`.\");\n return this.backend;\n }\n\n if (typeof this.options === \"function\") {\n return this.options();\n }\n\n return this.options;\n }\n /**\n * Creates a new record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the new {@link Model}'s properties.\n * @return {Model} a new {@link Model} instance.\n */\n ;\n\n Model.create = function create(userProps) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to create a ${this.modelName} model instance without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].create\\` instead.`].join(\"\"));\n }\n\n const props = { ...userProps\n };\n const m2mRelations = {};\n const declaredFieldNames = Object.keys(this.fields);\n const declaredVirtualFieldNames = Object.keys(this.virtualFields);\n declaredFieldNames.forEach(key => {\n const field = this.fields[key];\n const valuePassed = userProps.hasOwnProperty(key);\n\n if (!(field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"])) {\n if (valuePassed) {\n const value = userProps[key];\n props[key] = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"])(value);\n } else if (field.getDefault) {\n props[key] = field.getDefault();\n }\n } else if (valuePassed) {\n // Save for later processing\n m2mRelations[key] = userProps[key];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete props[key];\n }\n }\n }); // add backward many-many if required\n\n declaredVirtualFieldNames.forEach(key => {\n if (!m2mRelations.hasOwnProperty(key)) {\n const field = this.virtualFields[key];\n\n if (userProps.hasOwnProperty(key) && field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // If a value is supplied for a ManyToMany field,\n // discard them from props and save for later processing.\n m2mRelations[key] = userProps[key];\n delete props[key];\n }\n }\n });\n const newEntry = this.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"CREATE\"],\n table: this.modelName,\n payload: props\n });\n const ThisModel = this;\n const instance = new ThisModel(newEntry);\n\n instance._refreshMany2Many(m2mRelations); // eslint-disable-line no-underscore-dangle\n\n\n return instance;\n }\n /**\n * Creates a new or update existing record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the required {@link Model}'s properties.\n * @return {Model} a {@link Model} instance.\n */\n ;\n\n Model.upsert = function upsert(userProps) {\n if (typeof this.session === \"undefined\") {\n throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].upsert\\` instead.`].join(\"\"));\n }\n\n const {\n idAttribute\n } = this;\n\n if (userProps.hasOwnProperty(idAttribute)) {\n const id = userProps[idAttribute];\n\n if (this.idExists(id)) {\n const model = this.withId(id);\n model.update(userProps);\n return model;\n }\n }\n\n return this.create(userProps);\n }\n /**\n * Returns a {@link Model} instance for the object with id `id`.\n * Returns `null` if the model has no instance with id `id`.\n *\n * You can use {@link Model#idExists} to check for existence instead.\n *\n * @param {*} id - the `id` of the object to get\n * @throws If object with id `id` doesn't exist\n * @return {Model|null} {@link Model} instance with id `id`\n */\n ;\n\n Model.withId = function withId(id) {\n return this.get({\n [this.idAttribute]: id\n });\n }\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n *\n * @since 0.11.0\n */\n ;\n\n Model.idExists = function idExists(id) {\n return this.exists({\n [this.idAttribute]: id\n });\n }\n /**\n * Returns a boolean indicating if an entity\n * with the given props exists in the state.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n */\n ;\n\n Model.exists = function exists(lookupObj) {\n if (typeof this.session === \"undefined\") {\n throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].exists\\` instead.`].join(\"\"));\n }\n\n return Boolean(this._findDatabaseRows(lookupObj).length);\n }\n /**\n * Gets the {@link Model} instance that matches properties in `lookupObj`.\n * Throws an error if {@link Model} if multiple records match\n * the properties.\n *\n * @param {Object} lookupObj - the properties used to match a single entity.\n * @throws {Error} If more than one entity matches the properties in `lookupObj`.\n * @return {Model} a {@link Model} instance that matches the properties in `lookupObj`.\n */\n ;\n\n Model.get = function get(lookupObj) {\n const ThisModel = this;\n\n const rows = this._findDatabaseRows(lookupObj);\n\n if (rows.length === 0) {\n return null;\n }\n\n if (rows.length > 1) {\n throw new Error(`Expected to find a single row in \\`${this.modelName}.get\\`. Found ${rows.length}.`);\n }\n\n return new ThisModel(rows[0]);\n }\n /**\n * Gets the {@link Model} class or subclass constructor (the class that\n * instantiated this instance).\n *\n * @return {Model} The {@link Model} class or subclass constructor used to instantiate\n * this instance.\n */\n ;\n\n _proto.getClass = function getClass() {\n return this.constructor;\n }\n /**\n * Gets the id value of the current instance by looking up the id attribute.\n * @return {*} The id value of the current instance.\n */\n ;\n\n _proto.getId = function getId() {\n return this._fields[this.getClass().idAttribute];\n }\n /**\n * Returns a reference to the plain JS object in the store.\n * It contains all the properties that you pass when creating the model,\n * except for primary keys of many-to-many relationships with a custom accessor.\n *\n * Make sure never to mutate this.\n *\n * @return {Object} a reference to the plain JS object in the store\n */\n ;\n\n /**\n * Finds all rows in this model's table that match the given `lookupObj`.\n * If no `lookupObj` is passed, all rows in the model's table will be returned.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n * @private\n */\n Model._findDatabaseRows = function _findDatabaseRows(lookupObj) {\n const querySpec = {\n table: this.modelName\n };\n\n if (lookupObj) {\n querySpec.clauses = [{\n type: _constants__WEBPACK_IMPORTED_MODULE_7__[\"FILTER\"],\n payload: lookupObj\n }];\n }\n\n return this.session.query(querySpec).rows;\n }\n /**\n * Returns a string representation of the {@link Model} instance.\n *\n * @return {string} A string representation of this {@link Model} instance.\n */\n ;\n\n _proto.toString = function toString() {\n const ThisModel = this.getClass();\n const className = ThisModel.modelName;\n const fieldNames = Object.keys(ThisModel.fields);\n const fields = fieldNames.map(fieldName => {\n const field = ThisModel.fields[fieldName];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n const ids = this[fieldName].toModelArray().map(model => model.getId());\n return `${fieldName}: [${ids.join(\", \")}]`;\n }\n\n const val = this._fields[fieldName];\n return `${fieldName}: ${val}`;\n }).join(\", \");\n return `${className}: {${fields}}`;\n }\n /**\n * Returns a boolean indicating if `otherModel` equals this {@link Model} instance.\n * Equality is determined by shallow comparing their attributes.\n *\n * This equality is used when you call {@link Model#update}.\n * You can prevent model updates by returning `true` here.\n * However, a model will always be updated if its relationships are changed.\n *\n * @param {Model} otherModel - a {@link Model} instance to compare\n * @return {Boolean} a boolean indicating if the {@link Model} instance's are equal.\n */\n ;\n\n _proto.equals = function equals(otherModel) {\n // eslint-disable-next-line no-underscore-dangle\n return Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"objectShallowEquals\"])(this._fields, otherModel._fields);\n }\n /**\n * Updates a property name to given value for this {@link Model} instance.\n * The values are immediately committed to the database.\n *\n * @param {string} propertyName - name of the property to set\n * @param {*} value - value assigned to the property\n * @return {undefined}\n */\n ;\n\n _proto.set = function set(propertyName, value) {\n this.update({\n [propertyName]: value\n });\n }\n /**\n * Assigns multiple fields and corresponding values to this {@link Model} instance.\n * The updates are immediately committed to the database.\n *\n * @param {Object} userMergeObj - an object that will be merged with this instance.\n * @return {undefined}\n */\n ;\n\n _proto.update = function update(userMergeObj) {\n const ThisModel = this.getClass();\n\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error([`Tried to update a ${ThisModel.modelName} model instance without a session. `, \"You cannot call `.update` on an instance that you did not receive from the database.\"].join(\"\"));\n }\n\n const mergeObj = { ...userMergeObj\n };\n const {\n fields,\n virtualFields\n } = ThisModel;\n const m2mRelations = {}; // If an array of entities or id's is supplied for a\n // many-to-many related field, clear the old relations\n // and add the new ones.\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (const mergeKey in mergeObj) {\n const isRealField = fields.hasOwnProperty(mergeKey);\n\n if (isRealField) {\n const field = fields[mergeKey];\n\n if (field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__[\"default\"] || field instanceof _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n // update one-one/fk relations\n mergeObj[mergeKey] = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"])(mergeObj[mergeKey]);\n } else if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // field is forward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete mergeObj[mergeKey];\n }\n }\n } else if (virtualFields.hasOwnProperty(mergeKey)) {\n const field = virtualFields[mergeKey];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // field is backward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n delete mergeObj[mergeKey];\n }\n }\n }\n\n const mergedFields = { ...this._fields,\n ...mergeObj\n };\n const updatedModel = new ThisModel(mergedFields); // only update fields if they have changed (referentially)\n\n if (!this.equals(updatedModel)) {\n this._initFields(mergedFields);\n\n ThisModel.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"UPDATE\"],\n query: getByIdQuery(this),\n payload: mergeObj\n });\n } // update virtual fields\n\n\n this._refreshMany2Many(m2mRelations);\n }\n /**\n * Updates {@link Model} instance attributes to reflect the\n * database state in the current session.\n * @return {undefined}\n */\n ;\n\n _proto.refreshFromState = function refreshFromState() {\n this._initFields(this.ref);\n }\n /**\n * Deletes the record for this {@link Model} instance.\n * You'll still be able to access fields and values on the instance.\n *\n * @return {undefined}\n */\n ;\n\n _proto.delete = function _delete() {\n const ThisModel = this.getClass();\n\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error([`Tried to delete a ${ThisModel.modelName} model instance without a session. `, \"You cannot call `.delete` on an instance that you did not receive from the database.\"].join(\"\"));\n }\n\n this._onDelete();\n\n ThisModel.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"DELETE\"],\n query: getByIdQuery(this)\n });\n }\n /**\n * Update many-many relations for model.\n * @param relations\n * @return undefined\n * @private\n */\n ;\n\n _proto._refreshMany2Many = function _refreshMany2Many(relations) {\n const ThisModel = this.getClass();\n const {\n fields,\n virtualFields,\n modelName\n } = ThisModel;\n Object.keys(relations).forEach(name => {\n const reverse = !fields.hasOwnProperty(name);\n const field = virtualFields[name];\n const values = relations[name];\n\n if (!Array.isArray(values)) {\n throw new TypeError(`Failed to resolve many-to-many relationship: ${modelName}[${name}] must be an array (passed: ${values})`);\n }\n\n const normalizedNewIds = values.map(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"]);\n const uniqueIds = [...new Set(normalizedNewIds)];\n\n if (normalizedNewIds.length !== uniqueIds.length) {\n throw new Error(`Found duplicate id(s) when passing \"${normalizedNewIds}\" to ${ThisModel.modelName}.${name} value`);\n }\n\n const throughModelName = field.through || Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"m2mName\"])(ThisModel.modelName, name);\n const ThroughModel = ThisModel.session[throughModelName];\n let fromField;\n let toField;\n\n if (!reverse) {\n ({\n from: fromField,\n to: toField\n } = field.throughFields);\n } else {\n ({\n from: toField,\n to: fromField\n } = field.throughFields);\n }\n\n const currentIds = ThroughModel.filter(through => through[fromField] === this[ThisModel.idAttribute]).toRefArray().map(ref => ref[toField]);\n const diffActions = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"arrayDiffActions\"])(currentIds, normalizedNewIds);\n\n if (diffActions) {\n const {\n delete: idsToDelete,\n add: idsToAdd\n } = diffActions;\n\n if (idsToDelete.length > 0) {\n this[field.as || name].remove(...idsToDelete);\n }\n\n if (idsToAdd.length > 0) {\n this[field.as || name].add(...idsToAdd);\n }\n }\n });\n }\n /**\n * @return {undefined}\n * @private\n */\n ;\n\n _proto._onDelete = function _onDelete() {\n const {\n virtualFields\n } = this.getClass(); // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (const key in virtualFields) {\n const field = virtualFields[key];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // Delete any many-to-many rows the entity is included in.\n const descriptorKey = field.as || key;\n this[descriptorKey].clear();\n } else if (field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n const relatedQs = this[key];\n\n if (relatedQs.exists()) {\n relatedQs.update({\n [field.relatedName]: null\n });\n }\n } else if (field instanceof _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n // Set null to any foreign keys or one to ones pointed to\n // this instance.\n if (this[key] !== null) {\n this[key][field.relatedName] = null;\n }\n }\n }\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n * @deprecated Please use {@link Model.idExists} instead.\n */\n ;\n\n Model.hasId = function hasId(id) {\n console.warn(\"`Model.hasId` has been deprecated. Please use `Model.idExists` instead.\");\n return this.idExists(id);\n }\n /**\n * @deprecated See the 0.9 migration guide on the GitHub repo.\n * @throws {Error} Due to deprecation.\n */\n ;\n\n _proto.getNextState = function getNextState() {\n throw new Error(\"`Model.prototype.getNextState` has been removed. See the 0.9 \" + \"migration guide on the GitHub repo.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Model, [{\n key: \"ref\",\n get: function () {\n const ThisModel = this.getClass(); // eslint-disable-next-line no-underscore-dangle\n\n return ThisModel._findDatabaseRows({\n [ThisModel.idAttribute]: this.getId()\n })[0];\n }\n }], [{\n key: \"idAttribute\",\n get: function () {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `, \"Create a session using `session = orm.session()` and access \", `\\`session[\"${this.modelName}\"].idAttribute\\` instead.`].join(\"\"));\n }\n\n return this.session.db.describe(this.modelName).idAttribute;\n }\n }, {\n key: \"session\",\n get: function () {\n return this._session;\n }\n }, {\n key: \"query\",\n get: function () {\n return this.getQuerySet();\n }\n }]);\n\n return Model;\n}();\n\nModel.fields = {\n id: Object(_fields__WEBPACK_IMPORTED_MODULE_3__[\"attr\"])()\n};\nModel.virtualFields = {};\nModel.querySetClass = _QuerySet__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (Model);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9Nb2RlbC5qcz9mYzVkIl0sIm5hbWVzIjpbImdldEJ5SWRRdWVyeSIsIm1vZGVsSW5zdGFuY2UiLCJtb2RlbENsYXNzIiwiZ2V0Q2xhc3MiLCJpZEF0dHJpYnV0ZSIsIm1vZGVsTmFtZSIsInRhYmxlIiwiY2xhdXNlcyIsInR5cGUiLCJGSUxURVIiLCJwYXlsb2FkIiwiZ2V0SWQiLCJNb2RlbCIsInByb3BzIiwiX2luaXRGaWVsZHMiLCJwcm9wc09iaiIsIk9iamVjdCIsIl9maWVsZHMiLCJrZXlzIiwiZm9yRWFjaCIsImZpZWxkTmFtZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwidG9TdHJpbmciLCJvcHRpb25zIiwibWFya0FjY2Vzc2VkIiwiaWRzIiwiX3Nlc3Npb24iLCJFcnJvciIsImpvaW4iLCJzZXNzaW9uIiwibWFya0Z1bGxUYWJsZVNjYW5uZWQiLCJtYXJrQWNjZXNzZWRJbmRleGVzIiwiaW5kZXhlcyIsIm1hcCIsImF0dHJpYnV0ZSIsImNvbm5lY3QiLCJTZXNzaW9uIiwiZ2V0UXVlcnlTZXQiLCJxdWVyeVNldENsYXNzIiwiUXVlcnlTZXRDbGFzcyIsImludmFsaWRhdGVDbGFzc0NhY2hlIiwiaXNTZXRVcCIsInVuZGVmaW5lZCIsInZpcnR1YWxGaWVsZHMiLCJ0YWJsZU9wdGlvbnMiLCJiYWNrZW5kIiwid2FybkRlcHJlY2F0ZWQiLCJjcmVhdGUiLCJ1c2VyUHJvcHMiLCJtMm1SZWxhdGlvbnMiLCJkZWNsYXJlZEZpZWxkTmFtZXMiLCJmaWVsZHMiLCJkZWNsYXJlZFZpcnR1YWxGaWVsZE5hbWVzIiwia2V5IiwiZmllbGQiLCJ2YWx1ZVBhc3NlZCIsImhhc093blByb3BlcnR5IiwiTWFueVRvTWFueSIsIm5vcm1hbGl6ZUVudGl0eSIsImdldERlZmF1bHQiLCJhcyIsIm5ld0VudHJ5IiwiYXBwbHlVcGRhdGUiLCJhY3Rpb24iLCJDUkVBVEUiLCJUaGlzTW9kZWwiLCJpbnN0YW5jZSIsIl9yZWZyZXNoTWFueTJNYW55IiwidXBzZXJ0IiwiaWQiLCJpZEV4aXN0cyIsIm1vZGVsIiwid2l0aElkIiwidXBkYXRlIiwiZXhpc3RzIiwibG9va3VwT2JqIiwiQm9vbGVhbiIsIl9maW5kRGF0YWJhc2VSb3dzIiwibGVuZ3RoIiwicm93cyIsImNvbnN0cnVjdG9yIiwicXVlcnlTcGVjIiwicXVlcnkiLCJjbGFzc05hbWUiLCJmaWVsZE5hbWVzIiwidG9Nb2RlbEFycmF5IiwidmFsIiwiZXF1YWxzIiwib3RoZXJNb2RlbCIsIm9iamVjdFNoYWxsb3dFcXVhbHMiLCJwcm9wZXJ0eU5hbWUiLCJ1c2VyTWVyZ2VPYmoiLCJtZXJnZU9iaiIsIm1lcmdlS2V5IiwiaXNSZWFsRmllbGQiLCJGb3JlaWduS2V5IiwiT25lVG9PbmUiLCJtZXJnZWRGaWVsZHMiLCJ1cGRhdGVkTW9kZWwiLCJVUERBVEUiLCJyZWZyZXNoRnJvbVN0YXRlIiwicmVmIiwiZGVsZXRlIiwiX29uRGVsZXRlIiwiREVMRVRFIiwicmVsYXRpb25zIiwibmFtZSIsInJldmVyc2UiLCJ2YWx1ZXMiLCJBcnJheSIsImlzQXJyYXkiLCJUeXBlRXJyb3IiLCJub3JtYWxpemVkTmV3SWRzIiwidW5pcXVlSWRzIiwiU2V0IiwidGhyb3VnaE1vZGVsTmFtZSIsInRocm91Z2giLCJtMm1OYW1lIiwiVGhyb3VnaE1vZGVsIiwiZnJvbUZpZWxkIiwidG9GaWVsZCIsImZyb20iLCJ0byIsInRocm91Z2hGaWVsZHMiLCJjdXJyZW50SWRzIiwiZmlsdGVyIiwidG9SZWZBcnJheSIsImRpZmZBY3Rpb25zIiwiYXJyYXlEaWZmQWN0aW9ucyIsImlkc1RvRGVsZXRlIiwiYWRkIiwiaWRzVG9BZGQiLCJyZW1vdmUiLCJkZXNjcmlwdG9yS2V5IiwiY2xlYXIiLCJyZWxhdGVkUXMiLCJyZWxhdGVkTmFtZSIsImhhc0lkIiwiY29uc29sZSIsIndhcm4iLCJnZXROZXh0U3RhdGUiLCJkYiIsImRlc2Ny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Q0Ysa0VBQ0kscUNBRkYsQ0FBTjtBQUlILEdBNXVCTTs7QUFBQTtBQUFBO0FBQUEscUJBNGFHO0FBQ04sWUFBTXNDLFNBQVMsR0FBRyxLQUFLbkUsUUFBTCxFQUFsQixDQURNLENBR047O0FBQ0EsYUFBT21FLFNBQVMsQ0FBQ1ksaUJBQVYsQ0FBNEI7QUFDL0IsU0FBQ1osU0FBUyxDQUFDbEUsV0FBWCxHQUF5QixLQUFLTyxLQUFMO0FBRE0sT0FBNUIsRUFFSixDQUZJLENBQVA7QUFHSDtBQW5iTTtBQUFBO0FBQUEscUJBeUhrQjtBQUNyQixVQUFJLE9BQU8sS0FBS29CLFFBQVosS0FBeUIsV0FBN0IsRUFBMEM7QUFDdEMsY0FBTSxJQUFJQyxLQUFKLENBQ0YsQ0FDSyxvQkFBbUIsS0FBSzNCLFNBQVUsMkNBRHZDLEVBRUksOERBRkosRUFHSyxjQUFhLEtBQUtBLFNBQVUsMkJBSGpDLEVBSUU0QixJQUpGLENBSU8sRUFKUCxDQURFLENBQU47QUFPSDs7QUFDRCxhQUFPLEtBQUtDLE9BQUwsQ0FBYWdILEVBQWIsQ0FBZ0JDLFFBQWhCLENBQXlCLEtBQUs5SSxTQUE5QixFQUF5Q0QsV0FBaEQ7QUFDSDtBQXBJTTtBQUFBO0FBQUEscUJBMkpjO0FBQ2pCLGFBQU8sS0FBSzJCLFFBQVo7QUFDSDtBQTdKTTtBQUFBO0FBQUEscUJBcUxZO0FBQ2YsYUFBTyxLQUFLVyxXQUFMLEVBQVA7QUFDSDtBQXZMTTs7QUFBQTtBQUFBLEdBQVg7O0FBK3VCQTlCLEtBQUssQ0FBQzRDLE1BQU4sR0FBZTtBQUNYa0IsSUFBRSxFQUFFMEUsb0RBQUk7QUFERyxDQUFmO0FBR0F4SSxLQUFLLENBQUNvQyxhQUFOLEdBQXNCLEVBQXRCO0FBQ0FwQyxLQUFLLENBQUMrQixhQUFOLEdBQXNCMEcsaURBQXRCO0FBRWV6SSxvRUFBZiIsImZpbGUiOiIuL3NyYy9Nb2RlbC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTZXNzaW9uIGZyb20gXCIuL1Nlc3Npb25cIjtcbmltcG9ydCBRdWVyeVNldCBmcm9tIFwiLi9RdWVyeVNldFwiO1xuXG5pbXBvcnQgeyBhdHRyIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgRm9yZWlnbktleSBmcm9tIFwiLi9maWVsZHMvRm9yZWlnbktleVwiO1xuaW1wb3J0IE1hbnlUb01hbnkgZnJvbSBcIi4vZmllbGRzL01hbnlUb01hbnlcIjtcbmltcG9ydCBPbmVUb09uZSBmcm9tIFwiLi9maWVsZHMvT25lVG9PbmVcIjtcblxuaW1wb3J0IHsgQ1JFQVRFLCBVUERBVEUsIERFTEVURSwgRklMVEVSIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICAgIG5vcm1hbGl6ZUVudGl0eSxcbiAgICBhcnJheURpZmZBY3Rpb25zLFxuICAgIG9iamVjdFNoYWxsb3dFcXVhbHMsXG4gICAgd2FybkRlcHJlY2F0ZWQsXG4gICAgbTJtTmFtZSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBxdWVyeSBzcGVjaWZpY2F0aW9uIHRvIGdldCB0aGUgaW5zdGFuY2Unc1xuICogY29ycmVzcG9uZGluZyB0YWJsZSByb3cgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRCeUlkUXVlcnkobW9kZWxJbnN0YW5jZSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBtb2RlbEluc3RhbmNlLmdldENsYXNzKCk7XG4gICAgY29uc3QgeyBpZEF0dHJpYnV0ZSwgbW9kZWxOYW1lIH0gPSBtb2RlbENsYXNzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGFibGU6IG1vZGVsTmFtZSxcbiAgICAgICAgY2xhdXNlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IEZJTFRFUixcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIFtpZEF0dHJpYnV0ZV06IG1vZGVsSW5zdGFuY2UuZ2V0SWQoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSBoZWFydCBvZiBhbiBPUk0sIHRoZSBkYXRhIG1vZGVsLlxuICpcbiAqIFRoZSBmaWVsZHMgeW91IHNwZWNpZnkgdG8gdGhlIE1vZGVsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZVxuICogYSBzY2hlbWEgdG8gdGhlIGRhdGFiYXNlLCByZWxhdGVkIHByb3BlcnR5IGFjY2Vzc29ycywgYW5kXG4gKiBwb3NzaWJseSB0aHJvdWdoIG1vZGVscy5cbiAqXG4gKiBJbiBlYWNoIHtAbGluayBTZXNzaW9ufSB5b3UgaW5zdGFudGlhdGUgZnJvbSBhbiB7QGxpbmsgT1JNfSBpbnN0YW5jZSxcbiAqIHlvdSB3aWxsIHJlY2VpdmUgYSBzZXNzaW9uLXNwZWNpZmljIHN1YmNsYXNzIG9mIHRoaXMgTW9kZWwuIFRoZSBtZXRob2RzXG4gKiB5b3UgZGVmaW5lIGhlcmUgd2lsbCBiZSBhdmFpbGFibGUgdG8geW91IGluIHNlc3Npb25zLlxuICpcbiAqIEFuIGluc3RhbmNlIG9mIHtAbGluayBNb2RlbH0gcmVwcmVzZW50cyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2UsIHRob3VnaFxuICogaXQgaXMgcG9zc2libGUgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIGZyb20gdGhlIHNhbWUgcmVjb3JkIGluIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBUbyBjcmVhdGUgZGF0YSBtb2RlbHMgaW4geW91ciBzY2hlbWEsIHN1YmNsYXNzIHtAbGluayBNb2RlbH0uIFRvIGRlZmluZVxuICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGEgbW9kZWwsIG92ZXJyaWRlIHN0YXRpYyBjbGFzcyBtZXRob2RzLiBEZWZpbmUgaW5zdGFuY2VcbiAqIGxvZ2ljIGJ5IGRlZmluaW5nIHByb3RvdHlwZSBtZXRob2RzICh3aXRob3V0IGBzdGF0aWNgIGtleXdvcmQpLlxuICovXG5jb25zdCBNb2RlbCA9IGNsYXNzIE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTW9kZWwgaW5zdGFuY2UgZnJvbSBpdCdzIHByb3BlcnRpZXMuXG4gICAgICogRG9uJ3QgdXNlIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHJlY29yZDsgVXNlIHRoZSBzdGF0aWMgbWV0aG9kIHtAbGluayBNb2RlbCNjcmVhdGV9LlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gcHJvcHMgLSB0aGUgcHJvcGVydGllcyB0byBpbnN0YW50aWF0ZSB3aXRoXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy5faW5pdEZpZWxkcyhwcm9wcyk7XG4gICAgfVxuXG4gICAgX2luaXRGaWVsZHMocHJvcHMpIHtcbiAgICAgICAgY29uc3QgcHJvcHNPYmogPSBPYmplY3QocHJvcHMpO1xuICAgICAgICB0aGlzLl9maWVsZHMgPSB7IC4uLnByb3BzT2JqIH07XG5cbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHNPYmopLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgZ290IGEgcHJvcCB0aGF0IHdhc24ndCBkZWZpbmVkIGFzIGEgZmllbGQuXG4gICAgICAgICAgICAvLyBBc3N1bWluZyBpdCdzIGFuIGFyYml0cmFyeSBkYXRhIGZpZWxkLCBtYWtpbmcgYW4gaW5zdGFuY2Utc3BlY2lmaWNcbiAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGl0LlxuICAgICAgICAgICAgLy8gVXNpbmcgdGhlIGluIG9wZXJhdG9yIGFzIHRoZSBwcm9wZXJ0eSBjb3VsZCBiZSBkZWZpbmVkIGFueXdoZXJlXG4gICAgICAgICAgICAvLyBvbiB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgICAgICAgICAgaWYgKCEoZmllbGROYW1lIGluIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGZpZWxkTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2ZpZWxkc1tmaWVsZE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzZXQ6IHZhbHVlID0+IHRoaXMuc2V0KGZpZWxkTmFtZSwgdmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBNb2RlbENsYXNzOiAke3RoaXMubW9kZWxOYW1lfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIHRhYmxlIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoaXMgTW9kZWwgY2xhc3MuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IG9iamVjdCBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGUgZGF0YWJhc2VcbiAgICAgKiB3aWxsIHVzZSBkZWZhdWx0IG9wdGlvbnMuIFlvdSBjYW4gZWl0aGVyIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvcHRpb25zXG4gICAgICogeW91IHdhbnQgdG8gdXNlLCBvciBhc3NpZ24gdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGEgc3RhdGljIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUgdG8gdGhlXG4gICAgICogTW9kZWwgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIGRhdGFiYXNlIGZvciB0aGUgdGFibGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGlzIE1vZGVsIGNsYXNzLlxuICAgICAqL1xuICAgIHN0YXRpYyBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbWFyayBpbmRpdmlkdWFsIGluc3RhbmNlcyBhcyBhY2Nlc3NlZC5cbiAgICAgKiBUaGlzIGFsbG93cyBpbnZhbGlkYXRpbmcgc2VsZWN0b3IgbWVtb2l6YXRpb24gd2l0aGluIG11dGFibGUgc2Vzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjwqPn0gaWRzIC0gQXJyYXkgb2YgcHJpbWFyeSBrZXkgdmFsdWVzXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBtYXJrQWNjZXNzZWQoaWRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIG1hcmsgcm93cyBvZiB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgYXMgYWNjZXNzZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtBY2Nlc3NlZFxcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5tYXJrQWNjZXNzZWQodGhpcy5tb2RlbE5hbWUsIGlkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbWFyayB0aGlzIG1vZGVsJ3MgdGFibGUgYXMgc2Nhbm5lZC5cbiAgICAgKiBUaGlzIGFsbG93cyBpbnZhbGlkYXRpbmcgc2VsZWN0b3IgbWVtb2l6YXRpb24gd2l0aGluIG11dGFibGUgc2Vzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIG1hcmtGdWxsVGFibGVTY2FubmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3Nlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBtYXJrIHRoZSAke3RoaXMubW9kZWxOYW1lfSBtb2RlbCBhcyBmdWxsIHRhYmxlIHNjYW5uZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtGdWxsVGFibGVTY2FubmVkXFxgIGluc3RlYWQuYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXNzaW9uLm1hcmtGdWxsVGFibGVTY2FubmVkKHRoaXMubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSBtYXJrIGluZGV4ZXMgYXMgYWNjZXNzZWQuXG4gICAgICogVGhpcyBhbGxvd3MgaW52YWxpZGF0aW5nIHNlbGVjdG9yIG1lbW9pemF0aW9uIHdpdGhpbiBtdXRhYmxlIHNlc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48QXJyYXkuPCosKj4+fSBpbmRleGVzIC0gQXJyYXkgb2YgY29sdW1uLXZhbHVlIHBhaXJzXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBtYXJrQWNjZXNzZWRJbmRleGVzKGluZGV4ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gbWFyayBpbmRleGVzIGZvciB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgYXMgYWNjZXNzZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtBY2Nlc3NlZEluZGV4ZXNcXGAgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlc3Npb24ubWFya0FjY2Vzc2VkSW5kZXhlcyhcbiAgICAgICAgICAgIGluZGV4ZXMubWFwKChbYXR0cmlidXRlLCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGlzIHtAbGluayBNb2RlbH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhpcyB7QGxpbmsgTW9kZWx9LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgaWRBdHRyaWJ1dGUoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIGdldCB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwncyBpZCBhdHRyaWJ1dGUgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBhY2Nlc3MgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsTmFtZX1cIl0uaWRBdHRyaWJ1dGVcXGAgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmRiLmRlc2NyaWJlKHRoaXMubW9kZWxOYW1lKS5pZEF0dHJpYnV0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRoZSBtb2RlbCBjbGFzcyB0byBhIHtAbGluayBTZXNzaW9ufS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtICB7U2Vzc2lvbn0gc2Vzc2lvbiAtIFRoZSBzZXNzaW9uIHRvIGNvbm5lY3QgdG8uXG4gICAgICovXG4gICAgc3RhdGljIGNvbm5lY3Qoc2Vzc2lvbikge1xuICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgU2Vzc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkEgbW9kZWwgY2FuIG9ubHkgYmUgY29ubmVjdGVkIHRvIGluc3RhbmNlcyBvZiBTZXNzaW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB7QGxpbmsgU2Vzc2lvbn0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge1Nlc3Npb259IFRoZSBjdXJyZW50IHtAbGluayBTZXNzaW9ufSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsJ3MgYHF1ZXJ5U2V0Q2xhc3NgIGZpZWxkLlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSB7QGxpbmsgUXVlcnlTZXR9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwncyBgcXVlcnlTZXRDbGFzc2AuXG4gICAgICovXG4gICAgc3RhdGljIGdldFF1ZXJ5U2V0KCkge1xuICAgICAgICBjb25zdCB7IHF1ZXJ5U2V0Q2xhc3M6IFF1ZXJ5U2V0Q2xhc3MgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlTZXRDbGFzcyh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIGludmFsaWRhdGVDbGFzc0NhY2hlKCkge1xuICAgICAgICB0aGlzLmlzU2V0VXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmlydHVhbEZpZWxkcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1vZGVsLmdldFF1ZXJ5U2V0fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5U2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB7QGxpbmsgVGFibGV9IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgdGFibGVPcHRpb25zKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmFja2VuZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgICAgICBcImBNb2RlbC5iYWNrZW5kYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgcmVuYW1lIHRvIGAub3B0aW9uc2AuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZCkge1xuICAgICAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICAgICAgXCJgTW9kZWwuYmFja2VuZGAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHJlbmFtZSB0byBgLm9wdGlvbnNgLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2UsIGluc3RhbnRpYXRlcyBhIHtAbGluayBNb2RlbH0gYW5kIHJldHVybnMgaXQuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyB2YWx1ZXMgZm9yIG1hbnktdG8tbWFueSBmaWVsZHMsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiB0aGUgdGhyb3VnaFxuICAgICAqIG1vZGVsIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJQcm9wcyAtIHRoZSBuZXcge0BsaW5rIE1vZGVsfSdzIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybiB7TW9kZWx9IGEgbmV3IHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh1c2VyUHJvcHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGEgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgaW5zdGFuY2Ugd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLmNyZWF0ZVxcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0geyAuLi51c2VyUHJvcHMgfTtcblxuICAgICAgICBjb25zdCBtMm1SZWxhdGlvbnMgPSB7fTtcblxuICAgICAgICBjb25zdCBkZWNsYXJlZEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcyk7XG4gICAgICAgIGNvbnN0IGRlY2xhcmVkVmlydHVhbEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnZpcnR1YWxGaWVsZHMpO1xuXG4gICAgICAgIGRlY2xhcmVkRmllbGROYW1lcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzW2tleV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZVBhc3NlZCA9IHVzZXJQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICAgICAgICAgICAgaWYgKCEoZmllbGQgaW5zdGFuY2VvZiBNYW55VG9NYW55KSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHVzZXJQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBwcm9wc1trZXldID0gbm9ybWFsaXplRW50aXR5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IGZpZWxkLmdldERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgICAgIG0ybVJlbGF0aW9uc1trZXldID0gdXNlclByb3BzW2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmFzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcmVsYXRpb25zaGlwIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgICogRGlzY2FyZCB0aGUgdmFsdWUgZnJvbSBwcm9wcyBhcyB0aGUgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgbGF0ZXIgd2l0aCBpbnN0YW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgdGFyZ2V0IG1vZGVscyB3aGVuIHJlZnJlc2hpbmcgdGhlIE0yTSByZWxhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAqIElmIHRoZSByZWxhdGlvbnNoaXAgZG9lcyBoYXZlIGFuIGFjY2Vzc29yIChgYXNgKSBmaWVsZCB0aGVuIHdlIGRvIHdhbnQgdG8ga2VlcCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAqIG9yaWdpbmFsIHZhbHVlIGluIHRoZSBwcm9wcyB0byBleHBvc2UgdGhlIHJhdyBsaXN0IG9mIElEcyBmcm9tIHRoZSBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gYWRkIGJhY2t3YXJkIG1hbnktbWFueSBpZiByZXF1aXJlZFxuICAgICAgICBkZWNsYXJlZFZpcnR1YWxGaWVsZE5hbWVzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghbTJtUmVsYXRpb25zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMudmlydHVhbEZpZWxkc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdXNlclByb3BzLmhhc093blByb3BlcnR5KGtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgaW5zdGFuY2VvZiBNYW55VG9NYW55XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgdmFsdWUgaXMgc3VwcGxpZWQgZm9yIGEgTWFueVRvTWFueSBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzY2FyZCB0aGVtIGZyb20gcHJvcHMgYW5kIHNhdmUgZm9yIGxhdGVyIHByb2Nlc3NpbmcuXG4gICAgICAgICAgICAgICAgICAgIG0ybVJlbGF0aW9uc1trZXldID0gdXNlclByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3RW50cnkgPSB0aGlzLnNlc3Npb24uYXBwbHlVcGRhdGUoe1xuICAgICAgICAgICAgYWN0aW9uOiBDUkVBVEUsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBwYXlsb2FkOiBwcm9wcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgVGhpc01vZGVsID0gdGhpcztcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGhpc01vZGVsKG5ld0VudHJ5KTtcbiAgICAgICAgaW5zdGFuY2UuX3JlZnJlc2hNYW55Mk1hbnkobTJtUmVsYXRpb25zKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBvciB1cGRhdGUgZXhpc3RpbmcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZSwgaW5zdGFudGlhdGVzIGEge0BsaW5rIE1vZGVsfSBhbmQgcmV0dXJucyBpdC5cbiAgICAgKlxuICAgICAqIElmIHlvdSBwYXNzIHZhbHVlcyBmb3IgbWFueS10by1tYW55IGZpZWxkcywgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIHRoZSB0aHJvdWdoXG4gICAgICogbW9kZWwgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdXNlclByb3BzIC0gdGhlIHJlcXVpcmVkIHtAbGluayBNb2RlbH0ncyBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm4ge01vZGVsfSBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIHVwc2VydCh1c2VyUHJvcHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byB1cHNlcnQgYSAke3RoaXMubW9kZWxOYW1lfSBtb2RlbCBpbnN0YW5jZSB3aXRob3V0IGEgc2Vzc2lvbi4gYCxcbiAgICAgICAgICAgICAgICAgICAgXCJDcmVhdGUgYSBzZXNzaW9uIHVzaW5nIGBzZXNzaW9uID0gb3JtLnNlc3Npb24oKWAgYW5kIGNhbGwgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsTmFtZX1cIl0udXBzZXJ0XFxgIGluc3RlYWQuYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGlkQXR0cmlidXRlIH0gPSB0aGlzO1xuICAgICAgICBpZiAodXNlclByb3BzLmhhc093blByb3BlcnR5KGlkQXR0cmlidXRlKSkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB1c2VyUHJvcHNbaWRBdHRyaWJ1dGVdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaWRFeGlzdHMoaWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLndpdGhJZChpZCk7XG4gICAgICAgICAgICAgICAgbW9kZWwudXBkYXRlKHVzZXJQcm9wcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHVzZXJQcm9wcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgZm9yIHRoZSBvYmplY3Qgd2l0aCBpZCBgaWRgLlxuICAgICAqIFJldHVybnMgYG51bGxgIGlmIHRoZSBtb2RlbCBoYXMgbm8gaW5zdGFuY2Ugd2l0aCBpZCBgaWRgLlxuICAgICAqXG4gICAgICogWW91IGNhbiB1c2Uge0BsaW5rIE1vZGVsI2lkRXhpc3RzfSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfSBpZCAtIHRoZSBgaWRgIG9mIHRoZSBvYmplY3QgdG8gZ2V0XG4gICAgICogQHRocm93cyBJZiBvYmplY3Qgd2l0aCBpZCBgaWRgIGRvZXNuJ3QgZXhpc3RcbiAgICAgKiBAcmV0dXJuIHtNb2RlbHxudWxsfSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHdpdGggaWQgYGlkYFxuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoSWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHtcbiAgICAgICAgICAgIFt0aGlzLmlkQXR0cmlidXRlXTogaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gZW50aXR5XG4gICAgICogd2l0aCB0aGUgaWQgYGlkYCBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gIGlkIC0gYSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhlIHtAbGluayBNb2RlbH0gY2xhc3MuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgZW50aXR5IHdpdGggYGlkYCBleGlzdHMgaW4gdGhlIHN0YXRlXG4gICAgICpcbiAgICAgKiBAc2luY2UgMC4xMS4wXG4gICAgICovXG4gICAgc3RhdGljIGlkRXhpc3RzKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4aXN0cyh7XG4gICAgICAgICAgICBbdGhpcy5pZEF0dHJpYnV0ZV06IGlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGFuIGVudGl0eVxuICAgICAqIHdpdGggdGhlIGdpdmVuIHByb3BzIGV4aXN0cyBpbiB0aGUgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfSAgcHJvcHMgLSBhIGtleS12YWx1ZSB0aGF0IHtAbGluayBNb2RlbH0gaW5zdGFuY2VzIHNob3VsZCBoYXZlIHRvIGJlIGNvbnNpZGVyZWQgYXMgZXhpc3RpbmcuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgZW50aXR5IHdpdGggYHByb3BzYCBleGlzdHMgaW4gdGhlIHN0YXRlXG4gICAgICovXG4gICAgc3RhdGljIGV4aXN0cyhsb29rdXBPYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBjaGVjayBpZiBhICR7dGhpcy5tb2RlbE5hbWV9IG1vZGVsIGluc3RhbmNlIGV4aXN0cyB3aXRob3V0IGEgc2Vzc2lvbi4gYCxcbiAgICAgICAgICAgICAgICAgICAgXCJDcmVhdGUgYSBzZXNzaW9uIHVzaW5nIGBzZXNzaW9uID0gb3JtLnNlc3Npb24oKWAgYW5kIGNhbGwgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsTmFtZX1cIl0uZXhpc3RzXFxgIGluc3RlYWQuYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5kRGF0YWJhc2VSb3dzKGxvb2t1cE9iaikubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHRoYXQgbWF0Y2hlcyBwcm9wZXJ0aWVzIGluIGBsb29rdXBPYmpgLlxuICAgICAqIFRocm93cyBhbiBlcnJvciBpZiB7QGxpbmsgTW9kZWx9IGlmIG11bHRpcGxlIHJlY29yZHMgbWF0Y2hcbiAgICAgKiB0aGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbG9va3VwT2JqIC0gdGhlIHByb3BlcnRpZXMgdXNlZCB0byBtYXRjaCBhIHNpbmdsZSBlbnRpdHkuXG4gICAgICogQHRocm93cyB7RXJyb3J9IElmIG1vcmUgdGhhbiBvbmUgZW50aXR5IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgaW4gYGxvb2t1cE9iamAuXG4gICAgICogQHJldHVybiB7TW9kZWx9IGEge0BsaW5rIE1vZGVsfSBpbnN0YW5jZSB0aGF0IG1hdGNoZXMgdGhlIHByb3BlcnRpZXMgaW4gYGxvb2t1cE9iamAuXG4gICAgICovXG4gICAgc3RhdGljIGdldChsb29rdXBPYmopIHtcbiAgICAgICAgY29uc3QgVGhpc01vZGVsID0gdGhpcztcblxuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5fZmluZERhdGFiYXNlUm93cyhsb29rdXBPYmopO1xuICAgICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgdG8gZmluZCBhIHNpbmdsZSByb3cgaW4gXFxgJHt0aGlzLm1vZGVsTmFtZX0uZ2V0XFxgLiBGb3VuZCAke3Jvd3MubGVuZ3RofS5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzTW9kZWwocm93c1swXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUge0BsaW5rIE1vZGVsfSBjbGFzcyBvciBzdWJjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGNsYXNzIHRoYXRcbiAgICAgKiBpbnN0YW50aWF0ZWQgdGhpcyBpbnN0YW5jZSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtNb2RlbH0gVGhlIHtAbGluayBNb2RlbH0gY2xhc3Mgb3Igc3ViY2xhc3MgY29uc3RydWN0b3IgdXNlZCB0byBpbnN0YW50aWF0ZVxuICAgICAqICAgICAgICAgICAgICAgICB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpZCB2YWx1ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSBieSBsb29raW5nIHVwIHRoZSBpZCBhdHRyaWJ1dGUuXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGlkIHZhbHVlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgICAqL1xuICAgIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzW3RoaXMuZ2V0Q2xhc3MoKS5pZEF0dHJpYnV0ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcGxhaW4gSlMgb2JqZWN0IGluIHRoZSBzdG9yZS5cbiAgICAgKiBJdCBjb250YWlucyBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCB5b3UgcGFzcyB3aGVuIGNyZWF0aW5nIHRoZSBtb2RlbCxcbiAgICAgKiBleGNlcHQgZm9yIHByaW1hcnkga2V5cyBvZiBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwcyB3aXRoIGEgY3VzdG9tIGFjY2Vzc29yLlxuICAgICAqXG4gICAgICogTWFrZSBzdXJlIG5ldmVyIHRvIG11dGF0ZSB0aGlzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBhIHJlZmVyZW5jZSB0byB0aGUgcGxhaW4gSlMgb2JqZWN0IGluIHRoZSBzdG9yZVxuICAgICAqL1xuICAgIGdldCByZWYoKSB7XG4gICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHRoaXMuZ2V0Q2xhc3MoKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgcmV0dXJuIFRoaXNNb2RlbC5fZmluZERhdGFiYXNlUm93cyh7XG4gICAgICAgICAgICBbVGhpc01vZGVsLmlkQXR0cmlidXRlXTogdGhpcy5nZXRJZCgpLFxuICAgICAgICB9KVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbGwgcm93cyBpbiB0aGlzIG1vZGVsJ3MgdGFibGUgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gYGxvb2t1cE9iamAuXG4gICAgICogSWYgbm8gYGxvb2t1cE9iamAgaXMgcGFzc2VkLCBhbGwgcm93cyBpbiB0aGUgbW9kZWwncyB0YWJsZSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gIHByb3BzIC0gYSBrZXktdmFsdWUgdGhhdCB7QGxpbmsgTW9kZWx9IGluc3RhbmNlcyBzaG91bGQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGFzIGV4aXN0aW5nLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVudGl0eSB3aXRoIGBwcm9wc2AgZXhpc3RzIGluIHRoZSBzdGF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9maW5kRGF0YWJhc2VSb3dzKGxvb2t1cE9iaikge1xuICAgICAgICBjb25zdCBxdWVyeVNwZWMgPSB7XG4gICAgICAgICAgICB0YWJsZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsb29rdXBPYmopIHtcbiAgICAgICAgICAgIHF1ZXJ5U3BlYy5jbGF1c2VzID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRklMVEVSLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBsb29rdXBPYmosXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5xdWVyeShxdWVyeVNwZWMpLnJvd3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGxpbmsgTW9kZWx9IGluc3RhbmNlLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBUaGlzTW9kZWwgPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IFRoaXNNb2RlbC5tb2RlbE5hbWU7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyhUaGlzTW9kZWwuZmllbGRzKTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gZmllbGROYW1lc1xuICAgICAgICAgICAgLm1hcChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gVGhpc01vZGVsLmZpZWxkc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gdGhpc1tmaWVsZE5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Nb2RlbEFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobW9kZWwgPT4gbW9kZWwuZ2V0SWQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZE5hbWV9OiBbJHtpZHMuam9pbihcIiwgXCIpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLl9maWVsZHNbZmllbGROYW1lXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZmllbGROYW1lfTogJHt2YWx9YDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfTogeyR7ZmllbGRzfX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYG90aGVyTW9kZWxgIGVxdWFscyB0aGlzIHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICogRXF1YWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBzaGFsbG93IGNvbXBhcmluZyB0aGVpciBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogVGhpcyBlcXVhbGl0eSBpcyB1c2VkIHdoZW4geW91IGNhbGwge0BsaW5rIE1vZGVsI3VwZGF0ZX0uXG4gICAgICogWW91IGNhbiBwcmV2ZW50IG1vZGVsIHVwZGF0ZXMgYnkgcmV0dXJuaW5nIGB0cnVlYCBoZXJlLlxuICAgICAqIEhvd2V2ZXIsIGEgbW9kZWwgd2lsbCBhbHdheXMgYmUgdXBkYXRlZCBpZiBpdHMgcmVsYXRpb25zaGlwcyBhcmUgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge01vZGVsfSBvdGhlck1vZGVsIC0gYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUge0BsaW5rIE1vZGVsfSBpbnN0YW5jZSdzIGFyZSBlcXVhbC5cbiAgICAgKi9cbiAgICBlcXVhbHMob3RoZXJNb2RlbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgcmV0dXJuIG9iamVjdFNoYWxsb3dFcXVhbHModGhpcy5fZmllbGRzLCBvdGhlck1vZGVsLl9maWVsZHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYSBwcm9wZXJ0eSBuYW1lIHRvIGdpdmVuIHZhbHVlIGZvciB0aGlzIHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICogVGhlIHZhbHVlcyBhcmUgaW1tZWRpYXRlbHkgY29tbWl0dGVkIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgLSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXRcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gdmFsdWUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5XG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICAgIFtwcm9wZXJ0eU5hbWVdOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBtdWx0aXBsZSBmaWVsZHMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzIHRvIHRoaXMge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKiBUaGUgdXBkYXRlcyBhcmUgaW1tZWRpYXRlbHkgY29tbWl0dGVkIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdXNlck1lcmdlT2JqIC0gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB1cGRhdGUodXNlck1lcmdlT2JqKSB7XG4gICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHRoaXMuZ2V0Q2xhc3MoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBUaGlzTW9kZWwuc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIHVwZGF0ZSBhICR7VGhpc01vZGVsLm1vZGVsTmFtZX0gbW9kZWwgaW5zdGFuY2Ugd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiWW91IGNhbm5vdCBjYWxsIGAudXBkYXRlYCBvbiBhbiBpbnN0YW5jZSB0aGF0IHlvdSBkaWQgbm90IHJlY2VpdmUgZnJvbSB0aGUgZGF0YWJhc2UuXCIsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVyZ2VPYmogPSB7IC4uLnVzZXJNZXJnZU9iaiB9O1xuXG4gICAgICAgIGNvbnN0IHsgZmllbGRzLCB2aXJ0dWFsRmllbGRzIH0gPSBUaGlzTW9kZWw7XG5cbiAgICAgICAgY29uc3QgbTJtUmVsYXRpb25zID0ge307XG5cbiAgICAgICAgLy8gSWYgYW4gYXJyYXkgb2YgZW50aXRpZXMgb3IgaWQncyBpcyBzdXBwbGllZCBmb3IgYVxuICAgICAgICAvLyBtYW55LXRvLW1hbnkgcmVsYXRlZCBmaWVsZCwgY2xlYXIgdGhlIG9sZCByZWxhdGlvbnNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGUgbmV3IG9uZXMuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW4sIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIGZvciAoY29uc3QgbWVyZ2VLZXkgaW4gbWVyZ2VPYmopIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVhbEZpZWxkID0gZmllbGRzLmhhc093blByb3BlcnR5KG1lcmdlS2V5KTtcblxuICAgICAgICAgICAgaWYgKGlzUmVhbEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbbWVyZ2VLZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgRm9yZWlnbktleSB8fCBmaWVsZCBpbnN0YW5jZW9mIE9uZVRvT25lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvbmUtb25lL2ZrIHJlbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICBtZXJnZU9ialttZXJnZUtleV0gPSBub3JtYWxpemVFbnRpdHkobWVyZ2VPYmpbbWVyZ2VLZXldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgTWFueVRvTWFueSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZCBpcyBmb3J3YXJkIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIG0ybVJlbGF0aW9uc1ttZXJnZUtleV0gPSBtZXJnZU9ialttZXJnZUtleV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5hcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcmVsYXRpb25zaGlwIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIERpc2NhcmQgdGhlIHZhbHVlIGZyb20gcHJvcHMgYXMgdGhlIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGxhdGVyIHdpdGggaW5zdGFuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSB0YXJnZXQgbW9kZWxzIHdoZW4gcmVmcmVzaGluZyB0aGUgTTJNIHJlbGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHRoZSByZWxhdGlvbnNoaXAgZG9lcyBoYXZlIGFuIGFjY2Vzc29yIChgYXNgKSBmaWVsZCB0aGVuIHdlIGRvIHdhbnQgdG8ga2VlcCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmlnaW5hbCB2YWx1ZSBpbiB0aGUgcHJvcHMgdG8gZXhwb3NlIHRoZSByYXcgbGlzdCBvZiBJRHMgZnJvbSB0aGUgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXJnZU9ialttZXJnZUtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZpcnR1YWxGaWVsZHMuaGFzT3duUHJvcGVydHkobWVyZ2VLZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB2aXJ0dWFsRmllbGRzW21lcmdlS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBNYW55VG9NYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIGJhY2t3YXJkIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIG0ybVJlbGF0aW9uc1ttZXJnZUtleV0gPSBtZXJnZU9ialttZXJnZUtleV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXJnZU9ialttZXJnZUtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVyZ2VkRmllbGRzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fZmllbGRzLFxuICAgICAgICAgICAgLi4ubWVyZ2VPYmosXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZE1vZGVsID0gbmV3IFRoaXNNb2RlbChtZXJnZWRGaWVsZHMpO1xuICAgICAgICAvLyBvbmx5IHVwZGF0ZSBmaWVsZHMgaWYgdGhleSBoYXZlIGNoYW5nZWQgKHJlZmVyZW50aWFsbHkpXG4gICAgICAgIGlmICghdGhpcy5lcXVhbHModXBkYXRlZE1vZGVsKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdEZpZWxkcyhtZXJnZWRGaWVsZHMpO1xuICAgICAgICAgICAgVGhpc01vZGVsLnNlc3Npb24uYXBwbHlVcGRhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogVVBEQVRFLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBnZXRCeUlkUXVlcnkodGhpcyksXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogbWVyZ2VPYmosXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB2aXJ0dWFsIGZpZWxkc1xuICAgICAgICB0aGlzLl9yZWZyZXNoTWFueTJNYW55KG0ybVJlbGF0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIGF0dHJpYnV0ZXMgdG8gcmVmbGVjdCB0aGVcbiAgICAgKiBkYXRhYmFzZSBzdGF0ZSBpbiB0aGUgY3VycmVudCBzZXNzaW9uLlxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICByZWZyZXNoRnJvbVN0YXRlKCkge1xuICAgICAgICB0aGlzLl9pbml0RmllbGRzKHRoaXMucmVmKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSByZWNvcmQgZm9yIHRoaXMge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKiBZb3UnbGwgc3RpbGwgYmUgYWJsZSB0byBhY2Nlc3MgZmllbGRzIGFuZCB2YWx1ZXMgb24gdGhlIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGRlbGV0ZSgpIHtcbiAgICAgICAgY29uc3QgVGhpc01vZGVsID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICBpZiAodHlwZW9mIFRoaXNNb2RlbC5zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gZGVsZXRlIGEgJHtUaGlzTW9kZWwubW9kZWxOYW1lfSBtb2RlbCBpbnN0YW5jZSB3aXRob3V0IGEgc2Vzc2lvbi4gYCxcbiAgICAgICAgICAgICAgICAgICAgXCJZb3UgY2Fubm90IGNhbGwgYC5kZWxldGVgIG9uIGFuIGluc3RhbmNlIHRoYXQgeW91IGRpZCBub3QgcmVjZWl2ZSBmcm9tIHRoZSBkYXRhYmFzZS5cIixcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkRlbGV0ZSgpO1xuICAgICAgICBUaGlzTW9kZWwuc2Vzc2lvbi5hcHBseVVwZGF0ZSh7XG4gICAgICAgICAgICBhY3Rpb246IERFTEVURSxcbiAgICAgICAgICAgIHF1ZXJ5OiBnZXRCeUlkUXVlcnkodGhpcyksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBtYW55LW1hbnkgcmVsYXRpb25zIGZvciBtb2RlbC5cbiAgICAgKiBAcGFyYW0gcmVsYXRpb25zXG4gICAgICogQHJldHVybiB1bmRlZmluZWRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZWZyZXNoTWFueTJNYW55KHJlbGF0aW9ucykge1xuICAgICAgICBjb25zdCBUaGlzTW9kZWwgPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIGNvbnN0IHsgZmllbGRzLCB2aXJ0dWFsRmllbGRzLCBtb2RlbE5hbWUgfSA9IFRoaXNNb2RlbDtcblxuICAgICAgICBPYmplY3Qua2V5cyhyZWxhdGlvbnMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXZlcnNlID0gIWZpZWxkcy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdmlydHVhbEZpZWxkc1tuYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHJlbGF0aW9uc1tuYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIHJlc29sdmUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcDogJHttb2RlbE5hbWV9WyR7bmFtZX1dIG11c3QgYmUgYW4gYXJyYXkgKHBhc3NlZDogJHt2YWx1ZXN9KWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmV3SWRzID0gdmFsdWVzLm1hcChub3JtYWxpemVFbnRpdHkpO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQobm9ybWFsaXplZE5ld0lkcyldO1xuXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZE5ld0lkcy5sZW5ndGggIT09IHVuaXF1ZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBGb3VuZCBkdXBsaWNhdGUgaWQocykgd2hlbiBwYXNzaW5nIFwiJHtub3JtYWxpemVkTmV3SWRzfVwiIHRvICR7VGhpc01vZGVsLm1vZGVsTmFtZX0uJHtuYW1lfSB2YWx1ZWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aHJvdWdoTW9kZWxOYW1lID1cbiAgICAgICAgICAgICAgICBmaWVsZC50aHJvdWdoIHx8IG0ybU5hbWUoVGhpc01vZGVsLm1vZGVsTmFtZSwgbmFtZSk7XG4gICAgICAgICAgICBjb25zdCBUaHJvdWdoTW9kZWwgPSBUaGlzTW9kZWwuc2Vzc2lvblt0aHJvdWdoTW9kZWxOYW1lXTtcblxuICAgICAgICAgICAgbGV0IGZyb21GaWVsZDtcbiAgICAgICAgICAgIGxldCB0b0ZpZWxkO1xuXG4gICAgICAgICAgICBpZiAoIXJldmVyc2UpIHtcbiAgICAgICAgICAgICAgICAoeyBmcm9tOiBmcm9tRmllbGQsIHRvOiB0b0ZpZWxkIH0gPSBmaWVsZC50aHJvdWdoRmllbGRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgZnJvbTogdG9GaWVsZCwgdG86IGZyb21GaWVsZCB9ID0gZmllbGQudGhyb3VnaEZpZWxkcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBUaHJvdWdoTW9kZWwuZmlsdGVyKFxuICAgICAgICAgICAgICAgIHRocm91Z2ggPT4gdGhyb3VnaFtmcm9tRmllbGRdID09PSB0aGlzW1RoaXNNb2RlbC5pZEF0dHJpYnV0ZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudG9SZWZBcnJheSgpXG4gICAgICAgICAgICAgICAgLm1hcChyZWYgPT4gcmVmW3RvRmllbGRdKTtcblxuICAgICAgICAgICAgY29uc3QgZGlmZkFjdGlvbnMgPSBhcnJheURpZmZBY3Rpb25zKGN1cnJlbnRJZHMsIG5vcm1hbGl6ZWROZXdJZHMpO1xuXG4gICAgICAgICAgICBpZiAoZGlmZkFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRlbGV0ZTogaWRzVG9EZWxldGUsIGFkZDogaWRzVG9BZGQgfSA9IGRpZmZBY3Rpb25zO1xuICAgICAgICAgICAgICAgIGlmIChpZHNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbZmllbGQuYXMgfHwgbmFtZV0ucmVtb3ZlKC4uLmlkc1RvRGVsZXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaWRzVG9BZGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2ZpZWxkLmFzIHx8IG5hbWVdLmFkZCguLi5pZHNUb0FkZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EZWxldGUoKSB7XG4gICAgICAgIGNvbnN0IHsgdmlydHVhbEZpZWxkcyB9ID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluLCBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2aXJ0dWFsRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHZpcnR1YWxGaWVsZHNba2V5XTtcbiAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYW55IG1hbnktdG8tbWFueSByb3dzIHRoZSBlbnRpdHkgaXMgaW5jbHVkZWQgaW4uXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvcktleSA9IGZpZWxkLmFzIHx8IGtleTtcbiAgICAgICAgICAgICAgICB0aGlzW2Rlc2NyaXB0b3JLZXldLmNsZWFyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRRcyA9IHRoaXNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRlZFFzLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRRcy51cGRhdGUoeyBbZmllbGQucmVsYXRlZE5hbWVdOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgaW5zdGFuY2VvZiBPbmVUb09uZSkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBudWxsIHRvIGFueSBmb3JlaWduIGtleXMgb3Igb25lIHRvIG9uZXMgcG9pbnRlZCB0b1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXNba2V5XSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW2tleV1bZmllbGQucmVsYXRlZE5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBERVBSRUNBVEVEIEFORCBSRU1PVkVEIE1FVEhPRFNcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gZW50aXR5XG4gICAgICogd2l0aCB0aGUgaWQgYGlkYCBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gIGlkIC0gYSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhlIHtAbGluayBNb2RlbH0gY2xhc3MuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gYSBib29sZWFuIGluZGljYXRpbmcgaWYgZW50aXR5IHdpdGggYGlkYCBleGlzdHMgaW4gdGhlIHN0YXRlXG4gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgTW9kZWwuaWRFeGlzdHN9IGluc3RlYWQuXG4gICAgICovXG4gICAgc3RhdGljIGhhc0lkKGlkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiYE1vZGVsLmhhc0lkYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGBNb2RlbC5pZEV4aXN0c2AgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5pZEV4aXN0cyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgU2VlIHRoZSAwLjkgbWlncmF0aW9uIGd1aWRlIG9uIHRoZSBHaXRIdWIgcmVwby5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gRHVlIHRvIGRlcHJlY2F0aW9uLlxuICAgICAqL1xuICAgIGdldE5leHRTdGF0ZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJgTW9kZWwucHJvdG90eXBlLmdldE5leHRTdGF0ZWAgaGFzIGJlZW4gcmVtb3ZlZC4gU2VlIHRoZSAwLjkgXCIgK1xuICAgICAgICAgICAgICAgIFwibWlncmF0aW9uIGd1aWRlIG9uIHRoZSBHaXRIdWIgcmVwby5cIlxuICAgICAgICApO1xuICAgIH1cbn07XG5cbk1vZGVsLmZpZWxkcyA9IHtcbiAgICBpZDogYXR0cigpLFxufTtcbk1vZGVsLnZpcnR1YWxGaWVsZHMgPSB7fTtcbk1vZGVsLnF1ZXJ5U2V0Q2xhc3MgPSBRdWVyeVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZWw7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Model.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Session__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Session */ \"./src/Session.js\");\n/* harmony import */ var _QuerySet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./QuerySet */ \"./src/QuerySet.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fields */ \"./src/fields/index.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fields/OneToOne */ \"./src/fields/OneToOne.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n\n\n\n\n\n\n/**\n * Generates a query specification to get the instance's\n * corresponding table row using its primary key.\n *\n * @private\n * @returns {Object}\n */\n\nfunction getByIdQuery(modelInstance) {\n const modelClass = modelInstance.getClass();\n const {\n idAttribute,\n modelName\n } = modelClass;\n return {\n table: modelName,\n clauses: [{\n type: _constants__WEBPACK_IMPORTED_MODULE_7__[\"FILTER\"],\n payload: {\n [idAttribute]: modelInstance.getId()\n }\n }]\n };\n}\n/**\n * The heart of an ORM, the data model.\n *\n * The fields you specify to the Model will be used to generate\n * a schema to the database, related property accessors, and\n * possibly through models.\n *\n * In each {@link Session} you instantiate from an {@link ORM} instance,\n * you will receive a session-specific subclass of this Model. The methods\n * you define here will be available to you in sessions.\n *\n * An instance of {@link Model} represents a record in the database, though\n * it is possible to generate multiple instances from the same record in the database.\n *\n * To create data models in your schema, subclass {@link Model}. To define\n * information about the data model, override static class methods. Define instance\n * logic by defining prototype methods (without `static` keyword).\n */\n\n\nconst Model = /*#__PURE__*/function () {\n /**\n * Creates a Model instance from it's properties.\n * Don't use this to create a new record; Use the static method {@link Model#create}.\n * @param {Object} props - the properties to instantiate with\n */\n function Model(props) {\n this._initFields(props);\n }\n\n var _proto = Model.prototype;\n\n _proto._initFields = function _initFields(props) {\n const propsObj = Object(props);\n this._fields = { ...propsObj\n };\n Object.keys(propsObj).forEach(fieldName => {\n // In this case, we got a prop that wasn't defined as a field.\n // Assuming it's an arbitrary data field, making an instance-specific\n // descriptor for it.\n // Using the in operator as the property could be defined anywhere\n // on the prototype chain.\n if (!(fieldName in this)) {\n Object.defineProperty(this, fieldName, {\n get: () => this._fields[fieldName],\n set: value => this.set(fieldName, value),\n configurable: true,\n enumerable: true\n });\n }\n });\n };\n\n Model.toString = function toString() {\n return `ModelClass: ${this.modelName}`;\n }\n /**\n * Returns the options object passed to the database for the table that represents\n * this Model class.\n *\n * Returns an empty object by default, which means the database\n * will use default options. You can either override this function to return the options\n * you want to use, or assign the options object as a static property of the same name to the\n * Model class.\n *\n * @return {Object} the options object passed to the database for the table\n * representing this Model class.\n */\n ;\n\n Model.options = function options() {\n return {};\n }\n /**\n * Manually mark individual instances as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<*>} ids - Array of primary key values\n * @return {undefined}\n */\n ;\n\n Model.markAccessed = function markAccessed(ids) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markAccessed\\` instead.`].join(\"\"));\n }\n\n this.session.markAccessed(this.modelName, ids);\n }\n /**\n * Manually mark this model's table as scanned.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @return {undefined}\n */\n ;\n\n Model.markFullTableScanned = function markFullTableScanned() {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markFullTableScanned\\` instead.`].join(\"\"));\n }\n\n this.session.markFullTableScanned(this.modelName);\n }\n /**\n * Manually mark indexes as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<Array.<*,*>>} indexes - Array of column-value pairs\n * @return {undefined}\n */\n ;\n\n Model.markAccessedIndexes = function markAccessedIndexes(indexes) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].markAccessedIndexes\\` instead.`].join(\"\"));\n }\n\n this.session.markAccessedIndexes(indexes.map(([attribute, value]) => [this.modelName, attribute, value]));\n }\n /**\n * Returns the id attribute of this {@link Model}.\n *\n * @return {string} The id attribute of this {@link Model}.\n */\n ;\n\n /**\n * Connect the model class to a {@link Session}.\n *\n * @private\n * @param {Session} session - The session to connect to.\n */\n Model.connect = function connect(session) {\n if (!(session instanceof _Session__WEBPACK_IMPORTED_MODULE_1__[\"default\"])) {\n throw new Error(\"A model can only be connected to instances of Session.\");\n }\n\n this._session = session;\n }\n /**\n * Get the current {@link Session} instance.\n *\n * @private\n * @return {Session} The current {@link Session} instance.\n */\n ;\n\n /**\n * Returns an instance of the model's `querySetClass` field.\n * By default, this will be an empty {@link QuerySet}.\n *\n * @return {Object} An instance of the model's `querySetClass`.\n */\n Model.getQuerySet = function getQuerySet() {\n const {\n querySetClass: QuerySetClass\n } = this;\n return new QuerySetClass(this);\n }\n /**\n * @return {undefined}\n */\n ;\n\n Model.invalidateClassCache = function invalidateClassCache() {\n this.isSetUp = undefined;\n this.virtualFields = {};\n }\n /**\n * @see {@link Model.getQuerySet}\n */\n ;\n\n /**\n * Returns parameters to be passed to {@link Table} instance.\n *\n * @private\n */\n Model.tableOptions = function tableOptions() {\n if (typeof this.backend === \"function\") {\n Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"warnDeprecated\"])(\"`Model.backend` has been deprecated. Please rename to `.options`.\");\n return this.backend();\n }\n\n if (this.backend) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"warnDeprecated\"])(\"`Model.backend` has been deprecated. Please rename to `.options`.\");\n return this.backend;\n }\n\n if (typeof this.options === \"function\") {\n return this.options();\n }\n\n return this.options;\n }\n /**\n * Creates a new record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the new {@link Model}'s properties.\n * @return {Model} a new {@link Model} instance.\n */\n ;\n\n Model.create = function create(userProps) {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to create a ${this.modelName} model instance without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].create\\` instead.`].join(\"\"));\n }\n\n const props = { ...userProps\n };\n const m2mRelations = {};\n const declaredFieldNames = Object.keys(this.fields);\n const declaredVirtualFieldNames = Object.keys(this.virtualFields);\n declaredFieldNames.forEach(key => {\n const field = this.fields[key];\n const valuePassed = userProps.hasOwnProperty(key);\n\n if (!(field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"])) {\n if (valuePassed) {\n const value = userProps[key];\n props[key] = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"])(value);\n } else if (field.getDefault) {\n props[key] = field.getDefault(userProps);\n }\n } else if (valuePassed) {\n // Save for later processing\n m2mRelations[key] = userProps[key];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete props[key];\n }\n }\n }); // add backward many-many if required\n\n declaredVirtualFieldNames.forEach(key => {\n if (!m2mRelations.hasOwnProperty(key)) {\n const field = this.virtualFields[key];\n\n if (userProps.hasOwnProperty(key) && field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // If a value is supplied for a ManyToMany field,\n // discard them from props and save for later processing.\n m2mRelations[key] = userProps[key];\n delete props[key];\n }\n }\n });\n const newEntry = this.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"CREATE\"],\n table: this.modelName,\n payload: props\n });\n const ThisModel = this;\n const instance = new ThisModel(newEntry);\n\n instance._refreshMany2Many(m2mRelations); // eslint-disable-line no-underscore-dangle\n\n\n return instance;\n }\n /**\n * Creates a new or update existing record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the required {@link Model}'s properties.\n * @return {Model} a {@link Model} instance.\n */\n ;\n\n Model.upsert = function upsert(userProps) {\n if (typeof this.session === \"undefined\") {\n throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].upsert\\` instead.`].join(\"\"));\n }\n\n const {\n idAttribute\n } = this;\n\n if (userProps.hasOwnProperty(idAttribute)) {\n const id = userProps[idAttribute];\n\n if (this.idExists(id)) {\n const model = this.withId(id);\n model.update(userProps);\n return model;\n }\n }\n\n return this.create(userProps);\n }\n /**\n * Returns a {@link Model} instance for the object with id `id`.\n * Returns `null` if the model has no instance with id `id`.\n *\n * You can use {@link Model#idExists} to check for existence instead.\n *\n * @param {*} id - the `id` of the object to get\n * @throws If object with id `id` doesn't exist\n * @return {Model|null} {@link Model} instance with id `id`\n */\n ;\n\n Model.withId = function withId(id) {\n return this.get({\n [this.idAttribute]: id\n });\n }\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n *\n * @since 0.11.0\n */\n ;\n\n Model.idExists = function idExists(id) {\n return this.exists({\n [this.idAttribute]: id\n });\n }\n /**\n * Returns a boolean indicating if an entity\n * with the given props exists in the state.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n */\n ;\n\n Model.exists = function exists(lookupObj) {\n if (typeof this.session === \"undefined\") {\n throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `, \"Create a session using `session = orm.session()` and call \", `\\`session[\"${this.modelName}\"].exists\\` instead.`].join(\"\"));\n }\n\n return Boolean(this._findDatabaseRows(lookupObj).length);\n }\n /**\n * Gets the {@link Model} instance that matches properties in `lookupObj`.\n * Throws an error if {@link Model} if multiple records match\n * the properties.\n *\n * @param {Object} lookupObj - the properties used to match a single entity.\n * @throws {Error} If more than one entity matches the properties in `lookupObj`.\n * @return {Model} a {@link Model} instance that matches the properties in `lookupObj`.\n */\n ;\n\n Model.get = function get(lookupObj) {\n const ThisModel = this;\n\n const rows = this._findDatabaseRows(lookupObj);\n\n if (rows.length === 0) {\n return null;\n }\n\n if (rows.length > 1) {\n throw new Error(`Expected to find a single row in \\`${this.modelName}.get\\`. Found ${rows.length}.`);\n }\n\n return new ThisModel(rows[0]);\n }\n /**\n * Gets the {@link Model} class or subclass constructor (the class that\n * instantiated this instance).\n *\n * @return {Model} The {@link Model} class or subclass constructor used to instantiate\n * this instance.\n */\n ;\n\n _proto.getClass = function getClass() {\n return this.constructor;\n }\n /**\n * Gets the id value of the current instance by looking up the id attribute.\n * @return {*} The id value of the current instance.\n */\n ;\n\n _proto.getId = function getId() {\n return this._fields[this.getClass().idAttribute];\n }\n /**\n * Returns a reference to the plain JS object in the store.\n * It contains all the properties that you pass when creating the model,\n * except for primary keys of many-to-many relationships with a custom accessor.\n *\n * Make sure never to mutate this.\n *\n * @return {Object} a reference to the plain JS object in the store\n */\n ;\n\n /**\n * Finds all rows in this model's table that match the given `lookupObj`.\n * If no `lookupObj` is passed, all rows in the model's table will be returned.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n * @private\n */\n Model._findDatabaseRows = function _findDatabaseRows(lookupObj) {\n const querySpec = {\n table: this.modelName\n };\n\n if (lookupObj) {\n querySpec.clauses = [{\n type: _constants__WEBPACK_IMPORTED_MODULE_7__[\"FILTER\"],\n payload: lookupObj\n }];\n }\n\n return this.session.query(querySpec).rows;\n }\n /**\n * Returns a string representation of the {@link Model} instance.\n *\n * @return {string} A string representation of this {@link Model} instance.\n */\n ;\n\n _proto.toString = function toString() {\n const ThisModel = this.getClass();\n const className = ThisModel.modelName;\n const fieldNames = Object.keys(ThisModel.fields);\n const fields = fieldNames.map(fieldName => {\n const field = ThisModel.fields[fieldName];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n const ids = this[fieldName].toModelArray().map(model => model.getId());\n return `${fieldName}: [${ids.join(\", \")}]`;\n }\n\n const val = this._fields[fieldName];\n return `${fieldName}: ${val}`;\n }).join(\", \");\n return `${className}: {${fields}}`;\n }\n /**\n * Returns a boolean indicating if `otherModel` equals this {@link Model} instance.\n * Equality is determined by shallow comparing their attributes.\n *\n * This equality is used when you call {@link Model#update}.\n * You can prevent model updates by returning `true` here.\n * However, a model will always be updated if its relationships are changed.\n *\n * @param {Model} otherModel - a {@link Model} instance to compare\n * @return {Boolean} a boolean indicating if the {@link Model} instance's are equal.\n */\n ;\n\n _proto.equals = function equals(otherModel) {\n // eslint-disable-next-line no-underscore-dangle\n return Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"objectShallowEquals\"])(this._fields, otherModel._fields);\n }\n /**\n * Updates a property name to given value for this {@link Model} instance.\n * The values are immediately committed to the database.\n *\n * @param {string} propertyName - name of the property to set\n * @param {*} value - value assigned to the property\n * @return {undefined}\n */\n ;\n\n _proto.set = function set(propertyName, value) {\n this.update({\n [propertyName]: value\n });\n }\n /**\n * Assigns multiple fields and corresponding values to this {@link Model} instance.\n * The updates are immediately committed to the database.\n *\n * @param {Object} userMergeObj - an object that will be merged with this instance.\n * @return {undefined}\n */\n ;\n\n _proto.update = function update(userMergeObj) {\n const ThisModel = this.getClass();\n\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error([`Tried to update a ${ThisModel.modelName} model instance without a session. `, \"You cannot call `.update` on an instance that you did not receive from the database.\"].join(\"\"));\n }\n\n const mergeObj = { ...userMergeObj\n };\n const {\n fields,\n virtualFields\n } = ThisModel;\n const m2mRelations = {}; // If an array of entities or id's is supplied for a\n // many-to-many related field, clear the old relations\n // and add the new ones.\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (const mergeKey in mergeObj) {\n const isRealField = fields.hasOwnProperty(mergeKey);\n\n if (isRealField) {\n const field = fields[mergeKey];\n\n if (field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__[\"default\"] || field instanceof _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n // update one-one/fk relations\n mergeObj[mergeKey] = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"])(mergeObj[mergeKey]);\n } else if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // field is forward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete mergeObj[mergeKey];\n }\n }\n } else if (virtualFields.hasOwnProperty(mergeKey)) {\n const field = virtualFields[mergeKey];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // field is backward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n delete mergeObj[mergeKey];\n }\n }\n }\n\n const mergedFields = { ...this._fields,\n ...mergeObj\n };\n const updatedModel = new ThisModel(mergedFields); // only update fields if they have changed (referentially)\n\n if (!this.equals(updatedModel)) {\n this._initFields(mergedFields);\n\n ThisModel.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"UPDATE\"],\n query: getByIdQuery(this),\n payload: mergeObj\n });\n } // update virtual fields\n\n\n this._refreshMany2Many(m2mRelations);\n }\n /**\n * Updates {@link Model} instance attributes to reflect the\n * database state in the current session.\n * @return {undefined}\n */\n ;\n\n _proto.refreshFromState = function refreshFromState() {\n this._initFields(this.ref);\n }\n /**\n * Deletes the record for this {@link Model} instance.\n * You'll still be able to access fields and values on the instance.\n *\n * @return {undefined}\n */\n ;\n\n _proto.delete = function _delete() {\n const ThisModel = this.getClass();\n\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error([`Tried to delete a ${ThisModel.modelName} model instance without a session. `, \"You cannot call `.delete` on an instance that you did not receive from the database.\"].join(\"\"));\n }\n\n this._onDelete();\n\n ThisModel.session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_7__[\"DELETE\"],\n query: getByIdQuery(this)\n });\n }\n /**\n * Update many-many relations for model.\n * @param relations\n * @return undefined\n * @private\n */\n ;\n\n _proto._refreshMany2Many = function _refreshMany2Many(relations) {\n const ThisModel = this.getClass();\n const {\n fields,\n virtualFields,\n modelName\n } = ThisModel;\n Object.keys(relations).forEach(name => {\n const reverse = !fields.hasOwnProperty(name);\n const field = virtualFields[name];\n const values = relations[name];\n\n if (!Array.isArray(values)) {\n throw new TypeError(`Failed to resolve many-to-many relationship: ${modelName}[${name}] must be an array (passed: ${values})`);\n }\n\n const normalizedNewIds = values.map(_utils__WEBPACK_IMPORTED_MODULE_8__[\"normalizeEntity\"]);\n const uniqueIds = [...new Set(normalizedNewIds)];\n\n if (normalizedNewIds.length !== uniqueIds.length) {\n throw new Error(`Found duplicate id(s) when passing \"${normalizedNewIds}\" to ${ThisModel.modelName}.${name} value`);\n }\n\n const throughModelName = field.through || Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"m2mName\"])(ThisModel.modelName, name);\n const ThroughModel = ThisModel.session[throughModelName];\n let fromField;\n let toField;\n\n if (!reverse) {\n ({\n from: fromField,\n to: toField\n } = field.throughFields);\n } else {\n ({\n from: toField,\n to: fromField\n } = field.throughFields);\n }\n\n const currentIds = ThroughModel.filter(through => through[fromField] === this[ThisModel.idAttribute]).toRefArray().map(ref => ref[toField]);\n const diffActions = Object(_utils__WEBPACK_IMPORTED_MODULE_8__[\"arrayDiffActions\"])(currentIds, normalizedNewIds);\n\n if (diffActions) {\n const {\n delete: idsToDelete,\n add: idsToAdd\n } = diffActions;\n\n if (idsToDelete.length > 0) {\n this[field.as || name].remove(...idsToDelete);\n }\n\n if (idsToAdd.length > 0) {\n this[field.as || name].add(...idsToAdd);\n }\n }\n });\n }\n /**\n * @return {undefined}\n * @private\n */\n ;\n\n _proto._onDelete = function _onDelete() {\n const {\n virtualFields\n } = this.getClass(); // eslint-disable-next-line guard-for-in, no-restricted-syntax\n\n for (const key in virtualFields) {\n const field = virtualFields[key];\n\n if (field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // Delete any many-to-many rows the entity is included in.\n const descriptorKey = field.as || key;\n this[descriptorKey].clear();\n } else if (field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n const relatedQs = this[key];\n\n if (relatedQs.exists()) {\n relatedQs.update({\n [field.relatedName]: null\n });\n }\n } else if (field instanceof _fields_OneToOne__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n // Set null to any foreign keys or one to ones pointed to\n // this instance.\n if (this[key] !== null) {\n this[key][field.relatedName] = null;\n }\n }\n }\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n * @deprecated Please use {@link Model.idExists} instead.\n */\n ;\n\n Model.hasId = function hasId(id) {\n console.warn(\"`Model.hasId` has been deprecated. Please use `Model.idExists` instead.\");\n return this.idExists(id);\n }\n /**\n * @deprecated See the 0.9 migration guide on the GitHub repo.\n * @throws {Error} Due to deprecation.\n */\n ;\n\n _proto.getNextState = function getNextState() {\n throw new Error(\"`Model.prototype.getNextState` has been removed. See the 0.9 \" + \"migration guide on the GitHub repo.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Model, [{\n key: \"ref\",\n get: function () {\n const ThisModel = this.getClass(); // eslint-disable-next-line no-underscore-dangle\n\n return ThisModel._findDatabaseRows({\n [ThisModel.idAttribute]: this.getId()\n })[0];\n }\n }], [{\n key: \"idAttribute\",\n get: function () {\n if (typeof this._session === \"undefined\") {\n throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `, \"Create a session using `session = orm.session()` and access \", `\\`session[\"${this.modelName}\"].idAttribute\\` instead.`].join(\"\"));\n }\n\n return this.session.db.describe(this.modelName).idAttribute;\n }\n }, {\n key: \"session\",\n get: function () {\n return this._session;\n }\n }, {\n key: \"query\",\n get: function () {\n return this.getQuerySet();\n }\n }]);\n\n return Model;\n}();\n\nModel.fields = {\n id: Object(_fields__WEBPACK_IMPORTED_MODULE_3__[\"attr\"])()\n};\nModel.virtualFields = {};\nModel.querySetClass = _QuerySet__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (Model);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9Nb2RlbC5qcz9mYzVkIl0sIm5hbWVzIjpbImdldEJ5SWRRdWVyeSIsIm1vZGVsSW5zdGFuY2UiLCJtb2RlbENsYXNzIiwiZ2V0Q2xhc3MiLCJpZEF0dHJpYnV0ZSIsIm1vZGVsTmFtZSIsInRhYmxlIiwiY2xhdXNlcyIsInR5cGUiLCJGSUxURVIiLCJwYXlsb2FkIiwiZ2V0SWQiLCJNb2RlbCIsInByb3BzIiwiX2luaXRGaWVsZHMiLCJwcm9wc09iaiIsIk9iamVjdCIsIl9maWVsZHMiLCJrZXlzIiwiZm9yRWFjaCIsImZpZWxkTmFtZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0Iiwic2V0IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwidG9TdHJpbmciLCJvcHRpb25zIiwibWFya0FjY2Vzc2VkIiwiaWRzIiwiX3Nlc3Npb24iLCJFcnJvciIsImpvaW4iLCJzZXNzaW9uIiwibWFya0Z1bGxUYWJsZVNjYW5uZWQiLCJtYXJrQWNjZXNzZWRJbmRleGVzIiwiaW5kZXhlcyIsIm1hcCIsImF0dHJpYnV0ZSIsImNvbm5lY3QiLCJTZXNzaW9uIiwiZ2V0UXVlcnlTZXQiLCJxdWVyeVNldENsYXNzIiwiUXVlcnlTZXRDbGFzcyIsImludmFsaWRhdGVDbGFzc0NhY2hlIiwiaXNTZXRVcCIsInVuZGVmaW5lZCIsInZpcnR1YWxGaWVsZHMiLCJ0YWJsZU9wdGlvbnMiLCJiYWNrZW5kIiwid2FybkRlcHJlY2F0ZWQiLCJjcmVhdGUiLCJ1c2VyUHJvcHMiLCJtMm1SZWxhdGlvbnMiLCJkZWNsYXJlZEZpZWxkTmFtZXMiLCJmaWVsZHMiLCJkZWNsYXJlZFZpcnR1YWxGaWVsZE5hbWVzIiwia2V5IiwiZmllbGQiLCJ2YWx1ZVBhc3NlZCIsImhhc093blByb3BlcnR5IiwiTWFueVRvTWFueSIsIm5vcm1hbGl6ZUVudGl0eSIsImdldERlZmF1bHQiLCJhcyIsIm5ld0VudHJ5IiwiYXBwbHlVcGRhdGUiLCJhY3Rpb24iLCJDUkVBVEUiLCJUaGlzTW9kZWwiLCJpbnN0YW5jZSIsIl9yZWZyZXNoTWFueTJNYW55IiwidXBzZXJ0IiwiaWQiLCJpZEV4aXN0cyIsIm1vZGVsIiwid2l0aElkIiwidXBkYXRlIiwiZXhpc3RzIiwibG9va3VwT2JqIiwiQm9vbGVhbiIsIl9maW5kRGF0YWJhc2VSb3dzIiwibGVuZ3RoIiwicm93cyIsImNvbnN0cnVjdG9yIiwicXVlcnlTcGVjIiwicXVlcnkiLCJjbGFzc05hbWUiLCJmaWVsZE5hbWVzIiwidG9Nb2RlbEFycmF5IiwidmFsIiwiZXF1YWxzIiwib3RoZXJNb2RlbCIsIm9iamVjdFNoYWxsb3dFcXVhbHMiLCJwcm9wZXJ0eU5hbWUiLCJ1c2VyTWVyZ2VPYmoiLCJtZXJnZU9iaiIsIm1lcmdlS2V5IiwiaXNSZWFsRmllbGQiLCJGb3JlaWduS2V5IiwiT25lVG9PbmUiLCJtZXJnZWRGaWVsZHMiLCJ1cGRhdGVkTW9kZWwiLCJVUERBVEUiLCJyZWZyZXNoRnJvbVN0YXRlIiwicmVmIiwiZGVsZXRlIiwiX29uRGVsZXRlIiwiREVMRVRFIiwicmVsYXRpb25zIiwibmFtZSIsInJldmVyc2UiLCJ2YWx1ZXMiLCJBcnJheSIsImlzQXJyYXkiLCJUeXBlRXJyb3IiLCJub3JtYWxpemVkTmV3SWRzIiwidW5pcXVlSWRzIiwiU2V0IiwidGhyb3VnaE1vZGVsTmFtZSIsInRocm91Z2giLCJtMm1OYW1lIiwiVGhyb3VnaE1vZGVsIiwiZnJvbUZpZWxkIiwidG9GaWVsZCIsImZyb20iLCJ0byIsInRocm91Z2hGaWVsZHMiLCJjdXJyZW50SWRzIiwiZmlsdGVyIiwidG9SZWZBcnJheSIsImRpZmZBY3Rpb25zIiwiYXJyYXlEaWZmQWN0aW9ucyIsImlkc1RvRGVsZXRlIiwiYWRkIiwiaWRzVG9BZGQiLCJyZW1vdmUiLCJkZXNjcmlwdG9yS2V5IiwiY2xlYXIiLCJyZWxhdGVkUXMiLCJyZWxhdGVkTmFtZSIsImhhc0lkIiwiY29uc29sZSIsIndhcm4iLCJnZXROZXh0U3RhdGUiLCJkYiIsImRlc2NyaWJlIiwiYXR0ciIsIlF1ZXJ5U2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0EsWUFBVCxDQUFzQkMsYUFBdEIsRUFBcUM7QUFDakMsUUFBTUMsVUFBVSxHQUFHRCxhQUFhLENBQUNFLFFBQWQsRUFBbkI7QUFDQSxRQUFNO0FBQUVDLGVBQUY7QUFBZUM7QUFBZixNQUE2QkgsVUFBbkM7QUFFQSxTQUFPO0FBQ0hJLFNBQUssRUFBRUQsU0FESjtBQUVIRSxXQUFPLEVBQUUsQ0FDTDtBQUNJQyxVQUFJLEVBQUVDLGlEQURWO0FBRUlDLGFBQU8sRUFBRTtBQUNMLFNBQUNOLFdBQUQsR0FBZUgsYUFBYSxDQUFDVSxLQUFkO0FBRFY7QUFGYixLQURLO0FBRk4sR0FBUDtBQVdIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxNQUFNQyxLQUFLO0FBQ1A7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNJLGlCQUFZQyxLQUFaLEVBQW1CO0FBQ2YsU0FBS0MsV0FBTCxDQUFpQkQsS0FBakI7QUFDSDs7QUFSTTs7QUFBQSxTQVVQQyxXQVZPLEdBVVAscUJBQVlELEtBQVosRUFBbUI7QUFDZixVQUFNRSxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0gsS0FBRCxDQUF2QjtBQUNBLFNBQUtJLE9BQUwsR0FBZSxFQUFFLEdBQUdGO0FBQUwsS0FBZjtBQUVBQyxVQUFNLENBQUNFLElBQVAsQ0FBWUgsUUFBWixFQUFzQkksT0FBdEIsQ0FBK0JDLFNBQUQsSUFBZTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBSSxFQUFFQSxTQUFTLElBQUksSUFBZixDQUFKLEVBQTBCO0FBQ3RCSixjQUFNLENBQUNLLGNBQVAsQ0FBc0IsSUFBdEIsRUFBNEJELFNBQTVCLEVBQXVDO0FBQ25DRSxhQUFHLEVBQUUsTUFBTSxLQUFLTCxPQUFMLENBQWFHLFNBQWIsQ0FEd0I7QUFFbkNHLGFBQUcsRUFBR0MsS0FBRCxJQUFXLEtBQUtELEdBQUwsQ0FBU0gsU0FBVCxFQUFvQkksS0FBcEIsQ0FGbUI7QUFHbkNDLHNCQUFZLEVBQUUsSUFIcUI7QUFJbkNDLG9CQUFVLEVBQUU7QUFKdUIsU0FBdkM7QUFNSDtBQUNKLEtBZEQ7QUFlSCxHQTdCTTs7QUFBQSxRQStCQUMsUUEvQkEsR0ErQlAsb0JBQWtCO0FBQ2QsV0FBUSxlQUFjLEtBQUt0QixTQUFVLEVBQXJDO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5Q1c7O0FBQUEsUUErQ0F1QixPQS9DQSxHQStDUCxtQkFBaUI7QUFDYixXQUFPLEVBQVA7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekRXOztBQUFBLFFBMERBQyxZQTFEQSxHQTBEUCxzQkFBb0JDLEdBQXBCLEVBQXlCO0FBQ3JCLFFBQUksT0FBTyxLQUFLQyxRQUFaLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3RDLFlBQU0sSUFBSUMsS0FBSixDQUNGLENBQ0ssNkJBQTRCLEtBQUszQixTQUFVLHdDQURoRCxFQUVJLDREQUZKLEVBR0ssY0FBYSxLQUFLQSxTQUFVLDRCQUhqQyxFQUlFNEIsSUFKRixDQUlPLEVBSlAsQ0FERSxDQUFOO0FBT0g7O0FBQ0QsU0FBS0MsT0FBTCxDQUFhTCxZQUFiLENBQTBCLEtBQUt4QixTQUEvQixFQUEwQ3lCLEdBQTFDO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1RVc7O0FBQUEsUUE2RUFLLG9CQTdFQSxHQTZFUCxnQ0FBOEI7QUFDMUIsUUFBSSxPQUFPLEtBQUtKLFFBQVosS0FBeUIsV0FBN0IsRUFBMEM7QUFDdEMsWUFBTSxJQUFJQyxLQUFKLENBQ0YsQ0FDSyxxQkFBb0IsS0FBSzNCLFNBQVUsa0RBRHhDLEVBRUksNERBRkosRUFHSyxjQUFhLEtBQUtBLFNBQVUsb0NBSGpDLEVBSUU0QixJQUpGLENBSU8sRUFKUCxDQURFLENBQU47QUFPSDs7QUFDRCxTQUFLQyxPQUFMLENBQWFDLG9CQUFiLENBQWtDLEtBQUs5QixTQUF2QztBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoR1c7O0FBQUEsUUFpR0ErQixtQkFqR0EsR0FpR1AsNkJBQTJCQyxPQUEzQixFQUFvQztBQUNoQyxRQUFJLE9BQU8sS0FBS04sUUFBWixLQUF5QixXQUE3QixFQUEwQztBQUN0QyxZQUFNLElBQUlDLEtBQUosQ0FDRixDQUNLLGlDQUFnQyxLQUFLM0IsU0FBVSx3Q0FEcEQsRUFFSSw0REFGSixFQUdLLGNBQWEsS0FBS0EsU0FBVSxtQ0FIakMsRUFJRTRCLElBSkYsQ0FJTyxFQUpQLENBREUsQ0FBTjtBQU9IOztBQUNELFNBQUtDLE9BQUwsQ0FBYUUsbUJBQWIsQ0FDSUMsT0FBTyxDQUFDQyxHQUFSLENBQVksQ0FBQyxDQUFDQyxTQUFELEVBQVlmLEtBQVosQ0FBRCxLQUF3QixDQUNoQyxLQUFLbkIsU0FEMkIsRUFFaENrQyxTQUZnQyxFQUdoQ2YsS0FIZ0MsQ0FBcEMsQ0FESjtBQU9IO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQXhIVzs7QUFzSVA7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM0lXLFFBNElBZ0IsT0E1SUEsR0E0SVAsaUJBQWVOLE9BQWYsRUFBd0I7QUFDcEIsUUFBSSxFQUFFQSxPQUFPLFlBQVlPLGdEQUFyQixDQUFKLEVBQW1DO0FBQy9CLFlBQU0sSUFBSVQsS0FBSixDQUNGLHdEQURFLENBQU47QUFHSDs7QUFDRCxTQUFLRCxRQUFMLEdBQWdCRyxPQUFoQjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMUpXOztBQStKUDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwS1csUUFxS0FRLFdBcktBLEdBcUtQLHVCQUFxQjtBQUNqQixVQUFNO0FBQUVDLG1CQUFhLEVBQUVDO0FBQWpCLFFBQW1DLElBQXpDO0FBQ0EsV0FBTyxJQUFJQSxhQUFKLENBQWtCLElBQWxCLENBQVA7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQTVLVzs7QUFBQSxRQTZLQUMsb0JBN0tBLEdBNktQLGdDQUE4QjtBQUMxQixTQUFLQyxPQUFMLEdBQWVDLFNBQWY7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFwTFc7O0FBeUxQO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUE3TFcsUUE4TEFDLFlBOUxBLEdBOExQLHdCQUFzQjtBQUNsQixRQUFJLE9BQU8sS0FBS0MsT0FBWixLQUF3QixVQUE1QixFQUF3QztBQUNwQ0MsbUVBQWMsQ0FDVixtRUFEVSxDQUFkO0FBR0EsYUFBTyxLQUFLRCxPQUFMLEVBQVA7QUFDSDs7QUFDRCxRQUFJLEtBQUtBLE9BQVQsRUFBa0I7QUFDZEMsbUVBQWMsQ0FDVixtRUFEVSxDQUFkO0FBR0EsYUFBTyxLQUFLRCxPQUFaO0FBQ0g7O0FBQ0QsUUFBSSxPQUFPLEtBQUt0QixPQUFaLEtBQXdCLFVBQTVCLEVBQXdDO0FBQ3BDLGFBQU8sS0FBS0EsT0FBTCxFQUFQO0FBQ0g7O0FBQ0QsV0FBTyxLQUFLQSxPQUFaO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6Tlc7O0FBQUEsUUEwTkF3QixNQTFOQSxHQTBOUCxnQkFBY0MsU0FBZCxFQUF5QjtBQUNyQixRQUFJLE9BQU8sS0FBS3RCLFFBQVosS0FBeUIsV0FBN0IsRUFBMEM7QUFDdEMsWUFBTSxJQUFJQyxLQUFKLENBQ0YsQ0FDSyxxQkFBb0IsS0FBSzNCLFNBQVUscUNBRHhDLEVBRUksNERBRkosRUFHSyxjQUFhLEtBQUtBLFNBQVUsc0JBSGpDLEVBSUU0QixJQUpGLENBSU8sRUFKUCxDQURFLENBQU47QUFPSDs7QUFDRCxVQUFNcEIsS0FBSyxHQUFHLEVBQUUsR0FBR3dDO0FBQUwsS0FBZDtBQUVBLFVBQU1DLFlBQVksR0FBRyxFQUFyQjtBQUVBLFVBQU1DLGtCQUFrQixHQUFHdkMsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBS3NDLE1BQWpCLENBQTNCO0FBQ0EsVUFBTUMseUJBQXlCLEdBQUd6QyxNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLOEIsYUFBakIsQ0FBbEM7QUFFQU8sc0JBQWtCLENBQUNwQyxPQUFuQixDQUE0QnVDLEdBQUQsSUFBUztBQUNoQyxZQUFNQyxLQUFLLEdBQUcsS0FBS0gsTUFBTCxDQUFZRSxHQUFaLENBQWQ7QUFDQSxZQUFNRSxXQUFXLEdBQUdQLFNBQVMsQ0FBQ1EsY0FBVixDQUF5QkgsR0FBekIsQ0FBcEI7O0FBQ0EsVUFBSSxFQUFFQyxLQUFLLFlBQVlHLDBEQUFuQixDQUFKLEVBQW9DO0FBQ2hDLFlBQUlGLFdBQUosRUFBaUI7QUFDYixnQkFBTXBDLEtBQUssR0FBRzZCLFNBQVMsQ0FBQ0ssR0FBRCxDQUF2QjtBQUNBN0MsZUFBSyxDQUFDNkMsR0FBRCxDQUFMLEdBQWFLLDhEQUFlLENBQUN2QyxLQUFELENBQTVCO0FBQ0gsU0FIRCxNQUdPLElBQUltQyxLQUFLLENBQUNLLFVBQVYsRUFBc0I7QUFDekJuRCxlQUFLLENBQUM2QyxHQUFELENBQUwsR0FBYUMsS0FBSyxDQUFDSyxVQUFOLENBQWlCWCxTQUFqQixDQUFiO0FBQ0g7QUFDSixPQVBELE1BT08sSUFBSU8sV0FBSixFQUFpQjtBQUNwQjtBQUNBTixvQkFBWSxDQUFDSSxHQUFELENBQVosR0FBb0JMLFNBQVMsQ0FBQ0ssR0FBRCxDQUE3Qjs7QUFFQSxZQUFJLENBQUNDLEtBQUssQ0FBQ00sRUFBWCxFQUFlO0FBQ1g7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ29CLGlCQUFPcEQsS0FBSyxDQUFDNkMsR0FBRCxDQUFaO0FBQ0g7QUFDSjtBQUNKLEtBekJELEVBakJxQixDQTRDckI7O0FBQ0FELDZCQUF5QixDQUFDdEMsT0FBMUIsQ0FBbUN1QyxHQUFELElBQVM7QUFDdkMsVUFBSSxDQUFDSixZQUFZLENBQUNPLGNBQWIsQ0FBNEJILEdBQTVCLENBQUwsRUFBdUM7QUFDbkMsY0FBTUMsS0FBSyxHQUFHLEtBQUtYLGFBQUwsQ0FBbUJVLEdBQW5CLENBQWQ7O0FBQ0EsWUFDSUwsU0FBUyxDQUFDUSxjQUFWLENBQXlCSCxHQUF6QixLQUNBQyxLQUFLLFlBQVlHLDBEQUZyQixFQUdFO0FBQ0U7QUFDQTtBQUNBUixzQkFBWSxDQUFDSSxHQUFELENBQVosR0FBb0JMLFNBQVMsQ0FBQ0ssR0FBRCxDQUE3QjtBQUNBLGlCQUFPN0MsS0FBSyxDQUFDNkMsR0FBRCxDQUFaO0FBQ0g7QUFDSjtBQUNKLEtBYkQ7QUFlQSxVQUFNUSxRQUFRLEdBQUcsS0FBS2hDLE9BQUwsQ0FBYWlDLFdBQWIsQ0FBeUI7QUFDdENDLFlBQU0sRUFBRUMsaURBRDhCO0FBRXRDL0QsV0FBSyxFQUFFLEtBQUtELFNBRjBCO0FBR3RDSyxhQUFPLEVBQUVHO0FBSDZCLEtBQXpCLENBQWpCO0FBTUEsVUFBTXlELFNBQVMsR0FBRyxJQUFsQjtBQUNBLFVBQU1DLFFBQVEsR0FBRyxJQUFJRCxTQUFKLENBQWNKLFFBQWQsQ0FBakI7O0FBQ0FLLFlBQVEsQ0FBQ0MsaUJBQVQsQ0FBMkJsQixZQUEzQixFQXBFcUIsQ0FvRXFCOzs7QUFDMUMsV0FBT2lCLFFBQVA7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFTVzs7QUFBQSxRQTJTQUUsTUEzU0EsR0EyU1AsZ0JBQWNwQixTQUFkLEVBQXlCO0FBQ3JCLFFBQUksT0FBTyxLQUFLbkIsT0FBWixLQUF3QixXQUE1QixFQUF5QztBQUNyQyxZQUFNLElBQUlGLEtBQUosQ0FDRixDQUNLLHFCQUFvQixLQUFLM0IsU0FBVSxxQ0FEeEMsRUFFSSw0REFGSixFQUdLLGNBQWEsS0FBS0EsU0FBVSxzQkFIakMsRUFJRTRCLElBSkYsQ0FJTyxFQUpQLENBREUsQ0FBTjtBQU9IOztBQUVELFVBQU07QUFBRTdCO0FBQUYsUUFBa0IsSUFBeEI7O0FBQ0EsUUFBSWlELFNBQVMsQ0FBQ1EsY0FBVixDQUF5QnpELFdBQXpCLENBQUosRUFBMkM7QUFDdkMsWUFBTXNFLEVBQUUsR0FBR3JCLFNBQVMsQ0FBQ2pELFdBQUQsQ0FBcEI7O0FBQ0EsVUFBSSxLQUFLdUUsUUFBTCxDQUFjRCxFQUFkLENBQUosRUFBdUI7QUFDbkIsY0FBTUUsS0FBSyxHQUFHLEtBQUtDLE1BQUwsQ0FBWUgsRUFBWixDQUFkO0FBQ0FFLGFBQUssQ0FBQ0UsTUFBTixDQUFhekIsU0FBYjtBQUNBLGVBQU91QixLQUFQO0FBQ0g7QUFDSjs7QUFFRCxXQUFPLEtBQUt4QixNQUFMLENBQVlDLFNBQVosQ0FBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1VVc7O0FBQUEsUUE2VUF3QixNQTdVQSxHQTZVUCxnQkFBY0gsRUFBZCxFQUFrQjtBQUNkLFdBQU8sS0FBS3BELEdBQUwsQ0FBUztBQUNaLE9BQUMsS0FBS2xCLFdBQU4sR0FBb0JzRTtBQURSLEtBQVQsQ0FBUDtBQUdIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM1ZXOztBQUFBLFFBNFZBQyxRQTVWQSxHQTRWUCxrQkFBZ0JELEVBQWhCLEVBQW9CO0FBQ2hCLFdBQU8sS0FBS0ssTUFBTCxDQUFZO0FBQ2YsT0FBQyxLQUFLM0UsV0FBTixHQUFvQnNFO0FBREwsS0FBWixDQUFQO0FBR0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXhXVzs7QUFBQSxRQXlXQUssTUF6V0EsR0F5V1AsZ0JBQWNDLFNBQWQsRUFBeUI7QUFDckIsUUFBSSxPQUFPLEtBQUs5QyxPQUFaLEtBQXdCLFdBQTVCLEVBQXlDO0FBQ3JDLFlBQU0sSUFBSUYsS0FBSixDQUNGLENBQ0ssdUJBQXNCLEtBQUszQixTQUFVLDRDQUQxQyxFQUVJLDREQUZKLEVBR0ssY0FBYSxLQUFLQSxTQUFVLHNCQUhqQyxFQUlFNEIsSUFKRixDQUlPLEVBSlAsQ0FERSxDQUFOO0FBT0g7O0FBRUQsV0FBT2dELE9BQU8sQ0FBQyxLQUFLQyxpQkFBTCxDQUF1QkYsU0FBdkIsRUFBa0NHLE1BQW5DLENBQWQ7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9YVzs7QUFBQSxRQWdZQTdELEdBaFlBLEdBZ1lQLGFBQVcwRCxTQUFYLEVBQXNCO0FBQ2xCLFVBQU1WLFNBQVMsR0FBRyxJQUFsQjs7QUFFQSxVQUFNYyxJQUFJLEdBQUcsS0FBS0YsaUJBQUwsQ0FBdUJGLFNBQXZCLENBQWI7O0FBQ0EsUUFBSUksSUFBSSxDQUFDRCxNQUFMLEtBQWdCLENBQXBCLEVBQXVCO0FBQ25CLGFBQU8sSUFBUDtBQUNIOztBQUNELFFBQUlDLElBQUksQ0FBQ0QsTUFBTCxHQUFjLENBQWxCLEVBQXFCO0FBQ2pCLFlBQU0sSUFBSW5ELEtBQUosQ0FDRCxzQ0FBcUMsS0FBSzNCLFNBQVUsaUJBQWdCK0UsSUFBSSxDQUFDRCxNQUFPLEdBRC9FLENBQU47QUFHSDs7QUFFRCxXQUFPLElBQUliLFNBQUosQ0FBY2MsSUFBSSxDQUFDLENBQUQsQ0FBbEIsQ0FBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0Wlc7O0FBQUEsU0F1WlBqRixRQXZaTyxHQXVaUCxvQkFBVztBQUNQLFdBQU8sS0FBS2tGLFdBQVo7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBOVpXOztBQUFBLFNBK1pQMUUsS0EvWk8sR0ErWlAsaUJBQVE7QUFDSixXQUFPLEtBQUtNLE9BQUwsQ0FBYSxLQUFLZCxRQUFMLEdBQWdCQyxXQUE3QixDQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEzYVc7O0FBcWJQO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1YlcsUUE2YkE4RSxpQkE3YkEsR0E2YlAsMkJBQXlCRixTQUF6QixFQUFvQztBQUNoQyxVQUFNTSxTQUFTLEdBQUc7QUFDZGhGLFdBQUssRUFBRSxLQUFLRDtBQURFLEtBQWxCOztBQUdBLFFBQUkyRSxTQUFKLEVBQWU7QUFDWE0sZUFBUyxDQUFDL0UsT0FBVixHQUFvQixDQUNoQjtBQUNJQyxZQUFJLEVBQUVDLGlEQURWO0FBRUlDLGVBQU8sRUFBRXNFO0FBRmIsT0FEZ0IsQ0FBcEI7QUFNSDs7QUFDRCxXQUFPLEtBQUs5QyxPQUFMLENBQWFxRCxLQUFiLENBQW1CRCxTQUFuQixFQUE4QkYsSUFBckM7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFoZFc7O0FBQUEsU0FpZFB6RCxRQWpkTyxHQWlkUCxvQkFBVztBQUNQLFVBQU0yQyxTQUFTLEdBQUcsS0FBS25FLFFBQUwsRUFBbEI7QUFDQSxVQUFNcUYsU0FBUyxHQUFHbEIsU0FBUyxDQUFDakUsU0FBNUI7QUFDQSxVQUFNb0YsVUFBVSxHQUFHekUsTUFBTSxDQUFDRSxJQUFQLENBQVlvRCxTQUFTLENBQUNkLE1BQXRCLENBQW5CO0FBQ0EsVUFBTUEsTUFBTSxHQUFHaUMsVUFBVSxDQUNwQm5ELEdBRFUsQ0FDTGxCLFNBQUQsSUFBZTtBQUNoQixZQUFNdUMsS0FBSyxHQUFHVyxTQUFTLENBQUNkLE1BQVYsQ0FBaUJwQyxTQUFqQixDQUFkOztBQUNBLFVBQUl1QyxLQUFLLFlBQVlHLDBEQUFyQixFQUFpQztBQUM3QixjQUFNaEMsR0FBRyxHQUFHLEtBQUtWLFNBQUwsRUFDUHNFLFlBRE8sR0FFUHBELEdBRk8sQ0FFRnNDLEtBQUQsSUFBV0EsS0FBSyxDQUFDakUsS0FBTixFQUZSLENBQVo7QUFHQSxlQUFRLEdBQUVTLFNBQVUsTUFBS1UsR0FBRyxDQUFDRyxJQUFKLENBQVMsSUFBVCxDQUFlLEdBQXhDO0FBQ0g7O0FBQ0QsWUFBTTBELEdBQUcsR0FBRyxLQUFLMUUsT0FBTCxDQUFhRyxTQUFiLENBQVo7QUFDQSxhQUFRLEdBQUVBLFNBQVUsS0FBSXVFLEdBQUksRUFBNUI7QUFDSCxLQVhVLEVBWVYxRCxJQVpVLENBWUwsSUFaSyxDQUFmO0FBYUEsV0FBUSxHQUFFdUQsU0FBVSxNQUFLaEMsTUFBTyxHQUFoQztBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9lVzs7QUFBQSxTQWdmUG9DLE1BaGZPLEdBZ2ZQLGdCQUFPQyxVQUFQLEVBQW1CO0FBQ2Y7QUFDQSxXQUFPQyxrRUFBbUIsQ0FBQyxLQUFLN0UsT0FBTixFQUFlNEUsVUFBVSxDQUFDNUUsT0FBMUIsQ0FBMUI7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1Zlc7O0FBQUEsU0E2ZlBNLEdBN2ZPLEdBNmZQLGFBQUl3RSxZQUFKLEVBQWtCdkUsS0FBbEIsRUFBeUI7QUFDckIsU0FBS3NELE1BQUwsQ0FBWTtBQUNSLE9BQUNpQixZQUFELEdBQWdCdkU7QUFEUixLQUFaO0FBR0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpnQlc7O0FBQUEsU0EwZ0JQc0QsTUExZ0JPLEdBMGdCUCxnQkFBT2tCLFlBQVAsRUFBcUI7QUFDakIsVUFBTTFCLFNBQVMsR0FBRyxLQUFLbkUsUUFBTCxFQUFsQjs7QUFDQSxRQUFJLE9BQU9tRSxTQUFTLENBQUNwQyxPQUFqQixLQUE2QixXQUFqQyxFQUE4QztBQUMxQyxZQUFNLElBQUlGLEtBQUosQ0FDRixDQUNLLHFCQUFvQnNDLFNBQVMsQ0FBQ2pFLFNBQVUscUNBRDdDLEVBRUksc0ZBRkosRUFHRTRCLElBSEYsQ0FHTyxFQUhQLENBREUsQ0FBTjtBQU1IOztBQUVELFVBQU1nRSxRQUFRLEdBQUcsRUFBRSxHQUFHRDtBQUFMLEtBQWpCO0FBRUEsVUFBTTtBQUFFeEMsWUFBRjtBQUFVUjtBQUFWLFFBQTRCc0IsU0FBbEM7QUFFQSxVQUFNaEIsWUFBWSxHQUFHLEVBQXJCLENBZmlCLENBaUJqQjtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxTQUFLLE1BQU00QyxRQUFYLElBQXVCRCxRQUF2QixFQUFpQztBQUM3QixZQUFNRSxXQUFXLEdBQUczQyxNQUFNLENBQUNLLGNBQVAsQ0FBc0JxQyxRQUF0QixDQUFwQjs7QUFFQSxVQUFJQyxXQUFKLEVBQWlCO0FBQ2IsY0FBTXhDLEtBQUssR0FBR0gsTUFBTSxDQUFDMEMsUUFBRCxDQUFwQjs7QUFFQSxZQUFJdkMsS0FBSyxZQUFZeUMsMERBQWpCLElBQStCekMsS0FBSyxZQUFZMEMsd0RBQXBELEVBQThEO0FBQzFEO0FBQ0FKLGtCQUFRLENBQUNDLFFBQUQsQ0FBUixHQUFxQm5DLDhEQUFlLENBQUNrQyxRQUFRLENBQUNDLFFBQUQsQ0FBVCxDQUFwQztBQUNILFNBSEQsTUFHTyxJQUFJdkMsS0FBSyxZQUFZRywwREFBckIsRUFBaUM7QUFDcEM7QUFDQVIsc0JBQVksQ0FBQzRDLFFBQUQsQ0FBWixHQUF5QkQsUUFBUSxDQUFDQyxRQUFELENBQWpDOztBQUVBLGNBQUksQ0FBQ3ZDLEtBQUssQ0FBQ00sRUFBWCxFQUFlO0FBQ1g7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dCLG1CQUFPZ0MsUUFBUSxDQUFDQyxRQUFELENBQWY7QUFDSDtBQUNKO0FBQ0osT0FyQkQsTUFxQk8sSUFBSWxELGFBQWEsQ0FBQ2EsY0FBZCxDQUE2QnFDLFFBQTdCLENBQUosRUFBNEM7QUFDL0MsY0FBTXZDLEtBQUssR0FBR1gsYUFBYSxDQUFDa0QsUUFBRCxDQUEzQjs7QUFDQSxZQUFJdkMsS0FBSyxZQUFZRywwREFBckIsRUFBaUM7QUFDN0I7QUFDQVIsc0JBQVksQ0FBQzRDLFFBQUQsQ0FBWixHQUF5QkQsUUFBUSxDQUFDQyxRQUFELENBQWpDO0FBQ0EsaUJBQU9ELFFBQVEsQ0FBQ0MsUUFBRCxDQUFmO0FBQ0g7QUFDSjtBQUNKOztBQUVELFVBQU1JLFlBQVksR0FBRyxFQUNqQixHQUFHLEtBQUtyRixPQURTO0FBRWpCLFNBQUdnRjtBQUZjLEtBQXJCO0FBS0EsVUFBTU0sWUFBWSxHQUFHLElBQUlqQyxTQUFKLENBQWNnQyxZQUFkLENBQXJCLENBNURpQixDQTZEakI7O0FBQ0EsUUFBSSxDQUFDLEtBQUtWLE1BQUwsQ0FBWVcsWUFBWixDQUFMLEVBQWdDO0FBQzVCLFdBQUt6RixXQUFMLENBQWlCd0YsWUFBakI7O0FBQ0FoQyxlQUFTLENBQUNwQyxPQUFWLENBQWtCaUMsV0FBbEIsQ0FBOEI7QUFDMUJDLGNBQU0sRUFBRW9DLGlEQURrQjtBQUUxQmpCLGFBQUssRUFBRXZGLFlBQVksQ0FBQyxJQUFELENBRk87QUFHMUJVLGVBQU8sRUFBRXVGO0FBSGlCLE9BQTlCO0FBS0gsS0FyRWdCLENBdUVqQjs7O0FBQ0EsU0FBS3pCLGlCQUFMLENBQXVCbEIsWUFBdkI7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUF6bEJXOztBQUFBLFNBMGxCUG1ELGdCQTFsQk8sR0EwbEJQLDRCQUFtQjtBQUNmLFNBQUszRixXQUFMLENBQWlCLEtBQUs0RixHQUF0QjtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbm1CVzs7QUFBQSxTQW9tQlBDLE1BcG1CTyxHQW9tQlAsbUJBQVM7QUFDTCxVQUFNckMsU0FBUyxHQUFHLEtBQUtuRSxRQUFMLEVBQWxCOztBQUNBLFFBQUksT0FBT21FLFNBQVMsQ0FBQ3BDLE9BQWpCLEtBQTZCLFdBQWpDLEVBQThDO0FBQzFDLFlBQU0sSUFBSUYsS0FBSixDQUNGLENBQ0sscUJBQW9Cc0MsU0FBUyxDQUFDakUsU0FBVSxxQ0FEN0MsRUFFSSxzRkFGSixFQUdFNEIsSUFIRixDQUdPLEVBSFAsQ0FERSxDQUFOO0FBTUg7O0FBRUQsU0FBSzJFLFNBQUw7O0FBQ0F0QyxhQUFTLENBQUNwQyxPQUFWLENBQWtCaUMsV0FBbEIsQ0FBOEI7QUFDMUJDLFlBQU0sRUFBRXlDLGlEQURrQjtBQUUxQnRCLFdBQUssRUFBRXZGLFlBQVksQ0FBQyxJQUFEO0FBRk8sS0FBOUI7QUFJSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTNuQlc7O0FBQUEsU0E0bkJQd0UsaUJBNW5CTyxHQTRuQlAsMkJBQWtCc0MsU0FBbEIsRUFBNkI7QUFDekIsVUFBTXhDLFNBQVMsR0FBRyxLQUFLbkUsUUFBTCxFQUFsQjtBQUNBLFVBQU07QUFBRXFELFlBQUY7QUFBVVIsbUJBQVY7QUFBeUIzQztBQUF6QixRQUF1Q2lFLFNBQTdDO0FBRUF0RCxVQUFNLENBQUNFLElBQVAsQ0FBWTRGLFNBQVosRUFBdUIzRixPQUF2QixDQUFnQzRGLElBQUQsSUFBVTtBQUNyQyxZQUFNQyxPQUFPLEdBQUcsQ0FBQ3hELE1BQU0sQ0FBQ0ssY0FBUCxDQUFzQmtELElBQXRCLENBQWpCO0FBQ0EsWUFBTXBELEtBQUssR0FBR1gsYUFBYSxDQUFDK0QsSUFBRCxDQUEzQjtBQUNBLFlBQU1FLE1BQU0sR0FBR0gsU0FBUyxDQUFDQyxJQUFELENBQXhCOztBQUVBLFVBQUksQ0FBQ0csS0FBSyxDQUFDQyxPQUFOLENBQWNGLE1BQWQsQ0FBTCxFQUE0QjtBQUN4QixjQUFNLElBQUlHLFNBQUosQ0FDRCxnREFBK0MvRyxTQUFVLElBQUcwRyxJQUFLLCtCQUE4QkUsTUFBTyxHQURyRyxDQUFOO0FBR0g7O0FBRUQsWUFBTUksZ0JBQWdCLEdBQUdKLE1BQU0sQ0FBQzNFLEdBQVAsQ0FBV3lCLHNEQUFYLENBQXpCO0FBQ0EsWUFBTXVELFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSUMsR0FBSixDQUFRRixnQkFBUixDQUFKLENBQWxCOztBQUVBLFVBQUlBLGdCQUFnQixDQUFDbEMsTUFBakIsS0FBNEJtQyxTQUFTLENBQUNuQyxNQUExQyxFQUFrRDtBQUM5QyxjQUFNLElBQUluRCxLQUFKLENBQ0QsdUNBQXNDcUYsZ0JBQWlCLFFBQU8vQyxTQUFTLENBQUNqRSxTQUFVLElBQUcwRyxJQUFLLFFBRHpGLENBQU47QUFHSDs7QUFFRCxZQUFNUyxnQkFBZ0IsR0FDbEI3RCxLQUFLLENBQUM4RCxPQUFOLElBQWlCQyxzREFBTyxDQUFDcEQsU0FBUyxDQUFDakUsU0FBWCxFQUFzQjBHLElBQXRCLENBRDVCO0FBRUEsWUFBTVksWUFBWSxHQUFHckQsU0FBUyxDQUFDcEMsT0FBVixDQUFrQnNGLGdCQUFsQixDQUFyQjtBQUVBLFVBQUlJLFNBQUo7QUFDQSxVQUFJQyxPQUFKOztBQUVBLFVBQUksQ0FBQ2IsT0FBTCxFQUFjO0FBQ1YsU0FBQztBQUFFYyxjQUFJLEVBQUVGLFNBQVI7QUFBbUJHLFlBQUUsRUFBRUY7QUFBdkIsWUFBbUNsRSxLQUFLLENBQUNxRSxhQUExQztBQUNILE9BRkQsTUFFTztBQUNILFNBQUM7QUFBRUYsY0FBSSxFQUFFRCxPQUFSO0FBQWlCRSxZQUFFLEVBQUVIO0FBQXJCLFlBQW1DakUsS0FBSyxDQUFDcUUsYUFBMUM7QUFDSDs7QUFFRCxZQUFNQyxVQUFVLEdBQUdOLFlBQVksQ0FBQ08sTUFBYixDQUNkVCxPQUFELElBQWFBLE9BQU8sQ0FBQ0csU0FBRCxDQUFQLEtBQXVCLEtBQUt0RCxTQUFTLENBQUNsRSxXQUFmLENBRHJCLEVBR2QrSCxVQUhjLEdBSWQ3RixHQUpjLENBSVRvRSxHQUFELElBQVNBLEdBQUcsQ0FBQ21CLE9BQUQsQ0FKRixDQUFuQjtBQU1BLFlBQU1PLFdBQVcsR0FBR0MsK0RBQWdCLENBQUNKLFVBQUQsRUFBYVosZ0JBQWIsQ0FBcEM7O0FBRUEsVUFBSWUsV0FBSixFQUFpQjtBQUNiLGNBQU07QUFBRXpCLGdCQUFNLEVBQUUyQixXQUFWO0FBQXVCQyxhQUFHLEVBQUVDO0FBQTVCLFlBQXlDSixXQUEvQzs7QUFDQSxZQUFJRSxXQUFXLENBQUNuRCxNQUFaLEdBQXFCLENBQXpCLEVBQTRCO0FBQ3hCLGVBQUt4QixLQUFLLENBQUNNLEVBQU4sSUFBWThDLElBQWpCLEVBQXVCMEIsTUFBdkIsQ0FBOEIsR0FBR0gsV0FBakM7QUFDSDs7QUFFRCxZQUFJRSxRQUFRLENBQUNyRCxNQUFULEdBQWtCLENBQXRCLEVBQXlCO0FBQ3JCLGVBQUt4QixLQUFLLENBQUNNLEVBQU4sSUFBWThDLElBQWpCLEVBQXVCd0IsR0FBdkIsQ0FBMkIsR0FBR0MsUUFBOUI7QUFDSDtBQUNKO0FBQ0osS0FuREQ7QUFvREg7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQXpyQlc7O0FBQUEsU0EwckJQNUIsU0ExckJPLEdBMHJCUCxxQkFBWTtBQUNSLFVBQU07QUFBRTVEO0FBQUYsUUFBb0IsS0FBSzdDLFFBQUwsRUFBMUIsQ0FEUSxDQUVSOztBQUNBLFNBQUssTUFBTXVELEdBQVgsSUFBa0JWLGFBQWxCLEVBQWlDO0FBQzdCLFlBQU1XLEtBQUssR0FBR1gsYUFBYSxDQUFDVSxHQUFELENBQTNCOztBQUNBLFVBQUlDLEtBQUssWUFBWUcsMERBQXJCLEVBQWlDO0FBQzdCO0FBQ0EsY0FBTTRFLGFBQWEsR0FBRy9FLEtBQUssQ0FBQ00sRUFBTixJQUFZUCxHQUFsQztBQUNBLGFBQUtnRixhQUFMLEVBQW9CQyxLQUFwQjtBQUNILE9BSkQsTUFJTyxJQUFJaEYsS0FBSyxZQUFZeUMsMERBQXJCLEVBQWlDO0FBQ3BDLGNBQU13QyxTQUFTLEdBQUcsS0FBS2xGLEdBQUwsQ0FBbEI7O0FBQ0EsWUFBSWtGLFNBQVMsQ0FBQzdELE1BQVYsRUFBSixFQUF3QjtBQUNwQjZELG1CQUFTLENBQUM5RCxNQUFWLENBQWlCO0FBQUUsYUFBQ25CLEtBQUssQ0FBQ2tGLFdBQVAsR0FBcUI7QUFBdkIsV0FBakI7QUFDSDtBQUNKLE9BTE0sTUFLQSxJQUFJbEYsS0FBSyxZQUFZMEMsd0RBQXJCLEVBQStCO0FBQ2xDO0FBQ0E7QUFDQSxZQUFJLEtBQUszQyxHQUFMLE1BQWMsSUFBbEIsRUFBd0I7QUFDcEIsZUFBS0EsR0FBTCxFQUFVQyxLQUFLLENBQUNrRixXQUFoQixJQUErQixJQUEvQjtBQUNIO0FBQ0o7QUFDSjtBQUNKLEdBaHRCTSxDQWt0QlA7O0FBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTN0Qlc7O0FBQUEsUUE0dEJBQyxLQTV0QkEsR0E0dEJQLGVBQWFwRSxFQUFiLEVBQWlCO0FBQ2JxRSxXQUFPLENBQUNDLElBQVIsQ0FDSSx5RUFESjtBQUdBLFdBQU8sS0FBS3JFLFFBQUwsQ0FBY0QsRUFBZCxDQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQXR1Qlc7O0FBQUEsU0F1dUJQdUUsWUF2dUJPLEdBdXVCUCx3QkFBZTtBQUNYLFVBQU0sSUFBSWpILEtBQUosQ0FDRixrRUFDSSxxQ0FGRixDQUFOO0FBSUgsR0E1dUJNOztBQUFBO0FBQUE7QUFBQSxTQTRhUCxZQUFVO0FBQ04sWUFBTXNDLFNBQVMsR0FBRyxLQUFLbkUsUUFBTCxFQUFsQixDQURNLENBR047O0FBQ0EsYUFBT21FLFNBQVMsQ0FBQ1ksaUJBQVYsQ0FBNEI7QUFDL0IsU0FBQ1osU0FBUyxDQUFDbEUsV0FBWCxHQUF5QixLQUFLTyxLQUFMO0FBRE0sT0FBNUIsRUFFSixDQUZJLENBQVA7QUFHSDtBQW5iTTtBQUFBO0FBQUEsU0F5SFAsWUFBeUI7QUFDckIsVUFBSSxPQUFPLEtBQUtvQixRQUFaLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3RDLGNBQU0sSUFBSUMsS0FBSixDQUNGLENBQ0ssb0JBQW1CLEtBQUszQixTQUFVLDJDQUR2QyxFQUVJLDhEQUZKLEVBR0ssY0FBYSxLQUFLQSxTQUFVLDJCQUhqQyxFQUlFNEIsSUFKRixDQUlPLEVBSlAsQ0FERSxDQUFOO0FBT0g7O0FBQ0QsYUFBTyxLQUFLQyxPQUFMLENBQWFnSCxFQUFiLENBQWdCQyxRQUFoQixDQUF5QixLQUFLOUksU0FBOUIsRUFBeUNELFdBQWhEO0FBQ0g7QUFwSU07QUFBQTtBQUFBLFNBMkpQLFlBQXFCO0FBQ2pCLGFBQU8sS0FBSzJCLFFBQVo7QUFDSDtBQTdKTTtBQUFBO0FBQUEsU0FxTFAsWUFBbUI7QUFDZixhQUFPLEtBQUtXLFdBQUwsRUFBUDtBQUNIO0FBdkxNOztBQUFBO0FBQUEsR0FBWDs7QUErdUJBOUIsS0FBSyxDQUFDNEMsTUFBTixHQUFlO0FBQ1hrQixJQUFFLEVBQUUwRSxvREFBSTtBQURHLENBQWY7QUFHQXhJLEtBQUssQ0FBQ29DLGFBQU4sR0FBc0IsRUFBdEI7QUFDQXBDLEtBQUssQ0FBQytCLGFBQU4sR0FBc0IwRyxpREFBdEI7QUFFZXpJLG9FQUFmIiwiZmlsZSI6Ii4vc3JjL01vZGVsLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlc3Npb24gZnJvbSBcIi4vU2Vzc2lvblwiO1xuaW1wb3J0IFF1ZXJ5U2V0IGZyb20gXCIuL1F1ZXJ5U2V0XCI7XG5cbmltcG9ydCB7IGF0dHIgfSBmcm9tIFwiLi9maWVsZHNcIjtcbmltcG9ydCBGb3JlaWduS2V5IGZyb20gXCIuL2ZpZWxkcy9Gb3JlaWduS2V5XCI7XG5pbXBvcnQgTWFueVRvTWFueSBmcm9tIFwiLi9maWVsZHMvTWFueVRvTWFueVwiO1xuaW1wb3J0IE9uZVRvT25lIGZyb20gXCIuL2ZpZWxkcy9PbmVUb09uZVwiO1xuXG5pbXBvcnQgeyBDUkVBVEUsIFVQREFURSwgREVMRVRFLCBGSUxURVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gICAgbm9ybWFsaXplRW50aXR5LFxuICAgIGFycmF5RGlmZkFjdGlvbnMsXG4gICAgb2JqZWN0U2hhbGxvd0VxdWFscyxcbiAgICB3YXJuRGVwcmVjYXRlZCxcbiAgICBtMm1OYW1lLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHF1ZXJ5IHNwZWNpZmljYXRpb24gdG8gZ2V0IHRoZSBpbnN0YW5jZSdzXG4gKiBjb3JyZXNwb25kaW5nIHRhYmxlIHJvdyB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldEJ5SWRRdWVyeShtb2RlbEluc3RhbmNlKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsSW5zdGFuY2UuZ2V0Q2xhc3MoKTtcbiAgICBjb25zdCB7IGlkQXR0cmlidXRlLCBtb2RlbE5hbWUgfSA9IG1vZGVsQ2xhc3M7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0YWJsZTogbW9kZWxOYW1lLFxuICAgICAgICBjbGF1c2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogRklMVEVSLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgW2lkQXR0cmlidXRlXTogbW9kZWxJbnN0YW5jZS5nZXRJZCgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH07XG59XG5cbi8qKlxuICogVGhlIGhlYXJ0IG9mIGFuIE9STSwgdGhlIGRhdGEgbW9kZWwuXG4gKlxuICogVGhlIGZpZWxkcyB5b3Ugc3BlY2lmeSB0byB0aGUgTW9kZWwgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlXG4gKiBhIHNjaGVtYSB0byB0aGUgZGF0YWJhc2UsIHJlbGF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLCBhbmRcbiAqIHBvc3NpYmx5IHRocm91Z2ggbW9kZWxzLlxuICpcbiAqIEluIGVhY2gge0BsaW5rIFNlc3Npb259IHlvdSBpbnN0YW50aWF0ZSBmcm9tIGFuIHtAbGluayBPUk19IGluc3RhbmNlLFxuICogeW91IHdpbGwgcmVjZWl2ZSBhIHNlc3Npb24tc3BlY2lmaWMgc3ViY2xhc3Mgb2YgdGhpcyBNb2RlbC4gVGhlIG1ldGhvZHNcbiAqIHlvdSBkZWZpbmUgaGVyZSB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3UgaW4gc2Vzc2lvbnMuXG4gKlxuICogQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1vZGVsfSByZXByZXNlbnRzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZSwgdGhvdWdoXG4gKiBpdCBpcyBwb3NzaWJsZSB0byBnZW5lcmF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMgZnJvbSB0aGUgc2FtZSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlLlxuICpcbiAqIFRvIGNyZWF0ZSBkYXRhIG1vZGVscyBpbiB5b3VyIHNjaGVtYSwgc3ViY2xhc3Mge0BsaW5rIE1vZGVsfS4gVG8gZGVmaW5lXG4gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSBtb2RlbCwgb3ZlcnJpZGUgc3RhdGljIGNsYXNzIG1ldGhvZHMuIERlZmluZSBpbnN0YW5jZVxuICogbG9naWMgYnkgZGVmaW5pbmcgcHJvdG90eXBlIG1ldGhvZHMgKHdpdGhvdXQgYHN0YXRpY2Aga2V5d29yZCkuXG4gKi9cbmNvbnN0IE1vZGVsID0gY2xhc3MgTW9kZWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBNb2RlbCBpbnN0YW5jZSBmcm9tIGl0J3MgcHJvcGVydGllcy5cbiAgICAgKiBEb24ndCB1c2UgdGhpcyB0byBjcmVhdGUgYSBuZXcgcmVjb3JkOyBVc2UgdGhlIHN0YXRpYyBtZXRob2Qge0BsaW5rIE1vZGVsI2NyZWF0ZX0uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBwcm9wcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIGluc3RhbnRpYXRlIHdpdGhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLl9pbml0RmllbGRzKHByb3BzKTtcbiAgICB9XG5cbiAgICBfaW5pdEZpZWxkcyhwcm9wcykge1xuICAgICAgICBjb25zdCBwcm9wc09iaiA9IE9iamVjdChwcm9wcyk7XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IHsgLi4ucHJvcHNPYmogfTtcblxuICAgICAgICBPYmplY3Qua2V5cyhwcm9wc09iaikuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGdvdCBhIHByb3AgdGhhdCB3YXNuJ3QgZGVmaW5lZCBhcyBhIGZpZWxkLlxuICAgICAgICAgICAgLy8gQXNzdW1pbmcgaXQncyBhbiBhcmJpdHJhcnkgZGF0YSBmaWVsZCwgbWFraW5nIGFuIGluc3RhbmNlLXNwZWNpZmljXG4gICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBpdC5cbiAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBpbiBvcGVyYXRvciBhcyB0aGUgcHJvcGVydHkgY291bGQgYmUgZGVmaW5lZCBhbnl3aGVyZVxuICAgICAgICAgICAgLy8gb24gdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICAgIGlmICghKGZpZWxkTmFtZSBpbiB0aGlzKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBmaWVsZE5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLl9maWVsZHNbZmllbGROYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiAodmFsdWUpID0+IHRoaXMuc2V0KGZpZWxkTmFtZSwgdmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBNb2RlbENsYXNzOiAke3RoaXMubW9kZWxOYW1lfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIHRhYmxlIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoaXMgTW9kZWwgY2xhc3MuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IG9iamVjdCBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGUgZGF0YWJhc2VcbiAgICAgKiB3aWxsIHVzZSBkZWZhdWx0IG9wdGlvbnMuIFlvdSBjYW4gZWl0aGVyIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvcHRpb25zXG4gICAgICogeW91IHdhbnQgdG8gdXNlLCBvciBhc3NpZ24gdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGEgc3RhdGljIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUgdG8gdGhlXG4gICAgICogTW9kZWwgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIGRhdGFiYXNlIGZvciB0aGUgdGFibGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGlzIE1vZGVsIGNsYXNzLlxuICAgICAqL1xuICAgIHN0YXRpYyBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbWFyayBpbmRpdmlkdWFsIGluc3RhbmNlcyBhcyBhY2Nlc3NlZC5cbiAgICAgKiBUaGlzIGFsbG93cyBpbnZhbGlkYXRpbmcgc2VsZWN0b3IgbWVtb2l6YXRpb24gd2l0aGluIG11dGFibGUgc2Vzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjwqPn0gaWRzIC0gQXJyYXkgb2YgcHJpbWFyeSBrZXkgdmFsdWVzXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBtYXJrQWNjZXNzZWQoaWRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIG1hcmsgcm93cyBvZiB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgYXMgYWNjZXNzZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtBY2Nlc3NlZFxcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5tYXJrQWNjZXNzZWQodGhpcy5tb2RlbE5hbWUsIGlkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgbWFyayB0aGlzIG1vZGVsJ3MgdGFibGUgYXMgc2Nhbm5lZC5cbiAgICAgKiBUaGlzIGFsbG93cyBpbnZhbGlkYXRpbmcgc2VsZWN0b3IgbWVtb2l6YXRpb24gd2l0aGluIG11dGFibGUgc2Vzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIG1hcmtGdWxsVGFibGVTY2FubmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3Nlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBtYXJrIHRoZSAke3RoaXMubW9kZWxOYW1lfSBtb2RlbCBhcyBmdWxsIHRhYmxlIHNjYW5uZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtGdWxsVGFibGVTY2FubmVkXFxgIGluc3RlYWQuYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXNzaW9uLm1hcmtGdWxsVGFibGVTY2FubmVkKHRoaXMubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSBtYXJrIGluZGV4ZXMgYXMgYWNjZXNzZWQuXG4gICAgICogVGhpcyBhbGxvd3MgaW52YWxpZGF0aW5nIHNlbGVjdG9yIG1lbW9pemF0aW9uIHdpdGhpbiBtdXRhYmxlIHNlc3Npb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48QXJyYXkuPCosKj4+fSBpbmRleGVzIC0gQXJyYXkgb2YgY29sdW1uLXZhbHVlIHBhaXJzXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHN0YXRpYyBtYXJrQWNjZXNzZWRJbmRleGVzKGluZGV4ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gbWFyayBpbmRleGVzIGZvciB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgYXMgYWNjZXNzZWQgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLm1hcmtBY2Nlc3NlZEluZGV4ZXNcXGAgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlc3Npb24ubWFya0FjY2Vzc2VkSW5kZXhlcyhcbiAgICAgICAgICAgIGluZGV4ZXMubWFwKChbYXR0cmlidXRlLCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGlzIHtAbGluayBNb2RlbH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhpcyB7QGxpbmsgTW9kZWx9LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgaWRBdHRyaWJ1dGUoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIGdldCB0aGUgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwncyBpZCBhdHRyaWJ1dGUgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBhY2Nlc3MgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsTmFtZX1cIl0uaWRBdHRyaWJ1dGVcXGAgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmRiLmRlc2NyaWJlKHRoaXMubW9kZWxOYW1lKS5pZEF0dHJpYnV0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRoZSBtb2RlbCBjbGFzcyB0byBhIHtAbGluayBTZXNzaW9ufS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtICB7U2Vzc2lvbn0gc2Vzc2lvbiAtIFRoZSBzZXNzaW9uIHRvIGNvbm5lY3QgdG8uXG4gICAgICovXG4gICAgc3RhdGljIGNvbm5lY3Qoc2Vzc2lvbikge1xuICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgU2Vzc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkEgbW9kZWwgY2FuIG9ubHkgYmUgY29ubmVjdGVkIHRvIGluc3RhbmNlcyBvZiBTZXNzaW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB7QGxpbmsgU2Vzc2lvbn0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge1Nlc3Npb259IFRoZSBjdXJyZW50IHtAbGluayBTZXNzaW9ufSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IHNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsJ3MgYHF1ZXJ5U2V0Q2xhc3NgIGZpZWxkLlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSB7QGxpbmsgUXVlcnlTZXR9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwncyBgcXVlcnlTZXRDbGFzc2AuXG4gICAgICovXG4gICAgc3RhdGljIGdldFF1ZXJ5U2V0KCkge1xuICAgICAgICBjb25zdCB7IHF1ZXJ5U2V0Q2xhc3M6IFF1ZXJ5U2V0Q2xhc3MgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlTZXRDbGFzcyh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgc3RhdGljIGludmFsaWRhdGVDbGFzc0NhY2hlKCkge1xuICAgICAgICB0aGlzLmlzU2V0VXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmlydHVhbEZpZWxkcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1vZGVsLmdldFF1ZXJ5U2V0fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5U2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB7QGxpbmsgVGFibGV9IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgdGFibGVPcHRpb25zKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmFja2VuZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgICAgICBcImBNb2RlbC5iYWNrZW5kYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgcmVuYW1lIHRvIGAub3B0aW9uc2AuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYmFja2VuZCkge1xuICAgICAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICAgICAgXCJgTW9kZWwuYmFja2VuZGAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHJlbmFtZSB0byBgLm9wdGlvbnNgLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2UsIGluc3RhbnRpYXRlcyBhIHtAbGluayBNb2RlbH0gYW5kIHJldHVybnMgaXQuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyB2YWx1ZXMgZm9yIG1hbnktdG8tbWFueSBmaWVsZHMsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiB0aGUgdGhyb3VnaFxuICAgICAqIG1vZGVsIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJQcm9wcyAtIHRoZSBuZXcge0BsaW5rIE1vZGVsfSdzIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybiB7TW9kZWx9IGEgbmV3IHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh1c2VyUHJvcHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGEgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgaW5zdGFuY2Ugd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLmNyZWF0ZVxcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0geyAuLi51c2VyUHJvcHMgfTtcblxuICAgICAgICBjb25zdCBtMm1SZWxhdGlvbnMgPSB7fTtcblxuICAgICAgICBjb25zdCBkZWNsYXJlZEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcyk7XG4gICAgICAgIGNvbnN0IGRlY2xhcmVkVmlydHVhbEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnZpcnR1YWxGaWVsZHMpO1xuXG4gICAgICAgIGRlY2xhcmVkRmllbGROYW1lcy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUGFzc2VkID0gdXNlclByb3BzLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgICAgICAgICBpZiAoIShmaWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlUGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXNlclByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW2tleV0gPSBub3JtYWxpemVFbnRpdHkodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wc1trZXldID0gZmllbGQuZ2V0RGVmYXVsdCh1c2VyUHJvcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVQYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICAgICAgICAgICAgbTJtUmVsYXRpb25zW2tleV0gPSB1c2VyUHJvcHNba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICghZmllbGQuYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFRoZSByZWxhdGlvbnNoaXAgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NvclxuICAgICAgICAgICAgICAgICAgICAgKiBEaXNjYXJkIHRoZSB2YWx1ZSBmcm9tIHByb3BzIGFzIHRoZSBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBsYXRlciB3aXRoIGluc3RhbmNlc1xuICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSB0YXJnZXQgbW9kZWxzIHdoZW4gcmVmcmVzaGluZyB0aGUgTTJNIHJlbGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlIHJlbGF0aW9uc2hpcCBkb2VzIGhhdmUgYW4gYWNjZXNzb3IgKGBhc2ApIGZpZWxkIHRoZW4gd2UgZG8gd2FudCB0byBrZWVwIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICogb3JpZ2luYWwgdmFsdWUgaW4gdGhlIHByb3BzIHRvIGV4cG9zZSB0aGUgcmF3IGxpc3Qgb2YgSURzIGZyb20gdGhlIGluc3RhbmNlLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBhZGQgYmFja3dhcmQgbWFueS1tYW55IGlmIHJlcXVpcmVkXG4gICAgICAgIGRlY2xhcmVkVmlydHVhbEZpZWxkTmFtZXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW0ybVJlbGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLnZpcnR1YWxGaWVsZHNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHVzZXJQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkIGluc3RhbmNlb2YgTWFueVRvTWFueVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIHZhbHVlIGlzIHN1cHBsaWVkIGZvciBhIE1hbnlUb01hbnkgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgdGhlbSBmcm9tIHByb3BzIGFuZCBzYXZlIGZvciBsYXRlciBwcm9jZXNzaW5nLlxuICAgICAgICAgICAgICAgICAgICBtMm1SZWxhdGlvbnNba2V5XSA9IHVzZXJQcm9wc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5ld0VudHJ5ID0gdGhpcy5zZXNzaW9uLmFwcGx5VXBkYXRlKHtcbiAgICAgICAgICAgIGFjdGlvbjogQ1JFQVRFLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgcGF5bG9hZDogcHJvcHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRoaXNNb2RlbChuZXdFbnRyeSk7XG4gICAgICAgIGluc3RhbmNlLl9yZWZyZXNoTWFueTJNYW55KG0ybVJlbGF0aW9ucyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgb3IgdXBkYXRlIGV4aXN0aW5nIHJlY29yZCBpbiB0aGUgZGF0YWJhc2UsIGluc3RhbnRpYXRlcyBhIHtAbGluayBNb2RlbH0gYW5kIHJldHVybnMgaXQuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyB2YWx1ZXMgZm9yIG1hbnktdG8tbWFueSBmaWVsZHMsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiB0aGUgdGhyb3VnaFxuICAgICAqIG1vZGVsIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHVzZXJQcm9wcyAtIHRoZSByZXF1aXJlZCB7QGxpbmsgTW9kZWx9J3MgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJuIHtNb2RlbH0gYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlLlxuICAgICAqL1xuICAgIHN0YXRpYyB1cHNlcnQodXNlclByb3BzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gdXBzZXJ0IGEgJHt0aGlzLm1vZGVsTmFtZX0gbW9kZWwgaW5zdGFuY2Ugd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLnVwc2VydFxcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpZEF0dHJpYnV0ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKHVzZXJQcm9wcy5oYXNPd25Qcm9wZXJ0eShpZEF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdXNlclByb3BzW2lkQXR0cmlidXRlXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkRXhpc3RzKGlkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy53aXRoSWQoaWQpO1xuICAgICAgICAgICAgICAgIG1vZGVsLnVwZGF0ZSh1c2VyUHJvcHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh1c2VyUHJvcHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIGZvciB0aGUgb2JqZWN0IHdpdGggaWQgYGlkYC5cbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgbW9kZWwgaGFzIG5vIGluc3RhbmNlIHdpdGggaWQgYGlkYC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIHtAbGluayBNb2RlbCNpZEV4aXN0c30gdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gaWQgLSB0aGUgYGlkYCBvZiB0aGUgb2JqZWN0IHRvIGdldFxuICAgICAqIEB0aHJvd3MgSWYgb2JqZWN0IHdpdGggaWQgYGlkYCBkb2Vzbid0IGV4aXN0XG4gICAgICogQHJldHVybiB7TW9kZWx8bnVsbH0ge0BsaW5rIE1vZGVsfSBpbnN0YW5jZSB3aXRoIGlkIGBpZGBcbiAgICAgKi9cbiAgICBzdGF0aWMgd2l0aElkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCh7XG4gICAgICAgICAgICBbdGhpcy5pZEF0dHJpYnV0ZV06IGlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGFuIGVudGl0eVxuICAgICAqIHdpdGggdGhlIGlkIGBpZGAgZXhpc3RzIGluIHRoZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgeyp9ICBpZCAtIGEgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaWQgYXR0cmlidXRlIG9mIHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVudGl0eSB3aXRoIGBpZGAgZXhpc3RzIGluIHRoZSBzdGF0ZVxuICAgICAqXG4gICAgICogQHNpbmNlIDAuMTEuMFxuICAgICAqL1xuICAgIHN0YXRpYyBpZEV4aXN0cyhpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMoe1xuICAgICAgICAgICAgW3RoaXMuaWRBdHRyaWJ1dGVdOiBpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhbiBlbnRpdHlcbiAgICAgKiB3aXRoIHRoZSBnaXZlbiBwcm9wcyBleGlzdHMgaW4gdGhlIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Kn0gIHByb3BzIC0gYSBrZXktdmFsdWUgdGhhdCB7QGxpbmsgTW9kZWx9IGluc3RhbmNlcyBzaG91bGQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGFzIGV4aXN0aW5nLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVudGl0eSB3aXRoIGBwcm9wc2AgZXhpc3RzIGluIHRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBleGlzdHMobG9va3VwT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gY2hlY2sgaWYgYSAke3RoaXMubW9kZWxOYW1lfSBtb2RlbCBpbnN0YW5jZSBleGlzdHMgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCBjYWxsIFwiLFxuICAgICAgICAgICAgICAgICAgICBgXFxgc2Vzc2lvbltcIiR7dGhpcy5tb2RlbE5hbWV9XCJdLmV4aXN0c1xcYCBpbnN0ZWFkLmAsXG4gICAgICAgICAgICAgICAgXS5qb2luKFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZmluZERhdGFiYXNlUm93cyhsb29rdXBPYmopLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUge0BsaW5rIE1vZGVsfSBpbnN0YW5jZSB0aGF0IG1hdGNoZXMgcHJvcGVydGllcyBpbiBgbG9va3VwT2JqYC5cbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYge0BsaW5rIE1vZGVsfSBpZiBtdWx0aXBsZSByZWNvcmRzIG1hdGNoXG4gICAgICogdGhlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGxvb2t1cE9iaiAtIHRoZSBwcm9wZXJ0aWVzIHVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgZW50aXR5LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBtb3JlIHRoYW4gb25lIGVudGl0eSBtYXRjaGVzIHRoZSBwcm9wZXJ0aWVzIGluIGBsb29rdXBPYmpgLlxuICAgICAqIEByZXR1cm4ge01vZGVsfSBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdGhhdCBtYXRjaGVzIHRoZSBwcm9wZXJ0aWVzIGluIGBsb29rdXBPYmpgLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQobG9va3VwT2JqKSB7XG4gICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHRoaXM7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuX2ZpbmREYXRhYmFzZVJvd3MobG9va3VwT2JqKTtcbiAgICAgICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgYSBzaW5nbGUgcm93IGluIFxcYCR7dGhpcy5tb2RlbE5hbWV9LmdldFxcYC4gRm91bmQgJHtyb3dzLmxlbmd0aH0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGhpc01vZGVsKHJvd3NbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHtAbGluayBNb2RlbH0gY2xhc3Mgb3Igc3ViY2xhc3MgY29uc3RydWN0b3IgKHRoZSBjbGFzcyB0aGF0XG4gICAgICogaW5zdGFudGlhdGVkIHRoaXMgaW5zdGFuY2UpLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TW9kZWx9IFRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzIG9yIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHVzZWQgdG8gaW5zdGFudGlhdGVcbiAgICAgKiAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXRDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaWQgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UgYnkgbG9va2luZyB1cCB0aGUgaWQgYXR0cmlidXRlLlxuICAgICAqIEByZXR1cm4geyp9IFRoZSBpZCB2YWx1ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkc1t0aGlzLmdldENsYXNzKCkuaWRBdHRyaWJ1dGVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBsYWluIEpTIG9iamVjdCBpbiB0aGUgc3RvcmUuXG4gICAgICogSXQgY29udGFpbnMgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgeW91IHBhc3Mgd2hlbiBjcmVhdGluZyB0aGUgbW9kZWwsXG4gICAgICogZXhjZXB0IGZvciBwcmltYXJ5IGtleXMgb2YgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcHMgd2l0aCBhIGN1c3RvbSBhY2Nlc3Nvci5cbiAgICAgKlxuICAgICAqIE1ha2Ugc3VyZSBuZXZlciB0byBtdXRhdGUgdGhpcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gYSByZWZlcmVuY2UgdG8gdGhlIHBsYWluIEpTIG9iamVjdCBpbiB0aGUgc3RvcmVcbiAgICAgKi9cbiAgICBnZXQgcmVmKCkge1xuICAgICAgICBjb25zdCBUaGlzTW9kZWwgPSB0aGlzLmdldENsYXNzKCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG4gICAgICAgIHJldHVybiBUaGlzTW9kZWwuX2ZpbmREYXRhYmFzZVJvd3Moe1xuICAgICAgICAgICAgW1RoaXNNb2RlbC5pZEF0dHJpYnV0ZV06IHRoaXMuZ2V0SWQoKSxcbiAgICAgICAgfSlbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgYWxsIHJvd3MgaW4gdGhpcyBtb2RlbCdzIHRhYmxlIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGBsb29rdXBPYmpgLlxuICAgICAqIElmIG5vIGBsb29rdXBPYmpgIGlzIHBhc3NlZCwgYWxsIHJvd3MgaW4gdGhlIG1vZGVsJ3MgdGFibGUgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAgeyp9ICBwcm9wcyAtIGEga2V5LXZhbHVlIHRoYXQge0BsaW5rIE1vZGVsfSBpbnN0YW5jZXMgc2hvdWxkIGhhdmUgdG8gYmUgY29uc2lkZXJlZCBhcyBleGlzdGluZy5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBlbnRpdHkgd2l0aCBgcHJvcHNgIGV4aXN0cyBpbiB0aGUgc3RhdGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfZmluZERhdGFiYXNlUm93cyhsb29rdXBPYmopIHtcbiAgICAgICAgY29uc3QgcXVlcnlTcGVjID0ge1xuICAgICAgICAgICAgdGFibGU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobG9va3VwT2JqKSB7XG4gICAgICAgICAgICBxdWVyeVNwZWMuY2xhdXNlcyA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZJTFRFUixcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogbG9va3VwT2JqLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ucXVlcnkocXVlcnlTcGVjKS5yb3dzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbH0gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgVGhpc01vZGVsID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBUaGlzTW9kZWwubW9kZWxOYW1lO1xuICAgICAgICBjb25zdCBmaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoVGhpc01vZGVsLmZpZWxkcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IGZpZWxkTmFtZXNcbiAgICAgICAgICAgIC5tYXAoKGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gVGhpc01vZGVsLmZpZWxkc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gdGhpc1tmaWVsZE5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Nb2RlbEFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1vZGVsKSA9PiBtb2RlbC5nZXRJZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2ZpZWxkTmFtZX06IFske2lkcy5qb2luKFwiLCBcIil9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX2ZpZWxkc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtmaWVsZE5hbWV9OiAke3ZhbH1gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBgJHtjbGFzc05hbWV9OiB7JHtmaWVsZHN9fWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBgb3RoZXJNb2RlbGAgZXF1YWxzIHRoaXMge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKiBFcXVhbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHNoYWxsb3cgY29tcGFyaW5nIHRoZWlyIGF0dHJpYnV0ZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIGVxdWFsaXR5IGlzIHVzZWQgd2hlbiB5b3UgY2FsbCB7QGxpbmsgTW9kZWwjdXBkYXRlfS5cbiAgICAgKiBZb3UgY2FuIHByZXZlbnQgbW9kZWwgdXBkYXRlcyBieSByZXR1cm5pbmcgYHRydWVgIGhlcmUuXG4gICAgICogSG93ZXZlciwgYSBtb2RlbCB3aWxsIGFsd2F5cyBiZSB1cGRhdGVkIGlmIGl0cyByZWxhdGlvbnNoaXBzIGFyZSBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7TW9kZWx9IG90aGVyTW9kZWwgLSBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlJ3MgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIGVxdWFscyhvdGhlck1vZGVsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICByZXR1cm4gb2JqZWN0U2hhbGxvd0VxdWFscyh0aGlzLl9maWVsZHMsIG90aGVyTW9kZWwuX2ZpZWxkcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHByb3BlcnR5IG5hbWUgdG8gZ2l2ZW4gdmFsdWUgZm9yIHRoaXMge0BsaW5rIE1vZGVsfSBpbnN0YW5jZS5cbiAgICAgKiBUaGUgdmFsdWVzIGFyZSBpbW1lZGlhdGVseSBjb21taXR0ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAtIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgcHJvcGVydHlcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgc2V0KHByb3BlcnR5TmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoe1xuICAgICAgICAgICAgW3Byb3BlcnR5TmFtZV06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG11bHRpcGxlIGZpZWxkcyBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZXMgdG8gdGhpcyB7QGxpbmsgTW9kZWx9IGluc3RhbmNlLlxuICAgICAqIFRoZSB1cGRhdGVzIGFyZSBpbW1lZGlhdGVseSBjb21taXR0ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB1c2VyTWVyZ2VPYmogLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoaXMgaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHVwZGF0ZSh1c2VyTWVyZ2VPYmopIHtcbiAgICAgICAgY29uc3QgVGhpc01vZGVsID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICBpZiAodHlwZW9mIFRoaXNNb2RlbC5zZXNzaW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gdXBkYXRlIGEgJHtUaGlzTW9kZWwubW9kZWxOYW1lfSBtb2RlbCBpbnN0YW5jZSB3aXRob3V0IGEgc2Vzc2lvbi4gYCxcbiAgICAgICAgICAgICAgICAgICAgXCJZb3UgY2Fubm90IGNhbGwgYC51cGRhdGVgIG9uIGFuIGluc3RhbmNlIHRoYXQgeW91IGRpZCBub3QgcmVjZWl2ZSBmcm9tIHRoZSBkYXRhYmFzZS5cIixcbiAgICAgICAgICAgICAgICBdLmpvaW4oXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXJnZU9iaiA9IHsgLi4udXNlck1lcmdlT2JqIH07XG5cbiAgICAgICAgY29uc3QgeyBmaWVsZHMsIHZpcnR1YWxGaWVsZHMgfSA9IFRoaXNNb2RlbDtcblxuICAgICAgICBjb25zdCBtMm1SZWxhdGlvbnMgPSB7fTtcblxuICAgICAgICAvLyBJZiBhbiBhcnJheSBvZiBlbnRpdGllcyBvciBpZCdzIGlzIHN1cHBsaWVkIGZvciBhXG4gICAgICAgIC8vIG1hbnktdG8tbWFueSByZWxhdGVkIGZpZWxkLCBjbGVhciB0aGUgb2xkIHJlbGF0aW9uc1xuICAgICAgICAvLyBhbmQgYWRkIHRoZSBuZXcgb25lcy5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbiwgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgZm9yIChjb25zdCBtZXJnZUtleSBpbiBtZXJnZU9iaikge1xuICAgICAgICAgICAgY29uc3QgaXNSZWFsRmllbGQgPSBmaWVsZHMuaGFzT3duUHJvcGVydHkobWVyZ2VLZXkpO1xuXG4gICAgICAgICAgICBpZiAoaXNSZWFsRmllbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1ttZXJnZUtleV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBGb3JlaWduS2V5IHx8IGZpZWxkIGluc3RhbmNlb2YgT25lVG9PbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG9uZS1vbmUvZmsgcmVsYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlT2JqW21lcmdlS2V5XSA9IG5vcm1hbGl6ZUVudGl0eShtZXJnZU9ialttZXJnZUtleV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgaW5zdGFuY2VvZiBNYW55VG9NYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIGZvcndhcmQgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgbTJtUmVsYXRpb25zW21lcmdlS2V5XSA9IG1lcmdlT2JqW21lcmdlS2V5XTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSByZWxhdGlvbnNoaXAgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NvclxuICAgICAgICAgICAgICAgICAgICAgICAgICogRGlzY2FyZCB0aGUgdmFsdWUgZnJvbSBwcm9wcyBhcyB0aGUgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgbGF0ZXIgd2l0aCBpbnN0YW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIHRhcmdldCBtb2RlbHMgd2hlbiByZWZyZXNoaW5nIHRoZSBNMk0gcmVsYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlIHJlbGF0aW9uc2hpcCBkb2VzIGhhdmUgYW4gYWNjZXNzb3IgKGBhc2ApIGZpZWxkIHRoZW4gd2UgZG8gd2FudCB0byBrZWVwIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yaWdpbmFsIHZhbHVlIGluIHRoZSBwcm9wcyB0byBleHBvc2UgdGhlIHJhdyBsaXN0IG9mIElEcyBmcm9tIHRoZSBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lcmdlT2JqW21lcmdlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmlydHVhbEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShtZXJnZUtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHZpcnR1YWxGaWVsZHNbbWVyZ2VLZXldO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgaXMgYmFja3dhcmQgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgbTJtUmVsYXRpb25zW21lcmdlS2V5XSA9IG1lcmdlT2JqW21lcmdlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lcmdlT2JqW21lcmdlS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXJnZWRGaWVsZHMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLl9maWVsZHMsXG4gICAgICAgICAgICAuLi5tZXJnZU9iaixcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVkTW9kZWwgPSBuZXcgVGhpc01vZGVsKG1lcmdlZEZpZWxkcyk7XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIGZpZWxkcyBpZiB0aGV5IGhhdmUgY2hhbmdlZCAocmVmZXJlbnRpYWxseSlcbiAgICAgICAgaWYgKCF0aGlzLmVxdWFscyh1cGRhdGVkTW9kZWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0RmllbGRzKG1lcmdlZEZpZWxkcyk7XG4gICAgICAgICAgICBUaGlzTW9kZWwuc2Vzc2lvbi5hcHBseVVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBVUERBVEUsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGdldEJ5SWRRdWVyeSh0aGlzKSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBtZXJnZU9iaixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHZpcnR1YWwgZmllbGRzXG4gICAgICAgIHRoaXMuX3JlZnJlc2hNYW55Mk1hbnkobTJtUmVsYXRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXR0cmlidXRlcyB0byByZWZsZWN0IHRoZVxuICAgICAqIGRhdGFiYXNlIHN0YXRlIGluIHRoZSBjdXJyZW50IHNlc3Npb24uXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHJlZnJlc2hGcm9tU3RhdGUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRGaWVsZHModGhpcy5yZWYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIHJlY29yZCBmb3IgdGhpcyB7QGxpbmsgTW9kZWx9IGluc3RhbmNlLlxuICAgICAqIFlvdSdsbCBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyBmaWVsZHMgYW5kIHZhbHVlcyBvbiB0aGUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgZGVsZXRlKCkge1xuICAgICAgICBjb25zdCBUaGlzTW9kZWwgPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIGlmICh0eXBlb2YgVGhpc01vZGVsLnNlc3Npb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBkZWxldGUgYSAke1RoaXNNb2RlbC5tb2RlbE5hbWV9IG1vZGVsIGluc3RhbmNlIHdpdGhvdXQgYSBzZXNzaW9uLiBgLFxuICAgICAgICAgICAgICAgICAgICBcIllvdSBjYW5ub3QgY2FsbCBgLmRlbGV0ZWAgb24gYW4gaW5zdGFuY2UgdGhhdCB5b3UgZGlkIG5vdCByZWNlaXZlIGZyb20gdGhlIGRhdGFiYXNlLlwiLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uRGVsZXRlKCk7XG4gICAgICAgIFRoaXNNb2RlbC5zZXNzaW9uLmFwcGx5VXBkYXRlKHtcbiAgICAgICAgICAgIGFjdGlvbjogREVMRVRFLFxuICAgICAgICAgICAgcXVlcnk6IGdldEJ5SWRRdWVyeSh0aGlzKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG1hbnktbWFueSByZWxhdGlvbnMgZm9yIG1vZGVsLlxuICAgICAqIEBwYXJhbSByZWxhdGlvbnNcbiAgICAgKiBAcmV0dXJuIHVuZGVmaW5lZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlZnJlc2hNYW55Mk1hbnkocmVsYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHRoaXMuZ2V0Q2xhc3MoKTtcbiAgICAgICAgY29uc3QgeyBmaWVsZHMsIHZpcnR1YWxGaWVsZHMsIG1vZGVsTmFtZSB9ID0gVGhpc01vZGVsO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmV2ZXJzZSA9ICFmaWVsZHMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHZpcnR1YWxGaWVsZHNbbmFtZV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSByZWxhdGlvbnNbbmFtZV07XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXA6ICR7bW9kZWxOYW1lfVske25hbWV9XSBtdXN0IGJlIGFuIGFycmF5IChwYXNzZWQ6ICR7dmFsdWVzfSlgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5ld0lkcyA9IHZhbHVlcy5tYXAobm9ybWFsaXplRW50aXR5KTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KG5vcm1hbGl6ZWROZXdJZHMpXTtcblxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWROZXdJZHMubGVuZ3RoICE9PSB1bmlxdWVJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRm91bmQgZHVwbGljYXRlIGlkKHMpIHdoZW4gcGFzc2luZyBcIiR7bm9ybWFsaXplZE5ld0lkc31cIiB0byAke1RoaXNNb2RlbC5tb2RlbE5hbWV9LiR7bmFtZX0gdmFsdWVgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGhyb3VnaE1vZGVsTmFtZSA9XG4gICAgICAgICAgICAgICAgZmllbGQudGhyb3VnaCB8fCBtMm1OYW1lKFRoaXNNb2RlbC5tb2RlbE5hbWUsIG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgVGhyb3VnaE1vZGVsID0gVGhpc01vZGVsLnNlc3Npb25bdGhyb3VnaE1vZGVsTmFtZV07XG5cbiAgICAgICAgICAgIGxldCBmcm9tRmllbGQ7XG4gICAgICAgICAgICBsZXQgdG9GaWVsZDtcblxuICAgICAgICAgICAgaWYgKCFyZXZlcnNlKSB7XG4gICAgICAgICAgICAgICAgKHsgZnJvbTogZnJvbUZpZWxkLCB0bzogdG9GaWVsZCB9ID0gZmllbGQudGhyb3VnaEZpZWxkcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICh7IGZyb206IHRvRmllbGQsIHRvOiBmcm9tRmllbGQgfSA9IGZpZWxkLnRocm91Z2hGaWVsZHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWRzID0gVGhyb3VnaE1vZGVsLmZpbHRlcihcbiAgICAgICAgICAgICAgICAodGhyb3VnaCkgPT4gdGhyb3VnaFtmcm9tRmllbGRdID09PSB0aGlzW1RoaXNNb2RlbC5pZEF0dHJpYnV0ZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAudG9SZWZBcnJheSgpXG4gICAgICAgICAgICAgICAgLm1hcCgocmVmKSA9PiByZWZbdG9GaWVsZF0pO1xuXG4gICAgICAgICAgICBjb25zdCBkaWZmQWN0aW9ucyA9IGFycmF5RGlmZkFjdGlvbnMoY3VycmVudElkcywgbm9ybWFsaXplZE5ld0lkcyk7XG5cbiAgICAgICAgICAgIGlmIChkaWZmQWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVsZXRlOiBpZHNUb0RlbGV0ZSwgYWRkOiBpZHNUb0FkZCB9ID0gZGlmZkFjdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKGlkc1RvRGVsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tmaWVsZC5hcyB8fCBuYW1lXS5yZW1vdmUoLi4uaWRzVG9EZWxldGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpZHNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbZmllbGQuYXMgfHwgbmFtZV0uYWRkKC4uLmlkc1RvQWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkRlbGV0ZSgpIHtcbiAgICAgICAgY29uc3QgeyB2aXJ0dWFsRmllbGRzIH0gPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW4sIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZpcnR1YWxGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdmlydHVhbEZpZWxkc1trZXldO1xuICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgTWFueVRvTWFueSkge1xuICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBhbnkgbWFueS10by1tYW55IHJvd3MgdGhlIGVudGl0eSBpcyBpbmNsdWRlZCBpbi5cbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yS2V5ID0gZmllbGQuYXMgfHwga2V5O1xuICAgICAgICAgICAgICAgIHRoaXNbZGVzY3JpcHRvcktleV0uY2xlYXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgaW5zdGFuY2VvZiBGb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFFzID0gdGhpc1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkUXMuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFFzLnVwZGF0ZSh7IFtmaWVsZC5yZWxhdGVkTmFtZV06IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCBpbnN0YW5jZW9mIE9uZVRvT25lKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IG51bGwgdG8gYW55IGZvcmVpZ24ga2V5cyBvciBvbmUgdG8gb25lcyBwb2ludGVkIHRvXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNba2V5XVtmaWVsZC5yZWxhdGVkTmFtZV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERFUFJFQ0FURUQgQU5EIFJFTU9WRUQgTUVUSE9EU1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhbiBlbnRpdHlcbiAgICAgKiB3aXRoIHRoZSBpZCBgaWRgIGV4aXN0cyBpbiB0aGUgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHsqfSAgaWQgLSBhIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGUge0BsaW5rIE1vZGVsfSBjbGFzcy5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBlbnRpdHkgd2l0aCBgaWRgIGV4aXN0cyBpbiB0aGUgc3RhdGVcbiAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHtAbGluayBNb2RlbC5pZEV4aXN0c30gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzSWQoaWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJgTW9kZWwuaGFzSWRgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYE1vZGVsLmlkRXhpc3RzYCBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmlkRXhpc3RzKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUgdGhlIDAuOSBtaWdyYXRpb24gZ3VpZGUgb24gdGhlIEdpdEh1YiByZXBvLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBEdWUgdG8gZGVwcmVjYXRpb24uXG4gICAgICovXG4gICAgZ2V0TmV4dFN0YXRlKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImBNb2RlbC5wcm90b3R5cGUuZ2V0TmV4dFN0YXRlYCBoYXMgYmVlbiByZW1vdmVkLiBTZWUgdGhlIDAuOSBcIiArXG4gICAgICAgICAgICAgICAgXCJtaWdyYXRpb24gZ3VpZGUgb24gdGhlIEdpdEh1YiByZXBvLlwiXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuTW9kZWwuZmllbGRzID0ge1xuICAgIGlkOiBhdHRyKCksXG59O1xuTW9kZWwudmlydHVhbEZpZWxkcyA9IHt9O1xuTW9kZWwucXVlcnlTZXRDbGFzcyA9IFF1ZXJ5U2V0O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Model.js\n");
/***/ }),
@@ -4462,7 +4484,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DeprecatedSchema\", function() { return DeprecatedSchema; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ORM\", function() { return ORM; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Session */ \"./src/Session.js\");\n/* harmony import */ var _Model__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Model */ \"./src/Model.js\");\n/* harmony import */ var _db__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./db */ \"./src/db/index.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fields */ \"./src/fields/index.js\");\n/* harmony import */ var _fields_Field__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fields/Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selectors */ \"./src/selectors/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n/* eslint-disable max-classes-per-file */\n\n\n\n\n\n\n\n\n\nconst ORM_DEFAULTS = {\n createDatabase: _db__WEBPACK_IMPORTED_MODULE_4__[\"createDatabase\"]\n};\nconst RESERVED_TABLE_OPTIONS = [\"indexes\", \"meta\"];\n\nconst isReservedTableOption = word => RESERVED_TABLE_OPTIONS.includes(word);\n/**\n * ORM - the Object Relational Mapper.\n *\n * Use instances of this class to:\n *\n * - Register your {@link Model} classes using {@link ORM#register}\n * - Get the empty state for the underlying database with {@link ORM#getEmptyState}\n * - Start an immutable database session with {@link ORM#session}\n * - Start a mutating database session with {@link ORM#mutableSession}\n *\n * Internally, this class handles generating a schema specification from models\n * to the database.\n */\n\n\nlet ORM = /*#__PURE__*/function () {\n /**\n * Creates a new ORM instance.\n *\n * @param {Object} [opts]\n * @param {Function} [opts.stateSelector] - function that given a Redux state tree\n * will return the ORM state's subtree,\n * e.g. `state => state.orm`\n * (necessary if you want to use selectors)\n * @param {Function} [opts.createDatabase] - function that creates a database\n */\n function ORM(opts) {\n const {\n createDatabase\n } = { ...ORM_DEFAULTS,\n ...(opts || {})\n };\n this.createDatabase = createDatabase;\n this.registry = [];\n this.implicitThroughModels = [];\n this.installedFields = {};\n this.stateSelector = opts ? opts.stateSelector : null;\n }\n /**\n * Registers a {@link Model} class to the ORM.\n *\n * If the model has declared any ManyToMany fields, their\n * through models will be generated and registered with\n * this call, unless a custom through model has been specified.\n *\n * @param {...Model} models - a {@link Model} class to register\n * @return {undefined}\n */\n\n\n var _proto = ORM.prototype;\n\n _proto.register = function register(...models) {\n models.forEach(model => {\n if (model.modelName === undefined) {\n throw new Error(\"A model was passed that doesn't have a modelName set\");\n }\n\n model.invalidateClassCache();\n this.registerManyToManyModelsFor(model);\n this.registry.push(model);\n Object.defineProperty(this, model.modelName, {\n get: () => {\n // make sure virtualFields are set up\n this._setupModelPrototypes(this.registry);\n\n return Object(_selectors__WEBPACK_IMPORTED_MODULE_9__[\"createModelSelectorSpec\"])({\n model,\n orm: this\n });\n }\n });\n });\n };\n\n _proto.registerManyToManyModelsFor = function registerManyToManyModelsFor(model) {\n const {\n fields\n } = model;\n const thisModelName = model.modelName;\n Object.entries(fields).forEach(([fieldName, fieldInstance]) => {\n if (!(fieldInstance instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_8__[\"default\"])) {\n return;\n }\n\n let toModelName;\n\n if (fieldInstance.toModelName === \"this\") {\n toModelName = thisModelName;\n } else {\n toModelName = fieldInstance.toModelName; // eslint-disable-line prefer-destructuring\n }\n\n const selfReferencing = thisModelName === toModelName;\n const fromFieldName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mFromFieldName\"])(thisModelName);\n const toFieldName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mToFieldName\"])(toModelName);\n\n if (fieldInstance.through) {\n if (selfReferencing && !fieldInstance.throughFields) {\n throw new Error(\"Self-referencing many-to-many relationship at \" + `\"${thisModelName}.${fieldName}\" using custom ` + `model \"${fieldInstance.through}\" has no ` + \"throughFields key. Cannot determine which \" + \"fields reference the instances partaking \" + \"in the relationship.\");\n }\n } else {\n const Through = /*#__PURE__*/function (_Model) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ThroughModel, _Model);\n\n function ThroughModel() {\n return _Model.apply(this, arguments) || this;\n }\n\n return ThroughModel;\n }(_Model__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n\n Through.modelName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mName\"])(thisModelName, fieldName);\n\n const PlainForeignKey = /*#__PURE__*/function (_ForeignKey) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(PlainForeignKey, _ForeignKey);\n\n function PlainForeignKey() {\n return _ForeignKey.apply(this, arguments) || this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(PlainForeignKey, [{\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return false;\n }\n }]);\n\n return PlainForeignKey;\n }(_fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\n\n const ForeignKeyClass = selfReferencing ? PlainForeignKey : _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\n Through.fields = {\n id: Object(_fields__WEBPACK_IMPORTED_MODULE_5__[\"attr\"])(),\n [fromFieldName]: new ForeignKeyClass(thisModelName),\n [toFieldName]: new ForeignKeyClass(toModelName)\n };\n Through.invalidateClassCache();\n this.implicitThroughModels.push(Through);\n }\n });\n }\n /**\n * Gets a {@link Model} class by its name from the registry.\n * @param {string} modelName - the name of the {@link Model} class to get\n * @throws If {@link Model} class is not found.\n * @return {Model} the {@link Model} class, if found\n */\n ;\n\n _proto.get = function get(modelName) {\n const allModels = this.registry.concat(this.implicitThroughModels);\n const found = Object.values(allModels).find(model => model.modelName === modelName);\n\n if (typeof found === \"undefined\") {\n throw new Error(`Did not find model ${modelName} from registry.`);\n }\n\n return found;\n };\n\n _proto.getModelClasses = function getModelClasses() {\n this._setupModelPrototypes(this.registry);\n\n this._setupModelPrototypes(this.implicitThroughModels);\n\n return this.registry.concat(this.implicitThroughModels);\n };\n\n _proto.generateSchemaSpec = function generateSchemaSpec() {\n const models = this.getModelClasses();\n const tables = models.reduce((spec, modelClass) => {\n const tableName = modelClass.modelName;\n const tableSpec = modelClass.tableOptions();\n Object.keys(tableSpec).filter(isReservedTableOption).forEach(key => {\n throw new Error(`Reserved keyword \\`${key}\\` used in ${tableName}.options.`);\n });\n spec[tableName] = {\n fields: { ...modelClass.fields\n },\n ...tableSpec\n };\n return spec;\n }, {});\n return {\n tables\n };\n };\n\n _proto.getDatabase = function getDatabase() {\n if (!this.db) {\n this.db = this.createDatabase(this.generateSchemaSpec());\n }\n\n return this.db;\n }\n /**\n * Returns the empty database state.\n * @return {Object} the empty state\n */\n ;\n\n _proto.getEmptyState = function getEmptyState() {\n return this.getDatabase().getEmptyState();\n }\n /**\n * Begins an immutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n ;\n\n _proto.session = function session(state) {\n return new _Session__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this, this.getDatabase(), state);\n }\n /**\n * Begins a mutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n ;\n\n _proto.mutableSession = function mutableSession(state) {\n return new _Session__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this, this.getDatabase(), state, true);\n }\n /**\n * @private\n */\n ;\n\n _proto._setupModelPrototypes = function _setupModelPrototypes(models) {\n models.filter(model => !model.isSetUp).forEach(model => {\n const {\n fields,\n modelName,\n querySetClass\n } = model;\n Object.entries(fields).forEach(([fieldName, field]) => {\n if (!(field instanceof _fields_Field__WEBPACK_IMPORTED_MODULE_6__[\"default\"])) {\n throw new Error(`${modelName}.${fieldName} is of type \"${typeof field}\" ` + \"but must be an instance of Field. Please use the \" + \"`attr`, `fk`, `oneToOne` and `many` \" + \"functions to define fields.\");\n }\n\n if (!this._isFieldInstalled(modelName, fieldName)) {\n this._installField(field, fieldName, model);\n\n this._setFieldInstalled(modelName, fieldName);\n }\n });\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"attachQuerySetMethods\"])(model, querySetClass);\n model.isSetUp = true;\n });\n }\n /**\n * @private\n */\n ;\n\n _proto._isFieldInstalled = function _isFieldInstalled(modelName, fieldName) {\n return this.installedFields.hasOwnProperty(modelName) ? !!this.installedFields[modelName][fieldName] : false;\n }\n /**\n * @private\n */\n ;\n\n _proto._setFieldInstalled = function _setFieldInstalled(modelName, fieldName) {\n if (!this.installedFields.hasOwnProperty(modelName)) {\n this.installedFields[modelName] = {};\n }\n\n this.installedFields[modelName][fieldName] = true;\n }\n /**\n * Installs a field on a model and its related models if necessary.\n * @private\n */\n ;\n\n _proto._installField = function _installField(field, fieldName, model) {\n const FieldInstaller = field.installerClass;\n new FieldInstaller({\n field,\n fieldName,\n model,\n orm: this\n }).run();\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Use {@link ORM#mutableSession} instead.\n */\n ;\n\n _proto.withMutations = function withMutations(state) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.withMutations` has been deprecated. \" + \"Use `ORM.prototype.mutableSession` instead.\");\n return this.mutableSession(state);\n }\n /**\n * @deprecated Use {@link ORM#session} instead.\n */\n ;\n\n _proto.from = function from(state) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.from` has been deprecated. \" + \"Use `ORM.prototype.session` instead.\");\n return this.session(state);\n }\n /**\n * @deprecated Use {@link ORM#getEmptyState} instead.\n */\n ;\n\n _proto.getDefaultState = function getDefaultState() {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.getDefaultState` has been deprecated. Use \" + \"`ORM.prototype.getEmptyState` instead.\");\n return this.getEmptyState();\n }\n /**\n * @deprecated Define a Model class instead.\n */\n ;\n\n _proto.define = function define() {\n throw new Error(\"`ORM.prototype.define` has been removed. Please define a Model class.\");\n };\n\n return ORM;\n}();\n\nfunction DeprecatedSchema() {\n throw new Error(\"Schema has been renamed to ORM. Please import ORM instead of Schema \" + \"from Redux-ORM.\");\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ORM);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9PUk0uanM/YWE0ZSJdLCJuYW1lcyI6WyJPUk1fREVGQVVMVFMiLCJjcmVhdGVEYXRhYmFzZSIsImRlZmF1bHRDcmVhdGVEYXRhYmFzZSIsIlJFU0VSVkVEX1RBQkxFX09QVElPTlMiLCJpc1Jlc2VydmVkVGFibGVPcHRpb24iLCJ3b3JkIiwiaW5jbHVkZXMiLCJPUk0iLCJvcHRzIiwicmVnaXN0cnkiLCJpbXBsaWNpdFRocm91Z2hNb2RlbHMiLCJpbnN0YWxsZWRGaWVsZHMiLCJzdGF0ZVNlbGVjdG9yIiwicmVnaXN0ZXIiLCJtb2RlbHMiLCJmb3JFYWNoIiwibW9kZWwiLCJtb2RlbE5hbWUiLCJ1bmRlZmluZWQiLCJFcnJvciIsImludmFsaWRhdGVDbGFzc0NhY2hlIiwicmVnaXN0ZXJNYW55VG9NYW55TW9kZWxzRm9yIiwicHVzaCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiX3NldHVwTW9kZWxQcm90b3R5cGVzIiwiY3JlYXRlTW9kZWxTZWxlY3RvclNwZWMiLCJvcm0iLCJmaWVsZHMiLCJ0aGlzTW9kZWxOYW1lIiwiZW50cmllcyIsImZpZWxkTmFtZSIsImZpZWxkSW5zdGFuY2UiLCJNYW55VG9NYW55IiwidG9Nb2RlbE5hbWUiLCJzZWxmUmVmZXJlbmNpbmciLCJmcm9tRmllbGROYW1lIiwibTJtRnJvbUZpZWxkTmFtZSIsInRvRmllbGROYW1lIiwibTJtVG9GaWVsZE5hbWUiLCJ0aHJvdWdoIiwidGhyb3VnaEZpZWxkcyIsIlRocm91Z2giLCJNb2RlbCIsIm0ybU5hbWUiLCJQbGFpbkZvcmVpZ25LZXkiLCJGb3JlaWduS2V5IiwiRm9yZWlnbktleUNsYXNzIiwiaWQiLCJhdHRyIiwiYWxsTW9kZWxzIiwiY29uY2F0IiwiZm91bmQiLCJ2YWx1ZXMiLCJmaW5kIiwiZ2V0TW9kZWxDbGFzc2VzIiwiZ2VuZXJhdGVTY2hlbWFTcGVjIiwidGFibGVzIiwicmVkdWNlIiwic3BlYyIsIm1vZGVsQ2xhc3MiLCJ0YWJsZU5hbWUiLCJ0YWJsZVNwZWMiLCJ0YWJsZU9wdGlvbnMiLCJrZXlzIiwiZmlsdGVyIiwia2V5IiwiZ2V0RGF0YWJhc2UiLCJkYiIsImdldEVtcHR5U3RhdGUiLCJzZXNzaW9uIiwic3RhdGUiLCJTZXNzaW9uIiwibXV0YWJsZVNlc3Npb24iLCJpc1NldFVwIiwicXVlcnlTZXRDbGFzcyIsImZpZWxkIiwiRmllbGQiLCJfaXNGaWVsZEluc3RhbGxlZCIsIl9pbnN0YWxsRmllbGQiLCJfc2V0RmllbGRJbnN0YWxsZWQiLCJhdHRhY2hRdWVyeVNldE1ldGhvZHMiLCJoYXNPd25Qcm9wZXJ0eSIsIkZpZWxkSW5zdGFsbGVyIiwiaW5zdGFsbGVyQ2xhc3MiLCJydW4iLCJ3aXRoTXV0YXRpb25zIiwid2FybkRlcHJlY2F0ZWQiLCJmcm9tIiwiZ2V0RGVmYXVsdFN0YXRlIiwiZGVmaW5lIiwiRGVwcmVjYXRlZFNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBUUEsTUFBTUEsWUFBWSxHQUFHO0FBQ2pCQyxnQkFBYyxFQUFFQyxrREFBcUJBO0FBRHBCLENBQXJCO0FBSUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBQyxTQUFELEVBQVksTUFBWixDQUEvQjs7QUFDQSxNQUFNQyxxQkFBcUIsR0FBR0MsSUFBSSxJQUFJRixzQkFBc0IsQ0FBQ0csUUFBdkIsQ0FBZ0NELElBQWhDLENBQXRDO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztJQWFNRSxHO0FBQ0Y7Ozs7Ozs7Ozs7QUFVQSxlQUFZQyxJQUFaLEVBQWtCO0FBQ2QsVUFBTTtBQUFFUDtBQUFGLFFBQXFCLEVBQUUsR0FBR0QsWUFBTDtBQUFtQixVQUFJUSxJQUFJLElBQUksRUFBWjtBQUFuQixLQUEzQjtBQUNBLFNBQUtQLGNBQUwsR0FBc0JBLGNBQXRCO0FBQ0EsU0FBS1EsUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtDLHFCQUFMLEdB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eUVBQ0ksaUJBRkYsQ0FBTjtBQUlIO0FBRUQ7QUFFZVosa0VBQWYiLCJmaWxlIjoiLi9zcmMvT1JNLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cbmltcG9ydCBTZXNzaW9uIGZyb20gXCIuL1Nlc3Npb25cIjtcbmltcG9ydCBNb2RlbCBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgY3JlYXRlRGF0YWJhc2UgYXMgZGVmYXVsdENyZWF0ZURhdGFiYXNlIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IGF0dHIgfSBmcm9tIFwiLi9maWVsZHNcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi9maWVsZHMvRmllbGRcIjtcbmltcG9ydCBGb3JlaWduS2V5IGZyb20gXCIuL2ZpZWxkcy9Gb3JlaWduS2V5XCI7XG5pbXBvcnQgTWFueVRvTWFueSBmcm9tIFwiLi9maWVsZHMvTWFueVRvTWFueVwiO1xuXG5pbXBvcnQgeyBjcmVhdGVNb2RlbFNlbGVjdG9yU3BlYyB9IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuXG5pbXBvcnQge1xuICAgIG0ybU5hbWUsXG4gICAgYXR0YWNoUXVlcnlTZXRNZXRob2RzLFxuICAgIG0ybVRvRmllbGROYW1lLFxuICAgIG0ybUZyb21GaWVsZE5hbWUsXG4gICAgd2FybkRlcHJlY2F0ZWQsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IE9STV9ERUZBVUxUUyA9IHtcbiAgICBjcmVhdGVEYXRhYmFzZTogZGVmYXVsdENyZWF0ZURhdGFiYXNlLFxufTtcblxuY29uc3QgUkVTRVJWRURfVEFCTEVfT1BUSU9OUyA9IFtcImluZGV4ZXNcIiwgXCJtZXRhXCJdO1xuY29uc3QgaXNSZXNlcnZlZFRhYmxlT3B0aW9uID0gd29yZCA9PiBSRVNFUlZFRF9UQUJMRV9PUFRJT05TLmluY2x1ZGVzKHdvcmQpO1xuXG4vKipcbiAqIE9STSAtIHRoZSBPYmplY3QgUmVsYXRpb25hbCBNYXBwZXIuXG4gKlxuICogVXNlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvOlxuICpcbiAqIC0gUmVnaXN0ZXIgeW91ciB7QGxpbmsgTW9kZWx9IGNsYXNzZXMgdXNpbmcge0BsaW5rIE9STSNyZWdpc3Rlcn1cbiAqIC0gR2V0IHRoZSBlbXB0eSBzdGF0ZSBmb3IgdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugd2l0aCB7QGxpbmsgT1JNI2dldEVtcHR5U3RhdGV9XG4gKiAtIFN0YXJ0IGFuIGltbXV0YWJsZSBkYXRhYmFzZSBzZXNzaW9uIHdpdGgge0BsaW5rIE9STSNzZXNzaW9ufVxuICogLSBTdGFydCBhIG11dGF0aW5nIGRhdGFiYXNlIHNlc3Npb24gd2l0aCB7QGxpbmsgT1JNI211dGFibGVTZXNzaW9ufVxuICpcbiAqIEludGVybmFsbHksIHRoaXMgY2xhc3MgaGFuZGxlcyBnZW5lcmF0aW5nIGEgc2NoZW1hIHNwZWNpZmljYXRpb24gZnJvbSBtb2RlbHNcbiAqIHRvIHRoZSBkYXRhYmFzZS5cbiAqL1xuY2xhc3MgT1JNIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9STSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5zdGF0ZVNlbGVjdG9yXSAtIGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYSBSZWR1eCBzdGF0ZSB0cmVlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiB0aGUgT1JNIHN0YXRlJ3Mgc3VidHJlZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gYHN0YXRlID0+IHN0YXRlLm9ybWBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gdXNlIHNlbGVjdG9ycylcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5jcmVhdGVEYXRhYmFzZV0gLSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVEYXRhYmFzZSB9ID0geyAuLi5PUk1fREVGQVVMVFMsIC4uLihvcHRzIHx8IHt9KSB9O1xuICAgICAgICB0aGlzLmNyZWF0ZURhdGFiYXNlID0gY3JlYXRlRGF0YWJhc2U7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSBbXTtcbiAgICAgICAgdGhpcy5pbXBsaWNpdFRocm91Z2hNb2RlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnN0YWxsZWRGaWVsZHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlbGVjdG9yID0gb3B0cyA/IG9wdHMuc3RhdGVTZWxlY3RvciA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEge0BsaW5rIE1vZGVsfSBjbGFzcyB0byB0aGUgT1JNLlxuICAgICAqXG4gICAgICogSWYgdGhlIG1vZGVsIGhhcyBkZWNsYXJlZCBhbnkgTWFueVRvTWFueSBmaWVsZHMsIHRoZWlyXG4gICAgICogdGhyb3VnaCBtb2RlbHMgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIHJlZ2lzdGVyZWQgd2l0aFxuICAgICAqIHRoaXMgY2FsbCwgdW5sZXNzIGEgY3VzdG9tIHRocm91Z2ggbW9kZWwgaGFzIGJlZW4gc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Li4uTW9kZWx9IG1vZGVscyAtIGEge0BsaW5rIE1vZGVsfSBjbGFzcyB0byByZWdpc3RlclxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICByZWdpc3RlciguLi5tb2RlbHMpIHtcbiAgICAgICAgbW9kZWxzLmZvckVhY2gobW9kZWwgPT4ge1xuICAgICAgICAgICAgaWYgKG1vZGVsLm1vZGVsTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkEgbW9kZWwgd2FzIHBhc3NlZCB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG1vZGVsTmFtZSBzZXRcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZGVsLmludmFsaWRhdGVDbGFzc0NhY2hlKCk7XG5cbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJNYW55VG9NYW55TW9kZWxzRm9yKG1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkucHVzaChtb2RlbCk7XG5cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtb2RlbC5tb2RlbE5hbWUsIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHZpcnR1YWxGaWVsZHMgYXJlIHNldCB1cFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXR1cE1vZGVsUHJvdG90eXBlcyh0aGlzLnJlZ2lzdHJ5KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTW9kZWxTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcm06IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJNYW55VG9NYW55TW9kZWxzRm9yKG1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHsgZmllbGRzIH0gPSBtb2RlbDtcbiAgICAgICAgY29uc3QgdGhpc01vZGVsTmFtZSA9IG1vZGVsLm1vZGVsTmFtZTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtmaWVsZE5hbWUsIGZpZWxkSW5zdGFuY2VdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShmaWVsZEluc3RhbmNlIGluc3RhbmNlb2YgTWFueVRvTWFueSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0b01vZGVsTmFtZTtcbiAgICAgICAgICAgIGlmIChmaWVsZEluc3RhbmNlLnRvTW9kZWxOYW1lID09PSBcInRoaXNcIikge1xuICAgICAgICAgICAgICAgIHRvTW9kZWxOYW1lID0gdGhpc01vZGVsTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9Nb2RlbE5hbWUgPSBmaWVsZEluc3RhbmNlLnRvTW9kZWxOYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGZSZWZlcmVuY2luZyA9IHRoaXNNb2RlbE5hbWUgPT09IHRvTW9kZWxOYW1lO1xuICAgICAgICAgICAgY29uc3QgZnJvbUZpZWxkTmFtZSA9IG0ybUZyb21GaWVsZE5hbWUodGhpc01vZGVsTmFtZSk7XG4gICAgICAgICAgICBjb25zdCB0b0ZpZWxkTmFtZSA9IG0ybVRvRmllbGROYW1lKHRvTW9kZWxOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkSW5zdGFuY2UudGhyb3VnaCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmUmVmZXJlbmNpbmcgJiYgIWZpZWxkSW5zdGFuY2UudGhyb3VnaEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNlbGYtcmVmZXJlbmNpbmcgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCBhdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHt0aGlzTW9kZWxOYW1lfS4ke2ZpZWxkTmFtZX1cIiB1c2luZyBjdXN0b20gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1vZGVsIFwiJHtmaWVsZEluc3RhbmNlLnRocm91Z2h9XCIgaGFzIG5vIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyb3VnaEZpZWxkcyBrZXkuIENhbm5vdCBkZXRlcm1pbmUgd2hpY2ggXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmllbGRzIHJlZmVyZW5jZSB0aGUgaW5zdGFuY2VzIHBhcnRha2luZyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbiB0aGUgcmVsYXRpb25zaGlwLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBUaHJvdWdoID0gY2xhc3MgVGhyb3VnaE1vZGVsIGV4dGVuZHMgTW9kZWwge307XG5cbiAgICAgICAgICAgICAgICBUaHJvdWdoLm1vZGVsTmFtZSA9IG0ybU5hbWUodGhpc01vZGVsTmFtZSwgZmllbGROYW1lKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IFBsYWluRm9yZWlnbktleSA9IGNsYXNzIFBsYWluRm9yZWlnbktleSBleHRlbmRzIEZvcmVpZ25LZXkge1xuICAgICAgICAgICAgICAgICAgICBnZXQgaW5zdGFsbHNCYWNrd2FyZHNWaXJ0dWFsRmllbGQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBnZXQgaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBGb3JlaWduS2V5Q2xhc3MgPSBzZWxmUmVmZXJlbmNpbmdcbiAgICAgICAgICAgICAgICAgICAgPyBQbGFpbkZvcmVpZ25LZXlcbiAgICAgICAgICAgICAgICAgICAgOiBGb3JlaWduS2V5O1xuICAgICAgICAgICAgICAgIFRocm91Z2guZmllbGRzID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogYXR0cigpLFxuICAgICAgICAgICAgICAgICAgICBbZnJvbUZpZWxkTmFtZV06IG5ldyBGb3JlaWduS2V5Q2xhc3ModGhpc01vZGVsTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIFt0b0ZpZWxkTmFtZV06IG5ldyBGb3JlaWduS2V5Q2xhc3ModG9Nb2RlbE5hbWUpLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBUaHJvdWdoLmludmFsaWRhdGVDbGFzc0NhY2hlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBsaWNpdFRocm91Z2hNb2RlbHMucHVzaChUaHJvdWdoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHtAbGluayBNb2RlbH0gY2xhc3MgYnkgaXRzIG5hbWUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBtb2RlbE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUge0BsaW5rIE1vZGVsfSBjbGFzcyB0byBnZXRcbiAgICAgKiBAdGhyb3dzIElmIHtAbGluayBNb2RlbH0gY2xhc3MgaXMgbm90IGZvdW5kLlxuICAgICAqIEByZXR1cm4ge01vZGVsfSB0aGUge0BsaW5rIE1vZGVsfSBjbGFzcywgaWYgZm91bmRcbiAgICAgKi9cbiAgICBnZXQobW9kZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IGFsbE1vZGVscyA9IHRoaXMucmVnaXN0cnkuY29uY2F0KHRoaXMuaW1wbGljaXRUaHJvdWdoTW9kZWxzKTtcbiAgICAgICAgY29uc3QgZm91bmQgPSBPYmplY3QudmFsdWVzKGFsbE1vZGVscykuZmluZChcbiAgICAgICAgICAgIG1vZGVsID0+IG1vZGVsLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmb3VuZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGZpbmQgbW9kZWwgJHttb2RlbE5hbWV9IGZyb20gcmVnaXN0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIGdldE1vZGVsQ2xhc3NlcygpIHtcbiAgICAgICAgdGhpcy5fc2V0dXBNb2RlbFByb3RvdHlwZXModGhpcy5yZWdpc3RyeSk7XG4gICAgICAgIHRoaXMuX3NldHVwTW9kZWxQcm90b3R5cGVzKHRoaXMuaW1wbGljaXRUaHJvdWdoTW9kZWxzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuY29uY2F0KHRoaXMuaW1wbGljaXRUaHJvdWdoTW9kZWxzKTtcbiAgICB9XG5cbiAgICBnZW5lcmF0ZVNjaGVtYVNwZWMoKSB7XG4gICAgICAgIGNvbnN0IG1vZGVscyA9IHRoaXMuZ2V0TW9kZWxDbGFzc2VzKCk7XG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IG1vZGVscy5yZWR1Y2UoKHNwZWMsIG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IG1vZGVsQ2xhc3MubW9kZWxOYW1lO1xuICAgICAgICAgICAgY29uc3QgdGFibGVTcGVjID0gbW9kZWxDbGFzcy50YWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRhYmxlU3BlYylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGlzUmVzZXJ2ZWRUYWJsZU9wdGlvbilcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUmVzZXJ2ZWQga2V5d29yZCBcXGAke2tleX1cXGAgdXNlZCBpbiAke3RhYmxlTmFtZX0ub3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzcGVjW3RhYmxlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiB7IC4uLm1vZGVsQ2xhc3MuZmllbGRzIH0sXG4gICAgICAgICAgICAgICAgLi4udGFibGVTcGVjLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiB7IHRhYmxlcyB9O1xuICAgIH1cblxuICAgIGdldERhdGFiYXNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGIpIHtcbiAgICAgICAgICAgIHRoaXMuZGIgPSB0aGlzLmNyZWF0ZURhdGFiYXNlKHRoaXMuZ2VuZXJhdGVTY2hlbWFTcGVjKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVtcHR5IGRhdGFiYXNlIHN0YXRlLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGVtcHR5IHN0YXRlXG4gICAgICovXG4gICAgZ2V0RW1wdHlTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRFbXB0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW5zIGFuIGltbXV0YWJsZSBkYXRhYmFzZSBzZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzdGF0ZSAgLSB0aGUgc3RhdGUgdGhlIGRhdGFiYXNlIG1hbmFnZXNcbiAgICAgKiBAcmV0dXJuIHtTZXNzaW9ufSBhIG5ldyB7QGxpbmsgU2Vzc2lvbn0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXNzaW9uKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbih0aGlzLCB0aGlzLmdldERhdGFiYXNlKCksIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbnMgYSBtdXRhYmxlIGRhdGFiYXNlIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHN0YXRlICAtIHRoZSBzdGF0ZSB0aGUgZGF0YWJhc2UgbWFuYWdlc1xuICAgICAqIEByZXR1cm4ge1Nlc3Npb259IGEgbmV3IHtAbGluayBTZXNzaW9ufSBpbnN0YW5jZVxuICAgICAqL1xuICAgIG11dGFibGVTZXNzaW9uKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbih0aGlzLCB0aGlzLmdldERhdGFiYXNlKCksIHN0YXRlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zZXR1cE1vZGVsUHJvdG90eXBlcyhtb2RlbHMpIHtcbiAgICAgICAgbW9kZWxzXG4gICAgICAgICAgICAuZmlsdGVyKG1vZGVsID0+ICFtb2RlbC5pc1NldFVwKVxuICAgICAgICAgICAgLmZvckVhY2gobW9kZWwgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmllbGRzLCBtb2RlbE5hbWUsIHF1ZXJ5U2V0Q2xhc3MgfSA9IG1vZGVsO1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7bW9kZWxOYW1lfS4ke2ZpZWxkTmFtZX0gaXMgb2YgdHlwZSBcIiR7dHlwZW9mIGZpZWxkfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEZpZWxkLiBQbGVhc2UgdXNlIHRoZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYGF0dHJgLCBgZmtgLCBgb25lVG9PbmVgIGFuZCBgbWFueWAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9ucyB0byBkZWZpbmUgZmllbGRzLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXNGaWVsZEluc3RhbGxlZChtb2RlbE5hbWUsIGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbGxGaWVsZChmaWVsZCwgZmllbGROYW1lLCBtb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRGaWVsZEluc3RhbGxlZChtb2RlbE5hbWUsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdHRhY2hRdWVyeVNldE1ldGhvZHMobW9kZWwsIHF1ZXJ5U2V0Q2xhc3MpO1xuICAgICAgICAgICAgICAgIG1vZGVsLmlzU2V0VXAgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNGaWVsZEluc3RhbGxlZChtb2RlbE5hbWUsIGZpZWxkTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsZWRGaWVsZHMuaGFzT3duUHJvcGVydHkobW9kZWxOYW1lKVxuICAgICAgICAgICAgPyAhIXRoaXMuaW5zdGFsbGVkRmllbGRzW21vZGVsTmFtZV1bZmllbGROYW1lXVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zZXRGaWVsZEluc3RhbGxlZChtb2RlbE5hbWUsIGZpZWxkTmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5zdGFsbGVkRmllbGRzLmhhc093blByb3BlcnR5KG1vZGVsTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbGVkRmllbGRzW21vZGVsTmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc3RhbGxlZEZpZWxkc1ttb2RlbE5hbWVdW2ZpZWxkTmFtZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc3RhbGxzIGEgZmllbGQgb24gYSBtb2RlbCBhbmQgaXRzIHJlbGF0ZWQgbW9kZWxzIGlmIG5lY2Vzc2FyeS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9pbnN0YWxsRmllbGQoZmllbGQsIGZpZWxkTmFtZSwgbW9kZWwpIHtcbiAgICAgICAgY29uc3QgRmllbGRJbnN0YWxsZXIgPSBmaWVsZC5pbnN0YWxsZXJDbGFzcztcbiAgICAgICAgbmV3IEZpZWxkSW5zdGFsbGVyKHtcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBvcm06IHRoaXMsXG4gICAgICAgIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIC8vIERFUFJFQ0FURUQgQU5EIFJFTU9WRUQgTUVUSE9EU1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPUk0jbXV0YWJsZVNlc3Npb259IGluc3RlYWQuXG4gICAgICovXG4gICAgd2l0aE11dGF0aW9ucyhzdGF0ZSkge1xuICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgIFwiYE9STS5wcm90b3R5cGUud2l0aE11dGF0aW9uc2AgaGFzIGJlZW4gZGVwcmVjYXRlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVXNlIGBPUk0ucHJvdG90eXBlLm11dGFibGVTZXNzaW9uYCBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGFibGVTZXNzaW9uKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE9STSNzZXNzaW9ufSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGZyb20oc3RhdGUpIHtcbiAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICBcImBPUk0ucHJvdG90eXBlLmZyb21gIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFwiICtcbiAgICAgICAgICAgICAgICBcIlVzZSBgT1JNLnByb3RvdHlwZS5zZXNzaW9uYCBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24oc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgT1JNI2dldEVtcHR5U3RhdGV9IGluc3RlYWQuXG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFN0YXRlKCkge1xuICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgIFwiYE9STS5wcm90b3R5cGUuZ2V0RGVmYXVsdFN0YXRlYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgXCIgK1xuICAgICAgICAgICAgICAgIFwiYE9STS5wcm90b3R5cGUuZ2V0RW1wdHlTdGF0ZWAgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbXB0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgRGVmaW5lIGEgTW9kZWwgY2xhc3MgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBkZWZpbmUoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiYE9STS5wcm90b3R5cGUuZGVmaW5lYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgZGVmaW5lIGEgTW9kZWwgY2xhc3MuXCJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZXByZWNhdGVkU2NoZW1hKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJTY2hlbWEgaGFzIGJlZW4gcmVuYW1lZCB0byBPUk0uIFBsZWFzZSBpbXBvcnQgT1JNIGluc3RlYWQgb2YgU2NoZW1hIFwiICtcbiAgICAgICAgICAgIFwiZnJvbSBSZWR1eC1PUk0uXCJcbiAgICApO1xufVxuXG5leHBvcnQgeyBPUk0gfTtcblxuZXhwb3J0IGRlZmF1bHQgT1JNO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ORM.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DeprecatedSchema\", function() { return DeprecatedSchema; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ORM\", function() { return ORM; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Session */ \"./src/Session.js\");\n/* harmony import */ var _Model__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Model */ \"./src/Model.js\");\n/* harmony import */ var _db__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./db */ \"./src/db/index.js\");\n/* harmony import */ var _fields__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fields */ \"./src/fields/index.js\");\n/* harmony import */ var _fields_Field__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fields/Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selectors */ \"./src/selectors/index.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n/* eslint-disable max-classes-per-file */\n\n\n\n\n\n\n\n\n\nconst ORM_DEFAULTS = {\n createDatabase: _db__WEBPACK_IMPORTED_MODULE_4__[\"createDatabase\"]\n};\nconst RESERVED_TABLE_OPTIONS = [\"indexes\", \"meta\"];\n\nconst isReservedTableOption = word => RESERVED_TABLE_OPTIONS.includes(word);\n/**\n * ORM - the Object Relational Mapper.\n *\n * Use instances of this class to:\n *\n * - Register your {@link Model} classes using {@link ORM#register}\n * - Get the empty state for the underlying database with {@link ORM#getEmptyState}\n * - Start an immutable database session with {@link ORM#session}\n * - Start a mutating database session with {@link ORM#mutableSession}\n *\n * Internally, this class handles generating a schema specification from models\n * to the database.\n */\n\n\nlet ORM = /*#__PURE__*/function () {\n /**\n * Creates a new ORM instance.\n *\n * @param {Object} [opts]\n * @param {Function} [opts.stateSelector] - function that given a Redux state tree\n * will return the ORM state's subtree,\n * e.g. `state => state.orm`\n * (necessary if you want to use selectors)\n * @param {Function} [opts.createDatabase] - function that creates a database\n */\n function ORM(opts) {\n const {\n createDatabase\n } = { ...ORM_DEFAULTS,\n ...(opts || {})\n };\n this.createDatabase = createDatabase;\n this.registry = [];\n this.implicitThroughModels = [];\n this.installedFields = {};\n this.stateSelector = opts ? opts.stateSelector : null;\n }\n /**\n * Registers a {@link Model} class to the ORM.\n *\n * If the model has declared any ManyToMany fields, their\n * through models will be generated and registered with\n * this call, unless a custom through model has been specified.\n *\n * @param {...Model} models - a {@link Model} class to register\n * @return {undefined}\n */\n\n\n var _proto = ORM.prototype;\n\n _proto.register = function register(...models) {\n models.forEach(model => {\n if (model.modelName === undefined) {\n throw new Error(\"A model was passed that doesn't have a modelName set\");\n }\n\n model.invalidateClassCache();\n this.registerManyToManyModelsFor(model);\n this.registry.push(model);\n Object.defineProperty(this, model.modelName, {\n get: () => {\n // make sure virtualFields are set up\n this._setupModelPrototypes(this.registry);\n\n return Object(_selectors__WEBPACK_IMPORTED_MODULE_9__[\"createModelSelectorSpec\"])({\n model,\n orm: this\n });\n }\n });\n });\n };\n\n _proto.registerManyToManyModelsFor = function registerManyToManyModelsFor(model) {\n const {\n fields\n } = model;\n const thisModelName = model.modelName;\n Object.entries(fields).forEach(([fieldName, fieldInstance]) => {\n if (!(fieldInstance instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_8__[\"default\"])) {\n return;\n }\n\n let toModelName;\n\n if (fieldInstance.toModelName === \"this\") {\n toModelName = thisModelName;\n } else {\n toModelName = fieldInstance.toModelName; // eslint-disable-line prefer-destructuring\n }\n\n const selfReferencing = thisModelName === toModelName;\n const fromFieldName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mFromFieldName\"])(thisModelName);\n const toFieldName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mToFieldName\"])(toModelName);\n\n if (fieldInstance.through) {\n if (selfReferencing && !fieldInstance.throughFields) {\n throw new Error(\"Self-referencing many-to-many relationship at \" + `\"${thisModelName}.${fieldName}\" using custom ` + `model \"${fieldInstance.through}\" has no ` + \"throughFields key. Cannot determine which \" + \"fields reference the instances partaking \" + \"in the relationship.\");\n }\n } else {\n const Through = /*#__PURE__*/function (_Model) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ThroughModel, _Model);\n\n function ThroughModel() {\n return _Model.apply(this, arguments) || this;\n }\n\n return ThroughModel;\n }(_Model__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n\n Through.modelName = Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"m2mName\"])(thisModelName, fieldName);\n\n const PlainForeignKey = /*#__PURE__*/function (_ForeignKey) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(PlainForeignKey, _ForeignKey);\n\n function PlainForeignKey() {\n return _ForeignKey.apply(this, arguments) || this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(PlainForeignKey, [{\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return false;\n }\n }]);\n\n return PlainForeignKey;\n }(_fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\n\n const ForeignKeyClass = selfReferencing ? PlainForeignKey : _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\n Through.fields = {\n id: Object(_fields__WEBPACK_IMPORTED_MODULE_5__[\"attr\"])(),\n [fromFieldName]: new ForeignKeyClass(thisModelName),\n [toFieldName]: new ForeignKeyClass(toModelName)\n };\n Through.invalidateClassCache();\n this.implicitThroughModels.push(Through);\n }\n });\n }\n /**\n * Gets a {@link Model} class by its name from the registry.\n * @param {string} modelName - the name of the {@link Model} class to get\n * @throws If {@link Model} class is not found.\n * @return {Model} the {@link Model} class, if found\n */\n ;\n\n _proto.get = function get(modelName) {\n const allModels = this.registry.concat(this.implicitThroughModels);\n const found = Object.values(allModels).find(model => model.modelName === modelName);\n\n if (typeof found === \"undefined\") {\n throw new Error(`Did not find model ${modelName} from registry.`);\n }\n\n return found;\n };\n\n _proto.getModelClasses = function getModelClasses() {\n this._setupModelPrototypes(this.registry);\n\n this._setupModelPrototypes(this.implicitThroughModels);\n\n return this.registry.concat(this.implicitThroughModels);\n };\n\n _proto.generateSchemaSpec = function generateSchemaSpec() {\n const models = this.getModelClasses();\n const tables = models.reduce((spec, modelClass) => {\n const tableName = modelClass.modelName;\n const tableSpec = modelClass.tableOptions();\n Object.keys(tableSpec).filter(isReservedTableOption).forEach(key => {\n throw new Error(`Reserved keyword \\`${key}\\` used in ${tableName}.options.`);\n });\n spec[tableName] = {\n fields: { ...modelClass.fields\n },\n ...tableSpec\n };\n return spec;\n }, {});\n return {\n tables\n };\n };\n\n _proto.getDatabase = function getDatabase() {\n if (!this.db) {\n this.db = this.createDatabase(this.generateSchemaSpec());\n }\n\n return this.db;\n }\n /**\n * Returns the empty database state.\n * @return {Object} the empty state\n */\n ;\n\n _proto.getEmptyState = function getEmptyState() {\n return this.getDatabase().getEmptyState();\n }\n /**\n * Begins an immutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n ;\n\n _proto.session = function session(state) {\n return new _Session__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this, this.getDatabase(), state);\n }\n /**\n * Begins a mutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n ;\n\n _proto.mutableSession = function mutableSession(state) {\n return new _Session__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this, this.getDatabase(), state, true);\n }\n /**\n * @private\n */\n ;\n\n _proto._setupModelPrototypes = function _setupModelPrototypes(models) {\n models.filter(model => !model.isSetUp).forEach(model => {\n const {\n fields,\n modelName,\n querySetClass\n } = model;\n Object.entries(fields).forEach(([fieldName, field]) => {\n if (!(field instanceof _fields_Field__WEBPACK_IMPORTED_MODULE_6__[\"default\"])) {\n throw new Error(`${modelName}.${fieldName} is of type \"${typeof field}\" ` + \"but must be an instance of Field. Please use the \" + \"`attr`, `fk`, `oneToOne` and `many` \" + \"functions to define fields.\");\n }\n\n if (!this._isFieldInstalled(modelName, fieldName)) {\n this._installField(field, fieldName, model);\n\n this._setFieldInstalled(modelName, fieldName);\n }\n });\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"attachQuerySetMethods\"])(model, querySetClass);\n model.isSetUp = true;\n });\n }\n /**\n * @private\n */\n ;\n\n _proto._isFieldInstalled = function _isFieldInstalled(modelName, fieldName) {\n return this.installedFields.hasOwnProperty(modelName) ? !!this.installedFields[modelName][fieldName] : false;\n }\n /**\n * @private\n */\n ;\n\n _proto._setFieldInstalled = function _setFieldInstalled(modelName, fieldName) {\n if (!this.installedFields.hasOwnProperty(modelName)) {\n this.installedFields[modelName] = {};\n }\n\n this.installedFields[modelName][fieldName] = true;\n }\n /**\n * Installs a field on a model and its related models if necessary.\n * @private\n */\n ;\n\n _proto._installField = function _installField(field, fieldName, model) {\n const FieldInstaller = field.installerClass;\n new FieldInstaller({\n field,\n fieldName,\n model,\n orm: this\n }).run();\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Use {@link ORM#mutableSession} instead.\n */\n ;\n\n _proto.withMutations = function withMutations(state) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.withMutations` has been deprecated. \" + \"Use `ORM.prototype.mutableSession` instead.\");\n return this.mutableSession(state);\n }\n /**\n * @deprecated Use {@link ORM#session} instead.\n */\n ;\n\n _proto.from = function from(state) {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.from` has been deprecated. \" + \"Use `ORM.prototype.session` instead.\");\n return this.session(state);\n }\n /**\n * @deprecated Use {@link ORM#getEmptyState} instead.\n */\n ;\n\n _proto.getDefaultState = function getDefaultState() {\n Object(_utils__WEBPACK_IMPORTED_MODULE_10__[\"warnDeprecated\"])(\"`ORM.prototype.getDefaultState` has been deprecated. Use \" + \"`ORM.prototype.getEmptyState` instead.\");\n return this.getEmptyState();\n }\n /**\n * @deprecated Define a Model class instead.\n */\n ;\n\n _proto.define = function define() {\n throw new Error(\"`ORM.prototype.define` has been removed. Please define a Model class.\");\n };\n\n return ORM;\n}();\n\nfunction DeprecatedSchema() {\n throw new Error(\"Schema has been renamed to ORM. Please import ORM instead of Schema \" + \"from Redux-ORM.\");\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (ORM);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9PUk0uanM/YWE0ZSJdLCJuYW1lcyI6WyJPUk1fREVGQVVMVFMiLCJjcmVhdGVEYXRhYmFzZSIsImRlZmF1bHRDcmVhdGVEYXRhYmFzZSIsIlJFU0VSVkVEX1RBQkxFX09QVElPTlMiLCJpc1Jlc2VydmVkVGFibGVPcHRpb24iLCJ3b3JkIiwiaW5jbHVkZXMiLCJPUk0iLCJvcHRzIiwicmVnaXN0cnkiLCJpbXBsaWNpdFRocm91Z2hNb2RlbHMiLCJpbnN0YWxsZWRGaWVsZHMiLCJzdGF0ZVNlbGVjdG9yIiwicmVnaXN0ZXIiLCJtb2RlbHMiLCJmb3JFYWNoIiwibW9kZWwiLCJtb2RlbE5hbWUiLCJ1bmRlZmluZWQiLCJFcnJvciIsImludmFsaWRhdGVDbGFzc0NhY2hlIiwicmVnaXN0ZXJNYW55VG9NYW55TW9kZWxzRm9yIiwicHVzaCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiX3NldHVwTW9kZWxQcm90b3R5cGVzIiwiY3JlYXRlTW9kZWxTZWxlY3RvclNwZWMiLCJvcm0iLCJmaWVsZHMiLCJ0aGlzTW9kZWxOYW1lIiwiZW50cmllcyIsImZpZWxkTmFtZSIsImZpZWxkSW5zdGFuY2UiLCJNYW55VG9NYW55IiwidG9Nb2RlbE5hbWUiLCJzZWxmUmVmZXJlbmNpbmciLCJmcm9tRmllbGROYW1lIiwibTJtRnJvbUZpZWxkTmFtZSIsInRvRmllbGROYW1lIiwibTJtVG9GaWVsZE5hbWUiLCJ0aHJvdWdoIiwidGhyb3VnaEZpZWxkcyIsIlRocm91Z2giLCJNb2RlbCIsIm0ybU5hbWUiLCJQbGFpbkZvcmVpZ25LZXkiLCJGb3JlaWduS2V5IiwiRm9yZWlnbktleUNsYXNzIiwiaWQiLCJhdHRyIiwiYWxsTW9kZWxzIiwiY29uY2F0IiwiZm91bmQiLCJ2YWx1ZXMiLCJmaW5kIiwiZ2V0TW9kZWxDbGFzc2VzIiwiZ2VuZXJhdGVTY2hlbWFTcGVjIiwidGFibGVzIiwicmVkdWNlIiwic3BlYyIsIm1vZGVsQ2xhc3MiLCJ0YWJsZU5hbWUiLCJ0YWJsZVNwZWMiLCJ0YWJsZU9wdGlvbnMiLCJrZXlzIiwiZmlsdGVyIiwia2V5IiwiZ2V0RGF0YWJhc2UiLCJkYiIsImdldEVtcHR5U3RhdGUiLCJzZXNzaW9uIiwic3RhdGUiLCJTZXNzaW9uIiwibXV0YWJsZVNlc3Npb24iLCJpc1NldFVwIiwicXVlcnlTZXRDbGFzcyIsImZpZWxkIiwiRmllbGQiLCJfaXNGaWVsZEluc3RhbGxlZCIsIl9pbnN0YWxsRmllbGQiLCJfc2V0RmllbGRJbnN0YWxsZWQiLCJhdHRhY2hRdWVyeVNldE1ldGhvZHMiLCJoYXNPd25Qcm9wZXJ0eSIsIkZpZWxkSW5zdGFsbGVyIiwiaW5zdGFsbGVyQ2xhc3MiLCJydW4iLCJ3aXRoTXV0YXRpb25zIiwid2FybkRlcHJlY2F0ZWQiLCJmcm9tIiwiZ2V0RGVmYXVsdFN0YXRlIiwiZGVmaW5lIiwiRGVwcmVjYXRlZFNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBUUEsTUFBTUEsWUFBWSxHQUFHO0FBQ2pCQyxnQkFBYyxFQUFFQyxrREFBcUJBO0FBRHBCLENBQXJCO0FBSUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBQyxTQUFELEVBQVksTUFBWixDQUEvQjs7QUFDQSxNQUFNQyxxQkFBcUIsR0FBSUMsSUFBRCxJQUFVRixzQkFBc0IsQ0FBQ0csUUFBdkIsQ0FBZ0NELElBQWhDLENBQXhDO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztJQUNNRSxHO0FBQ0Y7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSSxlQUFZQyxJQUFaLEVBQWtCO0FBQ2QsVUFBTTtBQUFFUDtBQUFGLFFBQXFCLEVBQUUsR0FBR0QsWUFBTDtBQUFtQixVQUFJUSxJQUFJLElBQUksRUFBWjtBQUFu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QUFLakIsT0FBTCxDQUFhQyxLQUFiLENBQVA7QUFDSDtBQUVEO0FBQ0o7QUFDQTs7O1NBQ0lrQixlLEdBQUEsMkJBQWtCO0FBQ2RGLGtFQUFjLENBQ1YsOERBQ0ksd0NBRk0sQ0FBZDtBQUlBLFdBQU8sS0FBS2xCLGFBQUwsRUFBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBOzs7U0FDSXFCLE0sR0FBQSxrQkFBUztBQUNMLFVBQU0sSUFBSXhFLEtBQUosQ0FDRix1RUFERSxDQUFOO0FBR0gsRzs7Ozs7QUFHRSxTQUFTeUUsZ0JBQVQsR0FBNEI7QUFDL0IsUUFBTSxJQUFJekUsS0FBSixDQUNGLHlFQUNJLGlCQUZGLENBQU47QUFJSDtBQUVEO0FBRWVaLGtFQUFmIiwiZmlsZSI6Ii4vc3JjL09STS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQgU2Vzc2lvbiBmcm9tIFwiLi9TZXNzaW9uXCI7XG5pbXBvcnQgTW9kZWwgZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IGNyZWF0ZURhdGFiYXNlIGFzIGRlZmF1bHRDcmVhdGVEYXRhYmFzZSB9IGZyb20gXCIuL2RiXCI7XG5pbXBvcnQgeyBhdHRyIH0gZnJvbSBcIi4vZmllbGRzXCI7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4vZmllbGRzL0ZpZWxkXCI7XG5pbXBvcnQgRm9yZWlnbktleSBmcm9tIFwiLi9maWVsZHMvRm9yZWlnbktleVwiO1xuaW1wb3J0IE1hbnlUb01hbnkgZnJvbSBcIi4vZmllbGRzL01hbnlUb01hbnlcIjtcblxuaW1wb3J0IHsgY3JlYXRlTW9kZWxTZWxlY3RvclNwZWMgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcblxuaW1wb3J0IHtcbiAgICBtMm1OYW1lLFxuICAgIGF0dGFjaFF1ZXJ5U2V0TWV0aG9kcyxcbiAgICBtMm1Ub0ZpZWxkTmFtZSxcbiAgICBtMm1Gcm9tRmllbGROYW1lLFxuICAgIHdhcm5EZXByZWNhdGVkLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBPUk1fREVGQVVMVFMgPSB7XG4gICAgY3JlYXRlRGF0YWJhc2U6IGRlZmF1bHRDcmVhdGVEYXRhYmFzZSxcbn07XG5cbmNvbnN0IFJFU0VSVkVEX1RBQkxFX09QVElPTlMgPSBbXCJpbmRleGVzXCIsIFwibWV0YVwiXTtcbmNvbnN0IGlzUmVzZXJ2ZWRUYWJsZU9wdGlvbiA9ICh3b3JkKSA9PiBSRVNFUlZFRF9UQUJMRV9PUFRJT05TLmluY2x1ZGVzKHdvcmQpO1xuXG4vKipcbiAqIE9STSAtIHRoZSBPYmplY3QgUmVsYXRpb25hbCBNYXBwZXIuXG4gKlxuICogVXNlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvOlxuICpcbiAqIC0gUmVnaXN0ZXIgeW91ciB7QGxpbmsgTW9kZWx9IGNsYXNzZXMgdXNpbmcge0BsaW5rIE9STSNyZWdpc3Rlcn1cbiAqIC0gR2V0IHRoZSBlbXB0eSBzdGF0ZSBmb3IgdGhlIHVuZGVybHlpbmcgZGF0YWJhc2Ugd2l0aCB7QGxpbmsgT1JNI2dldEVtcHR5U3RhdGV9XG4gKiAtIFN0YXJ0IGFuIGltbXV0YWJsZSBkYXRhYmFzZSBzZXNzaW9uIHdpdGgge0BsaW5rIE9STSNzZXNzaW9ufVxuICogLSBTdGFydCBhIG11dGF0aW5nIGRhdGFiYXNlIHNlc3Npb24gd2l0aCB7QGxpbmsgT1JNI211dGFibGVTZXNzaW9ufVxuICpcbiAqIEludGVybmFsbHksIHRoaXMgY2xhc3MgaGFuZGxlcyBnZW5lcmF0aW5nIGEgc2NoZW1hIHNwZWNpZmljYXRpb24gZnJvbSBtb2RlbHNcbiAqIHRvIHRoZSBkYXRhYmFzZS5cbiAqL1xuY2xhc3MgT1JNIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9STSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5zdGF0ZVNlbGVjdG9yXSAtIGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYSBSZWR1eCBzdGF0ZSB0cmVlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiB0aGUgT1JNIHN0YXRlJ3Mgc3VidHJlZSxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gYHN0YXRlID0+IHN0YXRlLm9ybWBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gdXNlIHNlbGVjdG9ycylcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5jcmVhdGVEYXRhYmFzZV0gLSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVEYXRhYmFzZSB9ID0geyAuLi5PUk1fREVGQVVMVFMsIC4uLihvcHRzIHx8IHt9KSB9O1xuICAgICAgICB0aGlzLmNyZWF0ZURhdGFiYXNlID0gY3JlYXRlRGF0YWJhc2U7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSBbXTtcbiAgICAgICAgdGhpcy5pbXBsaWNpdFRocm91Z2hNb2RlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnN0YWxsZWRGaWVsZHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlbGVjdG9yID0gb3B0cyA/IG9wdHMuc3RhdGVTZWxlY3RvciA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEge0BsaW5rIE1vZGVsfSBjbGFzcyB0byB0aGUgT1JNLlxuICAgICAqXG4gICAgICogSWYgdGhlIG1vZGVsIGhhcyBkZWNsYXJlZCBhbnkgTWFueVRvTWFueSBmaWVsZHMsIHRoZWlyXG4gICAgICogdGhyb3VnaCBtb2RlbHMgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIHJlZ2lzdGVyZWQgd2l0aFxuICAgICAqIHRoaXMgY2FsbCwgdW5sZXNzIGEgY3VzdG9tIHRocm91Z2ggbW9kZWwgaGFzIGJlZW4gc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Li4uTW9kZWx9IG1vZGVscyAtIGEge0BsaW5rIE1vZGVsfSBjbGFzcyB0byByZWdpc3RlclxuICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICByZWdpc3RlciguLi5tb2RlbHMpIHtcbiAgICAgICAgbW9kZWxzLmZvckVhY2goKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAobW9kZWwubW9kZWxOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiQSBtb2RlbCB3YXMgcGFzc2VkIHRoYXQgZG9lc24ndCBoYXZlIGEgbW9kZWxOYW1lIHNldFwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kZWwuaW52YWxpZGF0ZUNsYXNzQ2FjaGUoKTtcblxuICAgICAgICAgICAgdGhpcy5yZWdpc3Rlck1hbnlUb01hbnlNb2RlbHNGb3IobW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RyeS5wdXNoKG1vZGVsKTtcblxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG1vZGVsLm1vZGVsTmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdmlydHVhbEZpZWxkcyBhcmUgc2V0IHVwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldHVwTW9kZWxQcm90b3R5cGVzKHRoaXMucmVnaXN0cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVNb2RlbFNlbGVjdG9yU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ybTogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck1hbnlUb01hbnlNb2RlbHNGb3IobW9kZWwpIHtcbiAgICAgICAgY29uc3QgeyBmaWVsZHMgfSA9IG1vZGVsO1xuICAgICAgICBjb25zdCB0aGlzTW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRJbnN0YW5jZV0pID0+IHtcbiAgICAgICAgICAgIGlmICghKGZpZWxkSW5zdGFuY2UgaW5zdGFuY2VvZiBNYW55VG9NYW55KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRvTW9kZWxOYW1lO1xuICAgICAgICAgICAgaWYgKGZpZWxkSW5zdGFuY2UudG9Nb2RlbE5hbWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgICAgICAgICAgdG9Nb2RlbE5hbWUgPSB0aGlzTW9kZWxOYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b01vZGVsTmFtZSA9IGZpZWxkSW5zdGFuY2UudG9Nb2RlbE5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nID0gdGhpc01vZGVsTmFtZSA9PT0gdG9Nb2RlbE5hbWU7XG4gICAgICAgICAgICBjb25zdCBmcm9tRmllbGROYW1lID0gbTJtRnJvbUZpZWxkTmFtZSh0aGlzTW9kZWxOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHRvRmllbGROYW1lID0gbTJtVG9GaWVsZE5hbWUodG9Nb2RlbE5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZmllbGRJbnN0YW5jZS50aHJvdWdoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZSZWZlcmVuY2luZyAmJiAhZmllbGRJbnN0YW5jZS50aHJvdWdoRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU2VsZi1yZWZlcmVuY2luZyBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwIGF0IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIke3RoaXNNb2RlbE5hbWV9LiR7ZmllbGROYW1lfVwiIHVzaW5nIGN1c3RvbSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbW9kZWwgXCIke2ZpZWxkSW5zdGFuY2UudGhyb3VnaH1cIiBoYXMgbm8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aHJvdWdoRmllbGRzIGtleS4gQ2Fubm90IGRldGVybWluZSB3aGljaCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWVsZHMgcmVmZXJlbmNlIHRoZSBpbnN0YW5jZXMgcGFydGFraW5nIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImluIHRoZSByZWxhdGlvbnNoaXAuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFRocm91Z2ggPSBjbGFzcyBUaHJvdWdoTW9kZWwgZXh0ZW5kcyBNb2RlbCB7fTtcblxuICAgICAgICAgICAgICAgIFRocm91Z2gubW9kZWxOYW1lID0gbTJtTmFtZSh0aGlzTW9kZWxOYW1lLCBmaWVsZE5hbWUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgUGxhaW5Gb3JlaWduS2V5ID0gY2xhc3MgUGxhaW5Gb3JlaWduS2V5IGV4dGVuZHMgRm9yZWlnbktleSB7XG4gICAgICAgICAgICAgICAgICAgIGdldCBpbnN0YWxsc0JhY2t3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGdldCBpbnN0YWxsc0JhY2t3YXJkc0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IEZvcmVpZ25LZXlDbGFzcyA9IHNlbGZSZWZlcmVuY2luZ1xuICAgICAgICAgICAgICAgICAgICA/IFBsYWluRm9yZWlnbktleVxuICAgICAgICAgICAgICAgICAgICA6IEZvcmVpZ25LZXk7XG4gICAgICAgICAgICAgICAgVGhyb3VnaC5maWVsZHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBhdHRyKCksXG4gICAgICAgICAgICAgICAgICAgIFtmcm9tRmllbGROYW1lXTogbmV3IEZvcmVpZ25LZXlDbGFzcyh0aGlzTW9kZWxOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgW3RvRmllbGROYW1lXTogbmV3IEZvcmVpZ25LZXlDbGFzcyh0b01vZGVsTmFtZSksXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFRocm91Z2guaW52YWxpZGF0ZUNsYXNzQ2FjaGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmltcGxpY2l0VGhyb3VnaE1vZGVscy5wdXNoKFRocm91Z2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEge0BsaW5rIE1vZGVsfSBjbGFzcyBieSBpdHMgbmFtZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG1vZGVsTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzIHRvIGdldFxuICAgICAqIEB0aHJvd3MgSWYge0BsaW5rIE1vZGVsfSBjbGFzcyBpcyBub3QgZm91bmQuXG4gICAgICogQHJldHVybiB7TW9kZWx9IHRoZSB7QGxpbmsgTW9kZWx9IGNsYXNzLCBpZiBmb3VuZFxuICAgICAqL1xuICAgIGdldChtb2RlbE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsTW9kZWxzID0gdGhpcy5yZWdpc3RyeS5jb25jYXQodGhpcy5pbXBsaWNpdFRocm91Z2hNb2RlbHMpO1xuICAgICAgICBjb25zdCBmb3VuZCA9IE9iamVjdC52YWx1ZXMoYWxsTW9kZWxzKS5maW5kKFxuICAgICAgICAgICAgKG1vZGVsKSA9PiBtb2RlbC5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZm91bmQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBmaW5kIG1vZGVsICR7bW9kZWxOYW1lfSBmcm9tIHJlZ2lzdHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBnZXRNb2RlbENsYXNzZXMoKSB7XG4gICAgICAgIHRoaXMuX3NldHVwTW9kZWxQcm90b3R5cGVzKHRoaXMucmVnaXN0cnkpO1xuICAgICAgICB0aGlzLl9zZXR1cE1vZGVsUHJvdG90eXBlcyh0aGlzLmltcGxpY2l0VGhyb3VnaE1vZGVscyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmNvbmNhdCh0aGlzLmltcGxpY2l0VGhyb3VnaE1vZGVscyk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVTY2hlbWFTcGVjKCkge1xuICAgICAgICBjb25zdCBtb2RlbHMgPSB0aGlzLmdldE1vZGVsQ2xhc3NlcygpO1xuICAgICAgICBjb25zdCB0YWJsZXMgPSBtb2RlbHMucmVkdWNlKChzcGVjLCBtb2RlbENsYXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBtb2RlbENsYXNzLm1vZGVsTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlU3BlYyA9IG1vZGVsQ2xhc3MudGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0YWJsZVNwZWMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihpc1Jlc2VydmVkVGFibGVPcHRpb24pXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUmVzZXJ2ZWQga2V5d29yZCBcXGAke2tleX1cXGAgdXNlZCBpbiAke3RhYmxlTmFtZX0ub3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzcGVjW3RhYmxlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiB7IC4uLm1vZGVsQ2xhc3MuZmllbGRzIH0sXG4gICAgICAgICAgICAgICAgLi4udGFibGVTcGVjLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiB7IHRhYmxlcyB9O1xuICAgIH1cblxuICAgIGdldERhdGFiYXNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGIpIHtcbiAgICAgICAgICAgIHRoaXMuZGIgPSB0aGlzLmNyZWF0ZURhdGFiYXNlKHRoaXMuZ2VuZXJhdGVTY2hlbWFTcGVjKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVtcHR5IGRhdGFiYXNlIHN0YXRlLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGVtcHR5IHN0YXRlXG4gICAgICovXG4gICAgZ2V0RW1wdHlTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRFbXB0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW5zIGFuIGltbXV0YWJsZSBkYXRhYmFzZSBzZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzdGF0ZSAgLSB0aGUgc3RhdGUgdGhlIGRhdGFiYXNlIG1hbmFnZXNcbiAgICAgKiBAcmV0dXJuIHtTZXNzaW9ufSBhIG5ldyB7QGxpbmsgU2Vzc2lvbn0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXNzaW9uKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbih0aGlzLCB0aGlzLmdldERhdGFiYXNlKCksIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbnMgYSBtdXRhYmxlIGRhdGFiYXNlIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHN0YXRlICAtIHRoZSBzdGF0ZSB0aGUgZGF0YWJhc2UgbWFuYWdlc1xuICAgICAqIEByZXR1cm4ge1Nlc3Npb259IGEgbmV3IHtAbGluayBTZXNzaW9ufSBpbnN0YW5jZVxuICAgICAqL1xuICAgIG11dGFibGVTZXNzaW9uKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbih0aGlzLCB0aGlzLmdldERhdGFiYXNlKCksIHN0YXRlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zZXR1cE1vZGVsUHJvdG90eXBlcyhtb2RlbHMpIHtcbiAgICAgICAgbW9kZWxzXG4gICAgICAgICAgICAuZmlsdGVyKChtb2RlbCkgPT4gIW1vZGVsLmlzU2V0VXApXG4gICAgICAgICAgICAuZm9yRWFjaCgobW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpZWxkcywgbW9kZWxOYW1lLCBxdWVyeVNldENsYXNzIH0gPSBtb2RlbDtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtmaWVsZE5hbWUsIGZpZWxkXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmaWVsZCBpbnN0YW5jZW9mIEZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke21vZGVsTmFtZX0uJHtmaWVsZE5hbWV9IGlzIG9mIHR5cGUgXCIke3R5cGVvZiBmaWVsZH1cIiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBGaWVsZC4gUGxlYXNlIHVzZSB0aGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImBhdHRyYCwgYGZrYCwgYG9uZVRvT25lYCBhbmQgYG1hbnlgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbnMgdG8gZGVmaW5lIGZpZWxkcy5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRmllbGRJbnN0YWxsZWQobW9kZWxOYW1lLCBmaWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnN0YWxsRmllbGQoZmllbGQsIGZpZWxkTmFtZSwgbW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0RmllbGRJbnN0YWxsZWQobW9kZWxOYW1lLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXR0YWNoUXVlcnlTZXRNZXRob2RzKG1vZGVsLCBxdWVyeVNldENsYXNzKTtcbiAgICAgICAgICAgICAgICBtb2RlbC5pc1NldFVwID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2lzRmllbGRJbnN0YWxsZWQobW9kZWxOYW1lLCBmaWVsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFsbGVkRmllbGRzLmhhc093blByb3BlcnR5KG1vZGVsTmFtZSlcbiAgICAgICAgICAgID8gISF0aGlzLmluc3RhbGxlZEZpZWxkc1ttb2RlbE5hbWVdW2ZpZWxkTmFtZV1cbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2V0RmllbGRJbnN0YWxsZWQobW9kZWxOYW1lLCBmaWVsZE5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbGxlZEZpZWxkcy5oYXNPd25Qcm9wZXJ0eShtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbGxlZEZpZWxkc1ttb2RlbE5hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YWxsZWRGaWVsZHNbbW9kZWxOYW1lXVtmaWVsZE5hbWVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnN0YWxscyBhIGZpZWxkIG9uIGEgbW9kZWwgYW5kIGl0cyByZWxhdGVkIG1vZGVscyBpZiBuZWNlc3NhcnkuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5zdGFsbEZpZWxkKGZpZWxkLCBmaWVsZE5hbWUsIG1vZGVsKSB7XG4gICAgICAgIGNvbnN0IEZpZWxkSW5zdGFsbGVyID0gZmllbGQuaW5zdGFsbGVyQ2xhc3M7XG4gICAgICAgIG5ldyBGaWVsZEluc3RhbGxlcih7XG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgb3JtOiB0aGlzLFxuICAgICAgICB9KS5ydW4oKTtcbiAgICB9XG5cbiAgICAvLyBERVBSRUNBVEVEIEFORCBSRU1PVkVEIE1FVEhPRFNcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgT1JNI211dGFibGVTZXNzaW9ufSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHdpdGhNdXRhdGlvbnMoc3RhdGUpIHtcbiAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICBcImBPUk0ucHJvdG90eXBlLndpdGhNdXRhdGlvbnNgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFwiICtcbiAgICAgICAgICAgICAgICBcIlVzZSBgT1JNLnByb3RvdHlwZS5tdXRhYmxlU2Vzc2lvbmAgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5tdXRhYmxlU2Vzc2lvbihzdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPUk0jc2Vzc2lvbn0gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBmcm9tKHN0YXRlKSB7XG4gICAgICAgIHdhcm5EZXByZWNhdGVkKFxuICAgICAgICAgICAgXCJgT1JNLnByb3RvdHlwZS5mcm9tYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBcIiArXG4gICAgICAgICAgICAgICAgXCJVc2UgYE9STS5wcm90b3R5cGUuc2Vzc2lvbmAgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uKHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE9STSNnZXRFbXB0eVN0YXRlfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGdldERlZmF1bHRTdGF0ZSgpIHtcbiAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICBcImBPUk0ucHJvdG90eXBlLmdldERlZmF1bHRTdGF0ZWAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFwiICtcbiAgICAgICAgICAgICAgICBcImBPUk0ucHJvdG90eXBlLmdldEVtcHR5U3RhdGVgIGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW1wdHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERlZmluZSBhIE1vZGVsIGNsYXNzIGluc3RlYWQuXG4gICAgICovXG4gICAgZGVmaW5lKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImBPUk0ucHJvdG90eXBlLmRlZmluZWAgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIGRlZmluZSBhIE1vZGVsIGNsYXNzLlwiXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRGVwcmVjYXRlZFNjaGVtYSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiU2NoZW1hIGhhcyBiZWVuIHJlbmFtZWQgdG8gT1JNLiBQbGVhc2UgaW1wb3J0IE9STSBpbnN0ZWFkIG9mIFNjaGVtYSBcIiArXG4gICAgICAgICAgICBcImZyb20gUmVkdXgtT1JNLlwiXG4gICAgKTtcbn1cblxuZXhwb3J0IHsgT1JNIH07XG5cbmV4cG9ydCBkZWZhdWx0IE9STTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ORM.js\n");
/***/ }),
@@ -4474,7 +4496,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\n\n/**\n * This class is used to build and make queries to the database\n * and operating the resulting set (such as updating attributes\n * or deleting the records).\n *\n * The queries are built lazily. For example:\n *\n * ```javascript\n * const qs = Book.all()\n * .filter(book => book.releaseYear > 1999)\n * .orderBy('name');\n * ```\n *\n * Doesn't execute a query. The query is executed only when\n * you need information from the query result, such as {@link QuerySet#count},\n * {@link QuerySet#toRefArray}. After the query is executed, the resulting\n * set is cached in the QuerySet instance.\n *\n * QuerySet instances also return copies, so chaining filters doesn't\n * mutate the previous instances.\n */\n\nconst QuerySet = /*#__PURE__*/function () {\n /**\n * Creates a QuerySet. The constructor is mainly for internal use;\n * You should access QuerySet instances from {@link Model}.\n *\n * @param {Model} modelClass - the model class of objects in this QuerySet.\n * @param {any[]} clauses - query clauses needed to evaluate the set.\n * @param {Object} [opts] - additional options\n */\n function QuerySet(modelClass, clauses, opts) {\n Object.assign(this, {\n modelClass,\n clauses: clauses || []\n });\n this._opts = opts;\n }\n\n QuerySet.addSharedMethod = function addSharedMethod(methodName) {\n this.sharedMethods = this.sharedMethods.concat(methodName);\n };\n\n var _proto = QuerySet.prototype;\n\n _proto._new = function _new(clauses, userOpts) {\n const opts = { ...this._opts,\n ...userOpts\n };\n return new this.constructor(this.modelClass, clauses, opts);\n };\n\n _proto.toString = function toString() {\n this._evaluate();\n\n const contents = this.rows.map(({\n id\n }) => this.modelClass.withId(id).toString()).join(\"\\n - \");\n return `QuerySet contents:\\n - ${contents}`;\n }\n /**\n * Returns an array of the plain objects represented by the QuerySet.\n * The plain objects are direct references to the store.\n *\n * @return {Object[]} references to the plain JS objects represented by\n * the QuerySet\n */\n ;\n\n _proto.toRefArray = function toRefArray() {\n return this._evaluate();\n }\n /**\n * Returns an array of {@link Model} instances represented by the QuerySet.\n * @return {Model[]} model instances represented by the QuerySet\n */\n ;\n\n _proto.toModelArray = function toModelArray() {\n const {\n modelClass: ModelClass\n } = this;\n return this._evaluate().map(props => new ModelClass(props));\n }\n /**\n * Returns the number of {@link Model} instances represented by the QuerySet.\n *\n * @return {number} length of the QuerySet\n */\n ;\n\n _proto.count = function count() {\n this._evaluate();\n\n return this.rows.length;\n }\n /**\n * Checks if the {@link QuerySet} instance has any records matching the query\n * in the database.\n *\n * @return {Boolean} `true` if the {@link QuerySet} instance contains entities, else `false`.\n */\n ;\n\n _proto.exists = function exists() {\n return Boolean(this.count());\n }\n /**\n * Returns the {@link Model} instance at index `index` in the {@link QuerySet} instance if\n * `withRefs` flag is set to `false`, or a reference to the plain JavaScript\n * object in the model state if `true`.\n *\n * @param {number} index - index of the model instance to get\n * @return {Model|undefined} a {@link Model} instance at index\n * `index` in the {@link QuerySet} instance,\n * or undefined if the index is out of bounds.\n */\n ;\n\n _proto.at = function at(index) {\n const {\n modelClass: ModelClass\n } = this;\n\n const rows = this._evaluate();\n\n if (index >= 0 && index < rows.length) {\n return new ModelClass(rows[index]);\n }\n\n return undefined;\n }\n /**\n * Returns the {@link Model} instance at index 0 in the {@link QuerySet} instance.\n * @return {Model}\n */\n ;\n\n _proto.first = function first() {\n return this.at(0);\n }\n /**\n * Returns the {@link Model} instance at index `QuerySet.count() - 1`\n * @return {Model}\n */\n ;\n\n _proto.last = function last() {\n const rows = this._evaluate();\n\n return this.at(rows.length - 1);\n }\n /**\n * Returns a new {@link QuerySet} instance with the same entities.\n * @return {QuerySet} a new QuerySet with the same entities.\n */\n ;\n\n _proto.all = function all() {\n return this._new(this.clauses);\n }\n /**\n * Returns a new {@link QuerySet} instance with entities that match properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to match objects with. Can also be a function.\n * It works the same as [Lodash filter](https://lodash.com/docs/#filter).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that passed the filter.\n */\n ;\n\n _proto.filter = function filter(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj = typeof lookupObj === \"object\" ? Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"mapValues\"])(lookupObj, _utils__WEBPACK_IMPORTED_MODULE_1__[\"normalizeEntity\"]) : lookupObj;\n const filterDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"FILTER\"],\n payload: normalizedLookupObj\n };\n /**\n * create a new QuerySet\n * including only rows matching the lookupObj\n */\n\n return this._new(this.clauses.concat(filterDescriptor));\n }\n /**\n * Returns a new {@link QuerySet} instance with entities that do not match\n * properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to unmatch objects with. Can also be a function.\n * It works the same as [Lodash reject](https://lodash.com/docs/#reject).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that did not pass the filter.\n */\n ;\n\n _proto.exclude = function exclude(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj = typeof lookupObj === \"object\" ? Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"mapValues\"])(lookupObj, _utils__WEBPACK_IMPORTED_MODULE_1__[\"normalizeEntity\"]) : lookupObj;\n const excludeDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"EXCLUDE\"],\n payload: normalizedLookupObj\n };\n /**\n * create a new QuerySet\n * excluding all rows matching the lookupObj\n */\n\n return this._new(this.clauses.concat(excludeDescriptor));\n }\n /**\n * Performs the actual database query.\n * @private\n * @return {Array} rows corresponding to the QuerySet's clauses\n */\n ;\n\n _proto._evaluate = function _evaluate() {\n if (typeof this.modelClass.session === \"undefined\") {\n throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `, \"Create a session using `session = orm.session()` and use \", `\\`session[\"${this.modelClass.modelName}\"]\\` for querying instead.`].join(\"\"));\n }\n\n if (!this._evaluated) {\n const {\n session,\n modelName: table\n } = this.modelClass;\n const querySpec = {\n table,\n clauses: this.clauses\n };\n this.rows = session.query(querySpec).rows;\n this._evaluated = true;\n }\n\n return this.rows;\n }\n /**\n * Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending\n * order, unless otherwise specified. Delegates to [Lodash orderBy](https://lodash.com/docs/#orderBy).\n *\n * @param {string[]|Function[]} iteratees - an array where each item can be a string or a\n * function. If a string is supplied, it should\n * correspond to property on the entity that will\n * determine the order. If a function is supplied,\n * it should return the value to order by.\n * @param {Array<Boolean|'asc'|'desc'>} [orders] - the sort orders of `iteratees`. If unspecified, all iteratees\n * will be sorted in ascending order. `true` and `'asc'`\n * correspond to ascending order, and `false` and `'desc'`\n * to descending order.\n * @return {QuerySet} a new {@link QuerySet} with objects ordered by `iteratees`.\n */\n ;\n\n _proto.orderBy = function orderBy(iteratees, orders) {\n const orderByDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"ORDER_BY\"],\n payload: [iteratees, orders]\n };\n /**\n * create a new QuerySet\n * sorting all rows according to the passed arguments\n */\n\n return this._new(this.clauses.concat(orderByDescriptor));\n }\n /**\n * Records an update specified with `mergeObj` to all the objects\n * in the {@link QuerySet} instance.\n *\n * @param {Object} mergeObj - an object to merge with all the objects in this\n * queryset.\n * @return {undefined}\n */\n ;\n\n _proto.update = function update(mergeObj) {\n const {\n session,\n modelName: table\n } = this.modelClass;\n session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_2__[\"UPDATE\"],\n query: {\n table,\n clauses: this.clauses\n },\n payload: mergeObj\n });\n this._evaluated = false;\n }\n /**\n * Records a deletion of all the objects in this {@link QuerySet} instance.\n * @return {undefined}\n */\n ;\n\n _proto.delete = function _delete() {\n const {\n session,\n modelName: table\n } = this.modelClass;\n this.toModelArray().forEach(model => model._onDelete() // eslint-disable-line no-underscore-dangle\n );\n session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_2__[\"DELETE\"],\n query: {\n table,\n clauses: this.clauses\n }\n });\n this._evaluated = false;\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated\n * Use {@link QuerySet#toModelArray} or predicate functions that\n * instantiate Models from refs, e.g. `new Model(ref)`.\n */\n ;\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to map.\n */\n _proto.map = function map() {\n throw new Error(\"`QuerySet.prototype.map` has been removed. \" + \"Call `.toModelArray()` or `.toRefArray()` first to map.\");\n }\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to iterate.\n */\n ;\n\n _proto.forEach = function forEach() {\n throw new Error(\"`QuerySet.prototype.forEach` has been removed. \" + \"Call `.toModelArray()` or `.toRefArray()` first to iterate.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(QuerySet, [{\n key: \"withModels\",\n get: function () {\n throw new Error(\"`QuerySet.prototype.withModels` has been removed. \" + \"Use `.toModelArray()` or predicate functions that \" + \"instantiate Models from refs, e.g. `new Model(ref)`.\");\n }\n /**\n * @deprecated Query building operates on refs only now.\n */\n\n }, {\n key: \"withRefs\",\n get: function () {\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"warnDeprecated\"])(\"`QuerySet.prototype.withRefs` has been deprecated. \" + \"Query building operates on refs only now.\");\n return undefined;\n }\n }]);\n\n return QuerySet;\n}();\n\nQuerySet.sharedMethods = [\"count\", \"at\", \"all\", \"last\", \"first\", \"filter\", \"exclude\", \"orderBy\", \"update\", \"delete\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (QuerySet);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9RdWVyeVNldC5qcz9kODM0Il0sIm5hbWVzIjpbIlF1ZXJ5U2V0IiwibW9kZWxDbGFzcyIsImNsYXVzZXMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX29wdHMiLCJhZGRTaGFyZWRNZXRob2QiLCJtZXRob2ROYW1lIiwic2hhcmVkTWV0aG9kcyIsImNvbmNhdCIsIl9uZXciLCJ1c2VyT3B0cyIsImNvbnN0cnVjdG9yIiwidG9TdHJpbmciLCJfZXZhbHVhdGUiLCJjb250ZW50cyIsInJvd3MiLCJtYXAiLCJpZCIsIndpdGhJZCIsImpvaW4iLCJ0b1JlZkFycmF5IiwidG9Nb2RlbEFycmF5IiwiTW9kZWxDbGFzcyIsInByb3BzIiwiY291bnQiLCJsZW5ndGgiLCJleGlzdHMiLCJCb29sZWFuIiwiYXQiLCJpbmRleCIsInVuZGVmaW5lZCIsImZpcnN0IiwibGFzdCIsImFsbCIsImZpbHRlciIsImxvb2t1cE9iaiIsIm5vcm1hbGl6ZWRMb29rdXBPYmoiLCJtYXBWYWx1ZXMiLCJub3JtYWxpemVFbnRpdHkiLCJmaWx0ZXJEZXNjcmlwdG9yIiwidHlwZSIsIkZJTFRFUiIsInBheWxvYWQiLCJleGNsdWRlIiwiZXhjbHVkZURlc2NyaXB0b3IiLCJFWENMVURFIiwic2Vzc2lvbiIsIkVycm9yIiwibW9kZWxOYW1lIiwiX2V2YWx1YXRlZCIsInRhYmxlIiwicXVlcnlTcGVjIiwicXVlcnkiLCJvcmRlckJ5IiwiaXRlcmF0ZWVzIiwib3JkZXJzIiwib3JkZXJCeURlc2NyaXB0b3IiLCJPUkRFUl9CWSIsInVwZGF0ZSIsIm1lcmdlT2JqIiwiYXBwbHlVcGRhdGUiLCJhY3Rpb24iLCJVUERBVEUiLCJkZWxldGUiLCJmb3JFYWNoIiwibW9kZWwiLCJfb25EZWxldGUiLCJERUxFVEUiLCJ3YXJuRGVwcmVjYXRlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJB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RUFPckIsU0FQcUIsRUFRckIsU0FScUIsRUFTckIsUUFUcUIsRUFVckIsUUFWcUIsQ0FBekI7QUFhZVQsdUVBQWYiLCJmaWxlIjoiLi9zcmMvUXVlcnlTZXQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub3JtYWxpemVFbnRpdHksIHdhcm5EZXByZWNhdGVkLCBtYXBWYWx1ZXMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBVUERBVEUsIERFTEVURSwgRklMVEVSLCBFWENMVURFLCBPUkRFUl9CWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBidWlsZCBhbmQgbWFrZSBxdWVyaWVzIHRvIHRoZSBkYXRhYmFzZVxuICogYW5kIG9wZXJhdGluZyB0aGUgcmVzdWx0aW5nIHNldCAoc3VjaCBhcyB1cGRhdGluZyBhdHRyaWJ1dGVzXG4gKiBvciBkZWxldGluZyB0aGUgcmVjb3JkcykuXG4gKlxuICogVGhlIHF1ZXJpZXMgYXJlIGJ1aWx0IGxhemlseS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgcXMgPSBCb29rLmFsbCgpXG4gKiAgICAgLmZpbHRlcihib29rID0+IGJvb2sucmVsZWFzZVllYXIgPiAxOTk5KVxuICogICAgIC5vcmRlckJ5KCduYW1lJyk7XG4gKiBgYGBcbiAqXG4gKiBEb2Vzbid0IGV4ZWN1dGUgYSBxdWVyeS4gVGhlIHF1ZXJ5IGlzIGV4ZWN1dGVkIG9ubHkgd2hlblxuICogeW91IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcXVlcnkgcmVzdWx0LCBzdWNoIGFzIHtAbGluayBRdWVyeVNldCNjb3VudH0sXG4gKiB7QGxpbmsgUXVlcnlTZXQjdG9SZWZBcnJheX0uIEFmdGVyIHRoZSBxdWVyeSBpcyBleGVjdXRlZCwgdGhlIHJlc3VsdGluZ1xuICogc2V0IGlzIGNhY2hlZCBpbiB0aGUgUXVlcnlTZXQgaW5zdGFuY2UuXG4gKlxuICogUXVlcnlTZXQgaW5zdGFuY2VzIGFsc28gcmV0dXJuIGNvcGllcywgc28gY2hhaW5pbmcgZmlsdGVycyBkb2Vzbid0XG4gKiBtdXRhdGUgdGhlIHByZXZpb3VzIGluc3RhbmNlcy5cbiAqL1xuY29uc3QgUXVlcnlTZXQgPSBjbGFzcyBRdWVyeVNldCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFF1ZXJ5U2V0LiBUaGUgY29uc3RydWN0b3IgaXMgbWFpbmx5IGZvciBpbnRlcm5hbCB1c2U7XG4gICAgICogWW91IHNob3VsZCBhY2Nlc3MgUXVlcnlTZXQgaW5zdGFuY2VzIGZyb20ge0BsaW5rIE1vZGVsfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge01vZGVsfSBtb2RlbENsYXNzIC0gdGhlIG1vZGVsIGNsYXNzIG9mIG9iamVjdHMgaW4gdGhpcyBRdWVyeVNldC5cbiAgICAgKiBAcGFyYW0gIHthbnlbXX0gY2xhdXNlcyAtIHF1ZXJ5IGNsYXVzZXMgbmVlZGVkIHRvIGV2YWx1YXRlIHRoZSBzZXQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIGFkZGl0aW9uYWwgb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsQ2xhc3MsIGNsYXVzZXMsIG9wdHMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgICAgY2xhdXNlczogY2xhdXNlcyB8fCBbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3B0cyA9IG9wdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIGFkZFNoYXJlZE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIHRoaXMuc2hhcmVkTWV0aG9kcyA9IHRoaXMuc2hhcmVkTWV0aG9kcy5jb25jYXQobWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgX25ldyhjbGF1c2VzLCB1c2VyT3B0cykge1xuICAgICAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLl9vcHRzLCAuLi51c2VyT3B0cyB9O1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tb2RlbENsYXNzLCBjbGF1c2VzLCBvcHRzKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdGUoKTtcbiAgICAgICAgY29uc3QgY29udGVudHMgPSB0aGlzLnJvd3NcbiAgICAgICAgICAgIC5tYXAoKHsgaWQgfSkgPT4gdGhpcy5tb2RlbENsYXNzLndpdGhJZChpZCkudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIC5qb2luKFwiXFxuICAgIC0gXCIpO1xuICAgICAgICByZXR1cm4gYFF1ZXJ5U2V0IGNvbnRlbnRzOlxcbiAgICAtICR7Y29udGVudHN9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwbGFpbiBvYmplY3RzIHJlcHJlc2VudGVkIGJ5IHRoZSBRdWVyeVNldC5cbiAgICAgKiBUaGUgcGxhaW4gb2JqZWN0cyBhcmUgZGlyZWN0IHJlZmVyZW5jZXMgdG8gdGhlIHN0b3JlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IHJlZmVyZW5jZXMgdG8gdGhlIHBsYWluIEpTIG9iamVjdHMgcmVwcmVzZW50ZWQgYnlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIFF1ZXJ5U2V0XG4gICAgICovXG4gICAgdG9SZWZBcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB7QGxpbmsgTW9kZWx9IGluc3RhbmNlcyByZXByZXNlbnRlZCBieSB0aGUgUXVlcnlTZXQuXG4gICAgICogQHJldHVybiB7TW9kZWxbXX0gbW9kZWwgaW5zdGFuY2VzIHJlcHJlc2VudGVkIGJ5IHRoZSBRdWVyeVNldFxuICAgICAqL1xuICAgIHRvTW9kZWxBcnJheSgpIHtcbiAgICAgICAgY29uc3QgeyBtb2RlbENsYXNzOiBNb2RlbENsYXNzIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoKS5tYXAocHJvcHMgPT4gbmV3IE1vZGVsQ2xhc3MocHJvcHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yge0BsaW5rIE1vZGVsfSBpbnN0YW5jZXMgcmVwcmVzZW50ZWQgYnkgdGhlIFF1ZXJ5U2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBsZW5ndGggb2YgdGhlIFF1ZXJ5U2V0XG4gICAgICovXG4gICAgY291bnQoKSB7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSBoYXMgYW55IHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAgICogaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB7QGxpbmsgUXVlcnlTZXR9IGluc3RhbmNlIGNvbnRhaW5zIGVudGl0aWVzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvdW50KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXggYGluZGV4YCBpbiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSBpZlxuICAgICAqIGB3aXRoUmVmc2AgZmxhZyBpcyBzZXQgdG8gYGZhbHNlYCwgb3IgYSByZWZlcmVuY2UgdG8gdGhlIHBsYWluIEphdmFTY3JpcHRcbiAgICAgKiBvYmplY3QgaW4gdGhlIG1vZGVsIHN0YXRlIGlmIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgbW9kZWwgaW5zdGFuY2UgdG8gZ2V0XG4gICAgICogQHJldHVybiB7TW9kZWx8dW5kZWZpbmVkfSBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXhcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbmRleGAgaW4gdGhlIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciB1bmRlZmluZWQgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgYXQoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBtb2RlbENsYXNzOiBNb2RlbENsYXNzIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9ldmFsdWF0ZSgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsQ2xhc3Mocm93c1tpbmRleF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIGF0IGluZGV4IDAgaW4gdGhlIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7TW9kZWx9XG4gICAgICovXG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0KDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXggYFF1ZXJ5U2V0LmNvdW50KCkgLSAxYFxuICAgICAqIEByZXR1cm4ge01vZGVsfVxuICAgICAqL1xuICAgIGxhc3QoKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9ldmFsdWF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdChyb3dzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIGVudGl0aWVzLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyBRdWVyeVNldCB3aXRoIHRoZSBzYW1lIGVudGl0aWVzLlxuICAgICAqL1xuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIHRoYXQgbWF0Y2ggcHJvcGVydGllcyBpbiBgbG9va3VwT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbG9va3VwT2JqIC0gdGhlIHByb3BlcnRpZXMgdG8gbWF0Y2ggb2JqZWN0cyB3aXRoLiBDYW4gYWxzbyBiZSBhIGZ1bmN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgd29ya3MgdGhlIHNhbWUgYXMgW0xvZGFzaCBmaWx0ZXJdKGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLyNmaWx0ZXIpLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyB7QGxpbmsgUXVlcnlTZXR9IGluc3RhbmNlIHdpdGggb2JqZWN0cyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyLlxuICAgICAqL1xuICAgIGZpbHRlcihsb29rdXBPYmopIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IGZvcmVpZ24ga2V5cyB0byBiZSBzcGVjaWZpZWQgYXMgbW9kZWwgaW5zdGFuY2VzLFxuICAgICAgICAgKiB0cmFuc2Zvcm0gbW9kZWwgaW5zdGFuY2VzIHRvIHRoZWlyIHByaW1hcnkga2V5c1xuICAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZExvb2t1cE9iaiA9XG4gICAgICAgICAgICB0eXBlb2YgbG9va3VwT2JqID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgPyBtYXBWYWx1ZXMobG9va3VwT2JqLCBub3JtYWxpemVFbnRpdHkpXG4gICAgICAgICAgICAgICAgOiBsb29rdXBPYmo7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHR5cGU6IEZJTFRFUixcbiAgICAgICAgICAgIHBheWxvYWQ6IG5vcm1hbGl6ZWRMb29rdXBPYmosXG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjcmVhdGUgYSBuZXcgUXVlcnlTZXRcbiAgICAgICAgICogaW5jbHVkaW5nIG9ubHkgcm93cyBtYXRjaGluZyB0aGUgbG9va3VwT2JqXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV3KHRoaXMuY2xhdXNlcy5jb25jYXQoZmlsdGVyRGVzY3JpcHRvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIHRoYXQgZG8gbm90IG1hdGNoXG4gICAgICogcHJvcGVydGllcyBpbiBgbG9va3VwT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbG9va3VwT2JqIC0gdGhlIHByb3BlcnRpZXMgdG8gdW5tYXRjaCBvYmplY3RzIHdpdGguIENhbiBhbHNvIGJlIGEgZnVuY3Rpb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCB3b3JrcyB0aGUgc2FtZSBhcyBbTG9kYXNoIHJlamVjdF0oaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvI3JlamVjdCkuXG4gICAgICogQHJldHVybiB7UXVlcnlTZXR9IGEgbmV3IHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2Ugd2l0aCBvYmplY3RzIHRoYXQgZGlkIG5vdCBwYXNzIHRoZSBmaWx0ZXIuXG4gICAgICovXG4gICAgZXhjbHVkZShsb29rdXBPYmopIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IGZvcmVpZ24ga2V5cyB0byBiZSBzcGVjaWZpZWQgYXMgbW9kZWwgaW5zdGFuY2VzLFxuICAgICAgICAgKiB0cmFuc2Zvcm0gbW9kZWwgaW5zdGFuY2VzIHRvIHRoZWlyIHByaW1hcnkga2V5c1xuICAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZExvb2t1cE9iaiA9XG4gICAgICAgICAgICB0eXBlb2YgbG9va3VwT2JqID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgPyBtYXBWYWx1ZXMobG9va3VwT2JqLCBub3JtYWxpemVFbnRpdHkpXG4gICAgICAgICAgICAgICAgOiBsb29rdXBPYmo7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogRVhDTFVERSxcbiAgICAgICAgICAgIHBheWxvYWQ6IG5vcm1hbGl6ZWRMb29rdXBPYmosXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNyZWF0ZSBhIG5ldyBRdWVyeVNldFxuICAgICAgICAgKiBleGNsdWRpbmcgYWxsIHJvd3MgbWF0Y2hpbmcgdGhlIGxvb2t1cE9ialxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMuY29uY2F0KGV4Y2x1ZGVEZXNjcmlwdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCBkYXRhYmFzZSBxdWVyeS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge0FycmF5fSByb3dzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFF1ZXJ5U2V0J3MgY2xhdXNlc1xuICAgICAqL1xuICAgIF9ldmFsdWF0ZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsQ2xhc3Muc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIHF1ZXJ5IHRoZSAke3RoaXMubW9kZWxDbGFzcy5tb2RlbE5hbWV9IG1vZGVsJ3MgdGFibGUgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCB1c2UgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsQ2xhc3MubW9kZWxOYW1lfVwiXVxcYCBmb3IgcXVlcnlpbmcgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2V2YWx1YXRlZCkge1xuICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uLCBtb2RlbE5hbWU6IHRhYmxlIH0gPSB0aGlzLm1vZGVsQ2xhc3M7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNwZWMgPSB7XG4gICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgY2xhdXNlczogdGhpcy5jbGF1c2VzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IHNlc3Npb24ucXVlcnkocXVlcnlTcGVjKS5yb3dzO1xuICAgICAgICAgICAgdGhpcy5fZXZhbHVhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIG9yZGVyZWQgYnkgYGl0ZXJhdGVlc2AgaW4gYXNjZW5kaW5nXG4gICAgICogb3JkZXIsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBEZWxlZ2F0ZXMgdG8gW0xvZGFzaCBvcmRlckJ5XShodHRwczovL2xvZGFzaC5jb20vZG9jcy8jb3JkZXJCeSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXXxGdW5jdGlvbltdfSBpdGVyYXRlZXMgLSBhbiBhcnJheSB3aGVyZSBlYWNoIGl0ZW0gY2FuIGJlIGEgc3RyaW5nIG9yIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gSWYgYSBzdHJpbmcgaXMgc3VwcGxpZWQsIGl0IHNob3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gcHJvcGVydHkgb24gdGhlIGVudGl0eSB0aGF0IHdpbGxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgdGhlIG9yZGVyLiBJZiBhIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRvIG9yZGVyIGJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXk8Qm9vbGVhbnwnYXNjJ3wnZGVzYyc+fSBbb3JkZXJzXSAtIHRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4gSWYgdW5zcGVjaWZpZWQsIGFsbCBpdGVyYXRlZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIGB0cnVlYCBhbmQgYCdhc2MnYFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYXNjZW5kaW5nIG9yZGVyLCBhbmQgYGZhbHNlYCBhbmQgYCdkZXNjJ2BcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyB7QGxpbmsgUXVlcnlTZXR9IHdpdGggb2JqZWN0cyBvcmRlcmVkIGJ5IGBpdGVyYXRlZXNgLlxuICAgICAqL1xuICAgIG9yZGVyQnkoaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJCeURlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiBPUkRFUl9CWSxcbiAgICAgICAgICAgIHBheWxvYWQ6IFtpdGVyYXRlZXMsIG9yZGVyc10sXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNyZWF0ZSBhIG5ldyBRdWVyeVNldFxuICAgICAgICAgKiBzb3J0aW5nIGFsbCByb3dzIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGFyZ3VtZW50c1xuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMuY29uY2F0KG9yZGVyQnlEZXNjcmlwdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhbiB1cGRhdGUgc3BlY2lmaWVkIHdpdGggYG1lcmdlT2JqYCB0byBhbGwgdGhlIG9iamVjdHNcbiAgICAgKiBpbiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbWVyZ2VPYmogLSBhbiBvYmplY3QgdG8gbWVyZ2Ugd2l0aCBhbGwgdGhlIG9iamVjdHMgaW4gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeXNldC5cbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgdXBkYXRlKG1lcmdlT2JqKSB7XG4gICAgICAgIGNvbnN0IHsgc2Vzc2lvbiwgbW9kZWxOYW1lOiB0YWJsZSB9ID0gdGhpcy5tb2RlbENsYXNzO1xuXG4gICAgICAgIHNlc3Npb24uYXBwbHlVcGRhdGUoe1xuICAgICAgICAgICAgYWN0aW9uOiBVUERBVEUsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGNsYXVzZXM6IHRoaXMuY2xhdXNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXlsb2FkOiBtZXJnZU9iaixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZXZhbHVhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhIGRlbGV0aW9uIG9mIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGlzIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGRlbGV0ZSgpIHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uLCBtb2RlbE5hbWU6IHRhYmxlIH0gPSB0aGlzLm1vZGVsQ2xhc3M7XG5cbiAgICAgICAgdGhpcy50b01vZGVsQXJyYXkoKS5mb3JFYWNoKFxuICAgICAgICAgICAgbW9kZWwgPT4gbW9kZWwuX29uRGVsZXRlKCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgICAgICApO1xuXG4gICAgICAgIHNlc3Npb24uYXBwbHlVcGRhdGUoe1xuICAgICAgICAgICAgYWN0aW9uOiBERUxFVEUsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGNsYXVzZXM6IHRoaXMuY2xhdXNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2V2YWx1YXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFUFJFQ0FURUQgQU5EIFJFTU9WRUQgTUVUSE9EU1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBVc2Uge0BsaW5rIFF1ZXJ5U2V0I3RvTW9kZWxBcnJheX0gb3IgcHJlZGljYXRlIGZ1bmN0aW9ucyB0aGF0XG4gICAgICogaW5zdGFudGlhdGUgTW9kZWxzIGZyb20gcmVmcywgZS5nLiBgbmV3IE1vZGVsKHJlZilgLlxuICAgICAqL1xuICAgIGdldCB3aXRoTW9kZWxzKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImBRdWVyeVNldC5wcm90b3R5cGUud2l0aE1vZGVsc2AgaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVXNlIGAudG9Nb2RlbEFycmF5KClgIG9yIHByZWRpY2F0ZSBmdW5jdGlvbnMgdGhhdCBcIiArXG4gICAgICAgICAgICAgICAgXCJpbnN0YW50aWF0ZSBNb2RlbHMgZnJvbSByZWZzLCBlLmcuIGBuZXcgTW9kZWwocmVmKWAuXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBRdWVyeSBidWlsZGluZyBvcGVyYXRlcyBvbiByZWZzIG9ubHkgbm93LlxuICAgICAqL1xuICAgIGdldCB3aXRoUmVmcygpIHtcbiAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICBcImBRdWVyeVNldC5wcm90b3R5cGUud2l0aFJlZnNgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFwiICtcbiAgICAgICAgICAgICAgICBcIlF1ZXJ5IGJ1aWxkaW5nIG9wZXJhdGVzIG9uIHJlZnMgb25seSBub3cuXCJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIENhbGwge0BsaW5rIFF1ZXJ5U2V0I3RvTW9kZWxBcnJheX0gb3Ige0BsaW5rIFF1ZXJ5U2V0I3RvUmVmQXJyYXl9IGZpcnN0IHRvIG1hcC5cbiAgICAgKi9cbiAgICBtYXAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiYFF1ZXJ5U2V0LnByb3RvdHlwZS5tYXBgIGhhcyBiZWVuIHJlbW92ZWQuIFwiICtcbiAgICAgICAgICAgICAgICBcIkNhbGwgYC50b01vZGVsQXJyYXkoKWAgb3IgYC50b1JlZkFycmF5KClgIGZpcnN0IHRvIG1hcC5cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQ2FsbCB7QGxpbmsgUXVlcnlTZXQjdG9Nb2RlbEFycmF5fSBvciB7QGxpbmsgUXVlcnlTZXQjdG9SZWZBcnJheX0gZmlyc3QgdG8gaXRlcmF0ZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImBRdWVyeVNldC5wcm90b3R5cGUuZm9yRWFjaGAgaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiQ2FsbCBgLnRvTW9kZWxBcnJheSgpYCBvciBgLnRvUmVmQXJyYXkoKWAgZmlyc3QgdG8gaXRlcmF0ZS5cIlxuICAgICAgICApO1xuICAgIH1cbn07XG5cblF1ZXJ5U2V0LnNoYXJlZE1ldGhvZHMgPSBbXG4gICAgXCJjb3VudFwiLFxuICAgIFwiYXRcIixcbiAgICBcImFsbFwiLFxuICAgIFwibGFzdFwiLFxuICAgIFwiZmlyc3RcIixcbiAgICBcImZpbHRlclwiLFxuICAgIFwiZXhjbHVkZVwiLFxuICAgIFwib3JkZXJCeVwiLFxuICAgIFwidXBkYXRlXCIsXG4gICAgXCJkZWxldGVcIixcbl07XG5cbmV4cG9ydCBkZWZhdWx0IFF1ZXJ5U2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/QuerySet.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\n\n/**\n * This class is used to build and make queries to the database\n * and operating the resulting set (such as updating attributes\n * or deleting the records).\n *\n * The queries are built lazily. For example:\n *\n * ```javascript\n * const qs = Book.all()\n * .filter(book => book.releaseYear > 1999)\n * .orderBy('name');\n * ```\n *\n * Doesn't execute a query. The query is executed only when\n * you need information from the query result, such as {@link QuerySet#count},\n * {@link QuerySet#toRefArray}. After the query is executed, the resulting\n * set is cached in the QuerySet instance.\n *\n * QuerySet instances also return copies, so chaining filters doesn't\n * mutate the previous instances.\n */\n\nconst QuerySet = /*#__PURE__*/function () {\n /**\n * Creates a QuerySet. The constructor is mainly for internal use;\n * You should access QuerySet instances from {@link Model}.\n *\n * @param {Model} modelClass - the model class of objects in this QuerySet.\n * @param {any[]} clauses - query clauses needed to evaluate the set.\n * @param {Object} [opts] - additional options\n */\n function QuerySet(modelClass, clauses, opts) {\n Object.assign(this, {\n modelClass,\n clauses: clauses || []\n });\n this._opts = opts;\n }\n\n QuerySet.addSharedMethod = function addSharedMethod(methodName) {\n this.sharedMethods = this.sharedMethods.concat(methodName);\n };\n\n var _proto = QuerySet.prototype;\n\n _proto._new = function _new(clauses, userOpts) {\n const opts = { ...this._opts,\n ...userOpts\n };\n return new this.constructor(this.modelClass, clauses, opts);\n };\n\n _proto.toString = function toString() {\n this._evaluate();\n\n const contents = this.rows.map(({\n id\n }) => this.modelClass.withId(id).toString()).join(\"\\n - \");\n return `QuerySet contents:\\n - ${contents}`;\n }\n /**\n * Returns an array of the plain objects represented by the QuerySet.\n * The plain objects are direct references to the store.\n *\n * @return {Object[]} references to the plain JS objects represented by\n * the QuerySet\n */\n ;\n\n _proto.toRefArray = function toRefArray() {\n return this._evaluate();\n }\n /**\n * Returns an array of {@link Model} instances represented by the QuerySet.\n * @return {Model[]} model instances represented by the QuerySet\n */\n ;\n\n _proto.toModelArray = function toModelArray() {\n const {\n modelClass: ModelClass\n } = this;\n return this._evaluate().map(props => new ModelClass(props));\n }\n /**\n * Returns the number of {@link Model} instances represented by the QuerySet.\n *\n * @return {number} length of the QuerySet\n */\n ;\n\n _proto.count = function count() {\n this._evaluate();\n\n return this.rows.length;\n }\n /**\n * Checks if the {@link QuerySet} instance has any records matching the query\n * in the database.\n *\n * @return {Boolean} `true` if the {@link QuerySet} instance contains entities, else `false`.\n */\n ;\n\n _proto.exists = function exists() {\n return Boolean(this.count());\n }\n /**\n * Returns the {@link Model} instance at index `index` in the {@link QuerySet} instance if\n * `withRefs` flag is set to `false`, or a reference to the plain JavaScript\n * object in the model state if `true`.\n *\n * @param {number} index - index of the model instance to get\n * @return {Model|undefined} a {@link Model} instance at index\n * `index` in the {@link QuerySet} instance,\n * or undefined if the index is out of bounds.\n */\n ;\n\n _proto.at = function at(index) {\n const {\n modelClass: ModelClass\n } = this;\n\n const rows = this._evaluate();\n\n if (index >= 0 && index < rows.length) {\n return new ModelClass(rows[index]);\n }\n\n return undefined;\n }\n /**\n * Returns the {@link Model} instance at index 0 in the {@link QuerySet} instance.\n * @return {Model}\n */\n ;\n\n _proto.first = function first() {\n return this.at(0);\n }\n /**\n * Returns the {@link Model} instance at index `QuerySet.count() - 1`\n * @return {Model}\n */\n ;\n\n _proto.last = function last() {\n const rows = this._evaluate();\n\n return this.at(rows.length - 1);\n }\n /**\n * Returns a new {@link QuerySet} instance with the same entities.\n * @return {QuerySet} a new QuerySet with the same entities.\n */\n ;\n\n _proto.all = function all() {\n return this._new(this.clauses);\n }\n /**\n * Returns a new {@link QuerySet} instance with entities that match properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to match objects with. Can also be a function.\n * It works the same as [Lodash filter](https://lodash.com/docs/#filter).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that passed the filter.\n */\n ;\n\n _proto.filter = function filter(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj = typeof lookupObj === \"object\" ? Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"mapValues\"])(lookupObj, _utils__WEBPACK_IMPORTED_MODULE_1__[\"normalizeEntity\"]) : lookupObj;\n const filterDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"FILTER\"],\n payload: normalizedLookupObj\n };\n /**\n * create a new QuerySet\n * including only rows matching the lookupObj\n */\n\n return this._new(this.clauses.concat(filterDescriptor));\n }\n /**\n * Returns a new {@link QuerySet} instance with entities that do not match\n * properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to unmatch objects with. Can also be a function.\n * It works the same as [Lodash reject](https://lodash.com/docs/#reject).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that did not pass the filter.\n */\n ;\n\n _proto.exclude = function exclude(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj = typeof lookupObj === \"object\" ? Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"mapValues\"])(lookupObj, _utils__WEBPACK_IMPORTED_MODULE_1__[\"normalizeEntity\"]) : lookupObj;\n const excludeDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"EXCLUDE\"],\n payload: normalizedLookupObj\n };\n /**\n * create a new QuerySet\n * excluding all rows matching the lookupObj\n */\n\n return this._new(this.clauses.concat(excludeDescriptor));\n }\n /**\n * Performs the actual database query.\n * @private\n * @return {Array} rows corresponding to the QuerySet's clauses\n */\n ;\n\n _proto._evaluate = function _evaluate() {\n if (typeof this.modelClass.session === \"undefined\") {\n throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `, \"Create a session using `session = orm.session()` and use \", `\\`session[\"${this.modelClass.modelName}\"]\\` for querying instead.`].join(\"\"));\n }\n\n if (!this._evaluated) {\n const {\n session,\n modelName: table\n } = this.modelClass;\n const querySpec = {\n table,\n clauses: this.clauses\n };\n this.rows = session.query(querySpec).rows;\n this._evaluated = true;\n }\n\n return this.rows;\n }\n /**\n * Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending\n * order, unless otherwise specified. Delegates to [Lodash orderBy](https://lodash.com/docs/#orderBy).\n *\n * @param {string[]|Function[]} iteratees - an array where each item can be a string or a\n * function. If a string is supplied, it should\n * correspond to property on the entity that will\n * determine the order. If a function is supplied,\n * it should return the value to order by.\n * @param {Array<Boolean|'asc'|'desc'>} [orders] - the sort orders of `iteratees`. If unspecified, all iteratees\n * will be sorted in ascending order. `true` and `'asc'`\n * correspond to ascending order, and `false` and `'desc'`\n * to descending order.\n * @return {QuerySet} a new {@link QuerySet} with objects ordered by `iteratees`.\n */\n ;\n\n _proto.orderBy = function orderBy(iteratees, orders) {\n const orderByDescriptor = {\n type: _constants__WEBPACK_IMPORTED_MODULE_2__[\"ORDER_BY\"],\n payload: [iteratees, orders]\n };\n /**\n * create a new QuerySet\n * sorting all rows according to the passed arguments\n */\n\n return this._new(this.clauses.concat(orderByDescriptor));\n }\n /**\n * Records an update specified with `mergeObj` to all the objects\n * in the {@link QuerySet} instance.\n *\n * @param {Object} mergeObj - an object to merge with all the objects in this\n * queryset.\n * @return {undefined}\n */\n ;\n\n _proto.update = function update(mergeObj) {\n const {\n session,\n modelName: table\n } = this.modelClass;\n session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_2__[\"UPDATE\"],\n query: {\n table,\n clauses: this.clauses\n },\n payload: mergeObj\n });\n this._evaluated = false;\n }\n /**\n * Records a deletion of all the objects in this {@link QuerySet} instance.\n * @return {undefined}\n */\n ;\n\n _proto.delete = function _delete() {\n const {\n session,\n modelName: table\n } = this.modelClass;\n this.toModelArray().forEach(model => model._onDelete() // eslint-disable-line no-underscore-dangle\n );\n session.applyUpdate({\n action: _constants__WEBPACK_IMPORTED_MODULE_2__[\"DELETE\"],\n query: {\n table,\n clauses: this.clauses\n }\n });\n this._evaluated = false;\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated\n * Use {@link QuerySet#toModelArray} or predicate functions that\n * instantiate Models from refs, e.g. `new Model(ref)`.\n */\n ;\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to map.\n */\n _proto.map = function map() {\n throw new Error(\"`QuerySet.prototype.map` has been removed. \" + \"Call `.toModelArray()` or `.toRefArray()` first to map.\");\n }\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to iterate.\n */\n ;\n\n _proto.forEach = function forEach() {\n throw new Error(\"`QuerySet.prototype.forEach` has been removed. \" + \"Call `.toModelArray()` or `.toRefArray()` first to iterate.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(QuerySet, [{\n key: \"withModels\",\n get: function () {\n throw new Error(\"`QuerySet.prototype.withModels` has been removed. \" + \"Use `.toModelArray()` or predicate functions that \" + \"instantiate Models from refs, e.g. `new Model(ref)`.\");\n }\n /**\n * @deprecated Query building operates on refs only now.\n */\n\n }, {\n key: \"withRefs\",\n get: function () {\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"warnDeprecated\"])(\"`QuerySet.prototype.withRefs` has been deprecated. \" + \"Query building operates on refs only now.\");\n return undefined;\n }\n }]);\n\n return QuerySet;\n}();\n\nQuerySet.sharedMethods = [\"count\", \"at\", \"all\", \"last\", \"first\", \"filter\", \"exclude\", \"orderBy\", \"update\", \"delete\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (QuerySet);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9RdWVyeVNldC5qcz9kODM0Il0sIm5hbWVzIjpbIlF1ZXJ5U2V0IiwibW9kZWxDbGFzcyIsImNsYXVzZXMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX29wdHMiLCJhZGRTaGFyZWRNZXRob2QiLCJtZXRob2ROYW1lIiwic2hhcmVkTWV0aG9kcyIsImNvbmNhdCIsIl9uZXciLCJ1c2VyT3B0cyIsImNvbnN0cnVjdG9yIiwidG9TdHJpbmciLCJfZXZhbHVhdGUiLCJjb250ZW50cyIsInJvd3MiLCJtYXAiLCJpZCIsIndpdGhJZCIsImpvaW4iLCJ0b1JlZkFycmF5IiwidG9Nb2RlbEFycmF5IiwiTW9kZWxDbGFzcyIsInByb3BzIiwiY291bnQiLCJsZW5ndGgiLCJleGlzdHMiLCJCb29sZWFuIiwiYXQiLCJpbmRleCIsInVuZGVmaW5lZCIsImZpcnN0IiwibGFzdCIsImFsbCIsImZpbHRlciIsImxvb2t1cE9iaiIsIm5vcm1hbGl6ZWRMb29rdXBPYmoiLCJtYXBWYWx1ZXMiLCJub3JtYWxpemVFbnRpdHkiLCJmaWx0ZXJEZXNjcmlwdG9yIiwidHlwZSIsIkZJTFRFUiIsInBheWxvYWQiLCJleGNsdWRlIiwiZXhjbHVkZURlc2NyaXB0b3IiLCJFWENMVURFIiwic2Vzc2lvbiIsIkVycm9yIiwibW9kZWxOYW1lIiwiX2V2YWx1YXRlZCIsInRhYmxlIiwicXVlcnlTcGVjIiwicXVlcnkiLCJvcmRlckJ5IiwiaXRlcmF0ZWVzIiwib3JkZXJzIiwib3JkZXJCeURlc2NyaXB0b3IiLCJPUkRFUl9CWSIsInVwZGF0ZSIsIm1lcmdlT2JqIiwiYXBwbHlVcGRhdGUiLCJhY3Rpb24iLCJVUERBVEUiLCJkZWxldGUiLCJmb3JFYWNoIiwibW9kZWwiLCJfb25EZWxldGUiLCJERUxFVEUiLCJ3YXJuRGVwcmVjYXRlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTVSYzs7QUFnVFY7QUFDSjtBQUNBO0FBQ0E7QUFuVGMsU0FvVFZqQyxHQXBUVSxHQW9UVixlQUFNO0FBQ0YsVUFBTSxJQUFJK0IsS0FBSixDQUNGLGdEQUNJLHlEQUZGLENBQU47QUFJSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBOVRjOztBQUFBLFNBK1RWaUIsT0EvVFUsR0ErVFYsbUJBQVU7QUFDTixVQUFNLElBQUlqQixLQUFKLENBQ0Ysb0RBQ0ksNkRBRkYsQ0FBTjtBQUlILEdBcFVTOztBQUFBO0FBQUE7QUFBQSxTQTZSVixZQUFpQjtBQUNiLFlBQU0sSUFBSUEsS0FBSixDQUNGLHVEQUNJLG9EQURKLEdBRUksc0RBSEYsQ0FBTjtBQUtIO0FBRUQ7QUFDSjtBQUNBOztBQXZTYztBQUFBO0FBQUEsU0F3U1YsWUFBZTtBQUNYcUIsbUVBQWMsQ0FDVix3REFDSSwyQ0FGTSxDQUFkO0FBSUEsYUFBT3RDLFNBQVA7QUFDSDtBQTlTUzs7QUFBQTtBQUFBLEdBQWQ7O0FBdVVBaEMsUUFBUSxDQUFDUyxhQUFULEdBQXlCLENBQ3JCLE9BRHFCLEVBRXJCLElBRnFCLEVBR3JCLEtBSHFCLEVBSXJCLE1BSnFCLEVBS3JCLE9BTHFCLEVBTXJCLFFBTnFCLEVBT3JCLFNBUHFCLEVBUXJCLFNBUnFCLEVBU3JCLFFBVHFCLEVBVXJCLFFBVnFCLENBQXpCO0FBYWVULHVFQUFmIiwiZmlsZSI6Ii4vc3JjL1F1ZXJ5U2V0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9ybWFsaXplRW50aXR5LCB3YXJuRGVwcmVjYXRlZCwgbWFwVmFsdWVzIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgVVBEQVRFLCBERUxFVEUsIEZJTFRFUiwgRVhDTFVERSwgT1JERVJfQlkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYnVpbGQgYW5kIG1ha2UgcXVlcmllcyB0byB0aGUgZGF0YWJhc2VcbiAqIGFuZCBvcGVyYXRpbmcgdGhlIHJlc3VsdGluZyBzZXQgKHN1Y2ggYXMgdXBkYXRpbmcgYXR0cmlidXRlc1xuICogb3IgZGVsZXRpbmcgdGhlIHJlY29yZHMpLlxuICpcbiAqIFRoZSBxdWVyaWVzIGFyZSBidWlsdCBsYXppbHkuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IHFzID0gQm9vay5hbGwoKVxuICogICAgIC5maWx0ZXIoYm9vayA9PiBib29rLnJlbGVhc2VZZWFyID4gMTk5OSlcbiAqICAgICAub3JkZXJCeSgnbmFtZScpO1xuICogYGBgXG4gKlxuICogRG9lc24ndCBleGVjdXRlIGEgcXVlcnkuIFRoZSBxdWVyeSBpcyBleGVjdXRlZCBvbmx5IHdoZW5cbiAqIHlvdSBuZWVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHF1ZXJ5IHJlc3VsdCwgc3VjaCBhcyB7QGxpbmsgUXVlcnlTZXQjY291bnR9LFxuICoge0BsaW5rIFF1ZXJ5U2V0I3RvUmVmQXJyYXl9LiBBZnRlciB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQsIHRoZSByZXN1bHRpbmdcbiAqIHNldCBpcyBjYWNoZWQgaW4gdGhlIFF1ZXJ5U2V0IGluc3RhbmNlLlxuICpcbiAqIFF1ZXJ5U2V0IGluc3RhbmNlcyBhbHNvIHJldHVybiBjb3BpZXMsIHNvIGNoYWluaW5nIGZpbHRlcnMgZG9lc24ndFxuICogbXV0YXRlIHRoZSBwcmV2aW91cyBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IFF1ZXJ5U2V0ID0gY2xhc3MgUXVlcnlTZXQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBRdWVyeVNldC4gVGhlIGNvbnN0cnVjdG9yIGlzIG1haW5seSBmb3IgaW50ZXJuYWwgdXNlO1xuICAgICAqIFlvdSBzaG91bGQgYWNjZXNzIFF1ZXJ5U2V0IGluc3RhbmNlcyBmcm9tIHtAbGluayBNb2RlbH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtNb2RlbH0gbW9kZWxDbGFzcyAtIHRoZSBtb2RlbCBjbGFzcyBvZiBvYmplY3RzIGluIHRoaXMgUXVlcnlTZXQuXG4gICAgICogQHBhcmFtICB7YW55W119IGNsYXVzZXMgLSBxdWVyeSBjbGF1c2VzIG5lZWRlZCB0byBldmFsdWF0ZSB0aGUgc2V0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBhZGRpdGlvbmFsIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbENsYXNzLCBjbGF1c2VzLCBvcHRzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xuICAgICAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgICAgIGNsYXVzZXM6IGNsYXVzZXMgfHwgW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBhZGRTaGFyZWRNZXRob2QobWV0aG9kTmFtZSkge1xuICAgICAgICB0aGlzLnNoYXJlZE1ldGhvZHMgPSB0aGlzLnNoYXJlZE1ldGhvZHMuY29uY2F0KG1ldGhvZE5hbWUpO1xuICAgIH1cblxuICAgIF9uZXcoY2xhdXNlcywgdXNlck9wdHMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHsgLi4udGhpcy5fb3B0cywgLi4udXNlck9wdHMgfTtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubW9kZWxDbGFzcywgY2xhdXNlcywgb3B0cyk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlKCk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5yb3dzXG4gICAgICAgICAgICAubWFwKCh7IGlkIH0pID0+IHRoaXMubW9kZWxDbGFzcy53aXRoSWQoaWQpLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAuam9pbihcIlxcbiAgICAtIFwiKTtcbiAgICAgICAgcmV0dXJuIGBRdWVyeVNldCBjb250ZW50czpcXG4gICAgLSAke2NvbnRlbnRzfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcGxhaW4gb2JqZWN0cyByZXByZXNlbnRlZCBieSB0aGUgUXVlcnlTZXQuXG4gICAgICogVGhlIHBsYWluIG9iamVjdHMgYXJlIGRpcmVjdCByZWZlcmVuY2VzIHRvIHRoZSBzdG9yZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSByZWZlcmVuY2VzIHRvIHRoZSBwbGFpbiBKUyBvYmplY3RzIHJlcHJlc2VudGVkIGJ5XG4gICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBRdWVyeVNldFxuICAgICAqL1xuICAgIHRvUmVmQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmFsdWF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Yge0BsaW5rIE1vZGVsfSBpbnN0YW5jZXMgcmVwcmVzZW50ZWQgYnkgdGhlIFF1ZXJ5U2V0LlxuICAgICAqIEByZXR1cm4ge01vZGVsW119IG1vZGVsIGluc3RhbmNlcyByZXByZXNlbnRlZCBieSB0aGUgUXVlcnlTZXRcbiAgICAgKi9cbiAgICB0b01vZGVsQXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcyB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRlKCkubWFwKChwcm9wcykgPT4gbmV3IE1vZGVsQ2xhc3MocHJvcHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yge0BsaW5rIE1vZGVsfSBpbnN0YW5jZXMgcmVwcmVzZW50ZWQgYnkgdGhlIFF1ZXJ5U2V0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBsZW5ndGggb2YgdGhlIFF1ZXJ5U2V0XG4gICAgICovXG4gICAgY291bnQoKSB7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSBoYXMgYW55IHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAgICogaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB7QGxpbmsgUXVlcnlTZXR9IGluc3RhbmNlIGNvbnRhaW5zIGVudGl0aWVzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvdW50KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXggYGluZGV4YCBpbiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSBpZlxuICAgICAqIGB3aXRoUmVmc2AgZmxhZyBpcyBzZXQgdG8gYGZhbHNlYCwgb3IgYSByZWZlcmVuY2UgdG8gdGhlIHBsYWluIEphdmFTY3JpcHRcbiAgICAgKiBvYmplY3QgaW4gdGhlIG1vZGVsIHN0YXRlIGlmIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXggLSBpbmRleCBvZiB0aGUgbW9kZWwgaW5zdGFuY2UgdG8gZ2V0XG4gICAgICogQHJldHVybiB7TW9kZWx8dW5kZWZpbmVkfSBhIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXhcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbmRleGAgaW4gdGhlIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciB1bmRlZmluZWQgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgYXQoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgeyBtb2RlbENsYXNzOiBNb2RlbENsYXNzIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9ldmFsdWF0ZSgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsQ2xhc3Mocm93c1tpbmRleF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIGF0IGluZGV4IDAgaW4gdGhlIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7TW9kZWx9XG4gICAgICovXG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0KDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNb2RlbH0gaW5zdGFuY2UgYXQgaW5kZXggYFF1ZXJ5U2V0LmNvdW50KCkgLSAxYFxuICAgICAqIEByZXR1cm4ge01vZGVsfVxuICAgICAqL1xuICAgIGxhc3QoKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9ldmFsdWF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdChyb3dzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIGVudGl0aWVzLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyBRdWVyeVNldCB3aXRoIHRoZSBzYW1lIGVudGl0aWVzLlxuICAgICAqL1xuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIHRoYXQgbWF0Y2ggcHJvcGVydGllcyBpbiBgbG9va3VwT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbG9va3VwT2JqIC0gdGhlIHByb3BlcnRpZXMgdG8gbWF0Y2ggb2JqZWN0cyB3aXRoLiBDYW4gYWxzbyBiZSBhIGZ1bmN0aW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgd29ya3MgdGhlIHNhbWUgYXMgW0xvZGFzaCBmaWx0ZXJdKGh0dHBzOi8vbG9kYXNoLmNvbS9kb2NzLyNmaWx0ZXIpLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyB7QGxpbmsgUXVlcnlTZXR9IGluc3RhbmNlIHdpdGggb2JqZWN0cyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyLlxuICAgICAqL1xuICAgIGZpbHRlcihsb29rdXBPYmopIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IGZvcmVpZ24ga2V5cyB0byBiZSBzcGVjaWZpZWQgYXMgbW9kZWwgaW5zdGFuY2VzLFxuICAgICAgICAgKiB0cmFuc2Zvcm0gbW9kZWwgaW5zdGFuY2VzIHRvIHRoZWlyIHByaW1hcnkga2V5c1xuICAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZExvb2t1cE9iaiA9XG4gICAgICAgICAgICB0eXBlb2YgbG9va3VwT2JqID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgPyBtYXBWYWx1ZXMobG9va3VwT2JqLCBub3JtYWxpemVFbnRpdHkpXG4gICAgICAgICAgICAgICAgOiBsb29rdXBPYmo7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgIHR5cGU6IEZJTFRFUixcbiAgICAgICAgICAgIHBheWxvYWQ6IG5vcm1hbGl6ZWRMb29rdXBPYmosXG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjcmVhdGUgYSBuZXcgUXVlcnlTZXRcbiAgICAgICAgICogaW5jbHVkaW5nIG9ubHkgcm93cyBtYXRjaGluZyB0aGUgbG9va3VwT2JqXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV3KHRoaXMuY2xhdXNlcy5jb25jYXQoZmlsdGVyRGVzY3JpcHRvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIHRoYXQgZG8gbm90IG1hdGNoXG4gICAgICogcHJvcGVydGllcyBpbiBgbG9va3VwT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbG9va3VwT2JqIC0gdGhlIHByb3BlcnRpZXMgdG8gdW5tYXRjaCBvYmplY3RzIHdpdGguIENhbiBhbHNvIGJlIGEgZnVuY3Rpb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCB3b3JrcyB0aGUgc2FtZSBhcyBbTG9kYXNoIHJlamVjdF0oaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MvI3JlamVjdCkuXG4gICAgICogQHJldHVybiB7UXVlcnlTZXR9IGEgbmV3IHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2Ugd2l0aCBvYmplY3RzIHRoYXQgZGlkIG5vdCBwYXNzIHRoZSBmaWx0ZXIuXG4gICAgICovXG4gICAgZXhjbHVkZShsb29rdXBPYmopIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93IGZvcmVpZ24ga2V5cyB0byBiZSBzcGVjaWZpZWQgYXMgbW9kZWwgaW5zdGFuY2VzLFxuICAgICAgICAgKiB0cmFuc2Zvcm0gbW9kZWwgaW5zdGFuY2VzIHRvIHRoZWlyIHByaW1hcnkga2V5c1xuICAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZExvb2t1cE9iaiA9XG4gICAgICAgICAgICB0eXBlb2YgbG9va3VwT2JqID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgPyBtYXBWYWx1ZXMobG9va3VwT2JqLCBub3JtYWxpemVFbnRpdHkpXG4gICAgICAgICAgICAgICAgOiBsb29rdXBPYmo7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogRVhDTFVERSxcbiAgICAgICAgICAgIHBheWxvYWQ6IG5vcm1hbGl6ZWRMb29rdXBPYmosXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNyZWF0ZSBhIG5ldyBRdWVyeVNldFxuICAgICAgICAgKiBleGNsdWRpbmcgYWxsIHJvd3MgbWF0Y2hpbmcgdGhlIGxvb2t1cE9ialxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMuY29uY2F0KGV4Y2x1ZGVEZXNjcmlwdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCBkYXRhYmFzZSBxdWVyeS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge0FycmF5fSByb3dzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFF1ZXJ5U2V0J3MgY2xhdXNlc1xuICAgICAqL1xuICAgIF9ldmFsdWF0ZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsQ2xhc3Muc2Vzc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIHF1ZXJ5IHRoZSAke3RoaXMubW9kZWxDbGFzcy5tb2RlbE5hbWV9IG1vZGVsJ3MgdGFibGUgd2l0aG91dCBhIHNlc3Npb24uIGAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ3JlYXRlIGEgc2Vzc2lvbiB1c2luZyBgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKClgIGFuZCB1c2UgXCIsXG4gICAgICAgICAgICAgICAgICAgIGBcXGBzZXNzaW9uW1wiJHt0aGlzLm1vZGVsQ2xhc3MubW9kZWxOYW1lfVwiXVxcYCBmb3IgcXVlcnlpbmcgaW5zdGVhZC5gLFxuICAgICAgICAgICAgICAgIF0uam9pbihcIlwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2V2YWx1YXRlZCkge1xuICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uLCBtb2RlbE5hbWU6IHRhYmxlIH0gPSB0aGlzLm1vZGVsQ2xhc3M7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNwZWMgPSB7XG4gICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgY2xhdXNlczogdGhpcy5jbGF1c2VzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IHNlc3Npb24ucXVlcnkocXVlcnlTcGVjKS5yb3dzO1xuICAgICAgICAgICAgdGhpcy5fZXZhbHVhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZSB3aXRoIGVudGl0aWVzIG9yZGVyZWQgYnkgYGl0ZXJhdGVlc2AgaW4gYXNjZW5kaW5nXG4gICAgICogb3JkZXIsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBEZWxlZ2F0ZXMgdG8gW0xvZGFzaCBvcmRlckJ5XShodHRwczovL2xvZGFzaC5jb20vZG9jcy8jb3JkZXJCeSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmdbXXxGdW5jdGlvbltdfSBpdGVyYXRlZXMgLSBhbiBhcnJheSB3aGVyZSBlYWNoIGl0ZW0gY2FuIGJlIGEgc3RyaW5nIG9yIGFcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gSWYgYSBzdHJpbmcgaXMgc3VwcGxpZWQsIGl0IHNob3VsZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gcHJvcGVydHkgb24gdGhlIGVudGl0eSB0aGF0IHdpbGxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgdGhlIG9yZGVyLiBJZiBhIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRvIG9yZGVyIGJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXk8Qm9vbGVhbnwnYXNjJ3wnZGVzYyc+fSBbb3JkZXJzXSAtIHRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4gSWYgdW5zcGVjaWZpZWQsIGFsbCBpdGVyYXRlZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIGB0cnVlYCBhbmQgYCdhc2MnYFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYXNjZW5kaW5nIG9yZGVyLCBhbmQgYGZhbHNlYCBhbmQgYCdkZXNjJ2BcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIEByZXR1cm4ge1F1ZXJ5U2V0fSBhIG5ldyB7QGxpbmsgUXVlcnlTZXR9IHdpdGggb2JqZWN0cyBvcmRlcmVkIGJ5IGBpdGVyYXRlZXNgLlxuICAgICAqL1xuICAgIG9yZGVyQnkoaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJCeURlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiBPUkRFUl9CWSxcbiAgICAgICAgICAgIHBheWxvYWQ6IFtpdGVyYXRlZXMsIG9yZGVyc10sXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNyZWF0ZSBhIG5ldyBRdWVyeVNldFxuICAgICAgICAgKiBzb3J0aW5nIGFsbCByb3dzIGFjY29yZGluZyB0byB0aGUgcGFzc2VkIGFyZ3VtZW50c1xuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldyh0aGlzLmNsYXVzZXMuY29uY2F0KG9yZGVyQnlEZXNjcmlwdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhbiB1cGRhdGUgc3BlY2lmaWVkIHdpdGggYG1lcmdlT2JqYCB0byBhbGwgdGhlIG9iamVjdHNcbiAgICAgKiBpbiB0aGUge0BsaW5rIFF1ZXJ5U2V0fSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbWVyZ2VPYmogLSBhbiBvYmplY3QgdG8gbWVyZ2Ugd2l0aCBhbGwgdGhlIG9iamVjdHMgaW4gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeXNldC5cbiAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgdXBkYXRlKG1lcmdlT2JqKSB7XG4gICAgICAgIGNvbnN0IHsgc2Vzc2lvbiwgbW9kZWxOYW1lOiB0YWJsZSB9ID0gdGhpcy5tb2RlbENsYXNzO1xuXG4gICAgICAgIHNlc3Npb24uYXBwbHlVcGRhdGUoe1xuICAgICAgICAgICAgYWN0aW9uOiBVUERBVEUsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGNsYXVzZXM6IHRoaXMuY2xhdXNlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXlsb2FkOiBtZXJnZU9iaixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZXZhbHVhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhIGRlbGV0aW9uIG9mIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGlzIHtAbGluayBRdWVyeVNldH0gaW5zdGFuY2UuXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGRlbGV0ZSgpIHtcbiAgICAgICAgY29uc3QgeyBzZXNzaW9uLCBtb2RlbE5hbWU6IHRhYmxlIH0gPSB0aGlzLm1vZGVsQ2xhc3M7XG5cbiAgICAgICAgdGhpcy50b01vZGVsQXJyYXkoKS5mb3JFYWNoKFxuICAgICAgICAgICAgKG1vZGVsKSA9PiBtb2RlbC5fb25EZWxldGUoKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlXG4gICAgICAgICk7XG5cbiAgICAgICAgc2Vzc2lvbi5hcHBseVVwZGF0ZSh7XG4gICAgICAgICAgICBhY3Rpb246IERFTEVURSxcbiAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgY2xhdXNlczogdGhpcy5jbGF1c2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZXZhbHVhdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gREVQUkVDQVRFRCBBTkQgUkVNT1ZFRCBNRVRIT0RTXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFVzZSB7QGxpbmsgUXVlcnlTZXQjdG9Nb2RlbEFycmF5fSBvciBwcmVkaWNhdGUgZnVuY3Rpb25zIHRoYXRcbiAgICAgKiBpbnN0YW50aWF0ZSBNb2RlbHMgZnJvbSByZWZzLCBlLmcuIGBuZXcgTW9kZWwocmVmKWAuXG4gICAgICovXG4gICAgZ2V0IHdpdGhNb2RlbHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiYFF1ZXJ5U2V0LnByb3RvdHlwZS53aXRoTW9kZWxzYCBoYXMgYmVlbiByZW1vdmVkLiBcIiArXG4gICAgICAgICAgICAgICAgXCJVc2UgYC50b01vZGVsQXJyYXkoKWAgb3IgcHJlZGljYXRlIGZ1bmN0aW9ucyB0aGF0IFwiICtcbiAgICAgICAgICAgICAgICBcImluc3RhbnRpYXRlIE1vZGVscyBmcm9tIHJlZnMsIGUuZy4gYG5ldyBNb2RlbChyZWYpYC5cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFF1ZXJ5IGJ1aWxkaW5nIG9wZXJhdGVzIG9uIHJlZnMgb25seSBub3cuXG4gICAgICovXG4gICAgZ2V0IHdpdGhSZWZzKCkge1xuICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgIFwiYFF1ZXJ5U2V0LnByb3RvdHlwZS53aXRoUmVmc2AgaGFzIGJlZW4gZGVwcmVjYXRlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiUXVlcnkgYnVpbGRpbmcgb3BlcmF0ZXMgb24gcmVmcyBvbmx5IG5vdy5cIlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogQ2FsbCB7QGxpbmsgUXVlcnlTZXQjdG9Nb2RlbEFycmF5fSBvciB7QGxpbmsgUXVlcnlTZXQjdG9SZWZBcnJheX0gZmlyc3QgdG8gbWFwLlxuICAgICAqL1xuICAgIG1hcCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJgUXVlcnlTZXQucHJvdG90eXBlLm1hcGAgaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiQ2FsbCBgLnRvTW9kZWxBcnJheSgpYCBvciBgLnRvUmVmQXJyYXkoKWAgZmlyc3QgdG8gbWFwLlwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBDYWxsIHtAbGluayBRdWVyeVNldCN0b01vZGVsQXJyYXl9IG9yIHtAbGluayBRdWVyeVNldCN0b1JlZkFycmF5fSBmaXJzdCB0byBpdGVyYXRlLlxuICAgICAqL1xuICAgIGZvckVhY2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiYFF1ZXJ5U2V0LnByb3RvdHlwZS5mb3JFYWNoYCBoYXMgYmVlbiByZW1vdmVkLiBcIiArXG4gICAgICAgICAgICAgICAgXCJDYWxsIGAudG9Nb2RlbEFycmF5KClgIG9yIGAudG9SZWZBcnJheSgpYCBmaXJzdCB0byBpdGVyYXRlLlwiXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuUXVlcnlTZXQuc2hhcmVkTWV0aG9kcyA9IFtcbiAgICBcImNvdW50XCIsXG4gICAgXCJhdFwiLFxuICAgIFwiYWxsXCIsXG4gICAgXCJsYXN0XCIsXG4gICAgXCJmaXJzdFwiLFxuICAgIFwiZmlsdGVyXCIsXG4gICAgXCJleGNsdWRlXCIsXG4gICAgXCJvcmRlckJ5XCIsXG4gICAgXCJ1cGRhdGVcIixcbiAgICBcImRlbGV0ZVwiLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgUXVlcnlTZXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/QuerySet.js\n");
/***/ }),
@@ -4486,7 +4508,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n\n\nconst Session = /*#__PURE__*/function () {\n /**\n * Creates a new Session.\n *\n * @param {Database} db - a {@link Database} instance\n * @param {Object} state - the database state\n * @param {Boolean} [withMutations] - whether the session should mutate data\n * @param {Object} [batchToken] - used by the backend to identify objects that can be\n * mutated.\n */\n function Session(schema, db, state, withMutations, batchToken) {\n this.schema = schema;\n this.db = db;\n this.state = state || db.getEmptyState();\n this.initialState = this.state;\n this.withMutations = Boolean(withMutations);\n this.batchToken = batchToken || Object(immutable_ops__WEBPACK_IMPORTED_MODULE_1__[\"getBatchToken\"])();\n this.modelData = {};\n this.models = schema.getModelClasses();\n this.sessionBoundModels = this.models.map(modelClass => {\n function SessionBoundModel() {\n return Reflect.construct(modelClass, arguments, SessionBoundModel); // eslint-disable-line prefer-rest-params\n }\n\n Reflect.setPrototypeOf(SessionBoundModel.prototype, modelClass.prototype);\n Reflect.setPrototypeOf(SessionBoundModel, modelClass);\n Object.defineProperty(this, modelClass.modelName, {\n get: () => SessionBoundModel\n });\n SessionBoundModel.connect(this);\n return SessionBoundModel;\n });\n }\n\n var _proto = Session.prototype;\n\n _proto.getDataForModel = function getDataForModel(modelName) {\n if (!this.modelData[modelName]) {\n this.modelData[modelName] = {};\n }\n\n return this.modelData[modelName];\n };\n\n _proto.getModelData = function getModelData() {\n return this.modelData;\n };\n\n _proto.markAccessed = function markAccessed(modelName, modelIds) {\n const data = this.getDataForModel(modelName);\n\n if (!data.accessedInstances) {\n data.accessedInstances = {};\n }\n\n modelIds.forEach(id => {\n data.accessedInstances[id] = true;\n });\n };\n\n _proto.markFullTableScanned = function markFullTableScanned(modelName) {\n const data = this.getDataForModel(modelName);\n data.fullTableScanned = true;\n };\n\n _proto.markAccessedIndexes = function markAccessedIndexes(indexes) {\n indexes.forEach(([table, attr, value]) => {\n const data = this.getDataForModel(table);\n\n if (!data.accessedIndexes) {\n data.accessedIndexes = {};\n }\n\n data.accessedIndexes[attr] = [...(data.accessedIndexes[attr] || []), value];\n });\n };\n\n /**\n * Applies update to a model state.\n *\n * @private\n * @param {Object} update - the update object. Must have keys\n * `type`, `payload`.\n */\n _proto.applyUpdate = function applyUpdate(updateSpec) {\n const tx = this._getTransaction(updateSpec);\n\n const result = this.db.update(updateSpec, tx, this.state);\n const {\n status,\n state,\n payload\n } = result;\n\n if (status !== _constants__WEBPACK_IMPORTED_MODULE_2__[\"SUCCESS\"]) {\n throw new Error(`Applying update failed with status ${status}. Payload: ${payload}`);\n }\n\n this.state = state;\n return payload;\n };\n\n _proto.query = function query(querySpec) {\n const result = this.db.query(querySpec, this.state);\n\n this._markAccessedByQuery(querySpec, result);\n\n return result;\n };\n\n _proto._getTransaction = function _getTransaction(updateSpec) {\n const {\n withMutations\n } = this;\n const {\n action\n } = updateSpec;\n let {\n batchToken\n } = this;\n\n if ([_constants__WEBPACK_IMPORTED_MODULE_2__[\"UPDATE\"], _constants__WEBPACK_IMPORTED_MODULE_2__[\"DELETE\"]].includes(action)) {\n batchToken = Object(immutable_ops__WEBPACK_IMPORTED_MODULE_1__[\"getBatchToken\"])();\n }\n\n return {\n batchToken,\n withMutations\n };\n };\n\n _proto._markAccessedByQuery = function _markAccessedByQuery(querySpec, result) {\n const {\n table,\n clauses\n } = querySpec;\n const {\n rows\n } = result;\n const {\n idAttribute\n } = this[table];\n const accessedIds = new Set(rows.map(row => row[idAttribute]));\n const anyClauseFilteredByPk = clauses.some(clause => {\n if (!Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n return false;\n }\n /**\n * We previously knew which row we wanted to access,\n * so there was no need to scan the entire table.\n */\n\n\n accessedIds.add(clause.payload[idAttribute]);\n return true;\n });\n const accessedIndexes = [];\n const {\n indexes\n } = this.state[table];\n clauses.forEach(clause => {\n Object.keys(indexes).forEach(attr => {\n if (!Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"clauseFiltersByAttribute\"])(clause, attr)) {\n return;\n }\n\n const value = clause.payload[attr];\n accessedIndexes.push([table, attr, value]);\n });\n });\n\n if (anyClauseFilteredByPk) {\n /**\n * The clauses have been ordered so that an indexed one was\n * the first to have been evaluated, and thus only the row\n * with the specified PK value has actually been accessed.\n */\n this.markAccessed(table, accessedIds);\n } else if (accessedIndexes.length) {\n /**\n * At least one clause was optimized using indexes.\n */\n this.markAccessed(table, accessedIds);\n this.markAccessedIndexes(accessedIndexes);\n } else {\n /**\n * At least one clause could not be efficiently optimized\n * or no clause was specified at all.\n */\n this.markFullTableScanned(table);\n }\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Access {@link Session#state} instead.\n */\n ;\n\n _proto.getNextState = function getNextState() {\n Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"warnDeprecated\"])(\"`Session.prototype.getNextState` has been deprecated. Access \" + \"the `Session.prototype.state` property instead.\");\n return this.state;\n }\n /**\n * @deprecated\n * The Redux integration API is now decoupled from ORM and Session.<br>\n * See the 0.9 migration guide in the GitHub repo.\n */\n ;\n\n _proto.reduce = function reduce() {\n throw new Error(\"`Session.prototype.reduce` has been removed. The Redux integration API \" + \"is now decoupled from ORM and Session - see the 0.9 migration guide \" + \"in the GitHub repo.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Session, [{\n key: \"accessedModelInstances\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.accessedInstances) {\n result[key] = value.accessedInstances;\n }\n\n return result;\n }, {});\n }\n }, {\n key: \"fullTableScannedModels\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.fullTableScanned) {\n result.push(key);\n }\n\n return result;\n }, []);\n }\n }, {\n key: \"accessedIndexes\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.accessedIndexes) {\n result[key] = value.accessedIndexes;\n }\n\n return result;\n }, {});\n }\n }]);\n\n return Session;\n}();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Session);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9TZXNzaW9uLmpzPzU5MWMiXSwibmFtZXMiOlsiU2Vzc2lvbiIsInNjaGVtYSIsImRiIiwic3RhdGUiLCJ3aXRoTXV0YXRpb25zIiwiYmF0Y2hUb2tlbiIsImdldEVtcHR5U3RhdGUiLCJpbml0aWFsU3RhdGUiLCJCb29sZWFuIiwiZ2V0QmF0Y2hUb2tlbiIsIm1vZGVsRGF0YSIsIm1vZGVscyIsImdldE1vZGVsQ2xhc3NlcyIsInNlc3Npb25Cb3VuZE1vZGVscyIsIm1hcCIsIm1vZGVsQ2xhc3MiLCJTZXNzaW9uQm91bmRNb2RlbCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcmd1bWVudHMiLCJzZXRQcm90b3R5cGVPZiIsInByb3RvdHlwZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibW9kZWxOYW1lIiwiZ2V0IiwiY29ubmVjdCIsImdldERhdGFGb3JNb2RlbCIsImdldE1vZGVsRGF0YSIsIm1hcmtBY2Nlc3NlZCIsIm1vZGVsSWRzIiwiZGF0YSIsImFjY2Vzc2VkSW5zdGFuY2VzIiwiZm9yRWFjaCIsImlkIiwibWFya0Z1bGxUYWJsZVNjYW5uZWQiLCJmdWxsVGFibGVTY2FubmVkIiwibWFya0FjY2Vzc2VkSW5kZXhlcyIsImluZGV4ZXMiLCJ0YWJsZSIsImF0dHIiLCJ2YWx1ZSIsImFjY2Vzc2VkSW5kZXhlcyIsImFwcGx5VXBkYXRlIiwidXBkYXRlU3BlYyIsInR4IiwiX2dldFRyYW5zYWN0aW9uIiwicmVzdWx0IiwidXBkYXRlIiwic3RhdHVzIiwicGF5bG9hZCIsIlNVQ0NFU1MiLCJFcnJvciIsInF1ZXJ5IiwicXVlcnlTcGVjIiwiX21hcmtBY2Nlc3NlZEJ5UXVlcnkiLCJhY3Rpb24iLCJVUERBVEUiLCJERUxFVEUiLCJpbmNsdWRlcyIsImNsYXVzZXMiLCJyb3dzIiwiaWRBdHRyaWJ1dGUiLCJhY2Nlc3NlZElkcyIsIlNldCIsInJvdyIsImFueUNsYXVzZUZpbHRlcmVkQnlQayIsInNvbWUiLCJjbGF1c2UiLCJjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUiLCJhZGQiLCJrZXlzIiwicHVzaCIsImxlbmd0aCIsImdldE5leHRTdGF0ZSIsIndhcm5EZXByZWNhdGVkIiwicmVkdWNlIiwiZW50cmllcyIsImtleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFDQTs7QUFFQSxNQUFNQSxPQUFPO0FBQ1Q7Ozs7Ozs7OztBQVNBLG1CQUFZQyxNQUFaLEVBQW9CQyxFQUFwQixFQUF3QkMsS0FBeEIsRUFBK0JDLGFBQS9CLEVBQThDQyxVQUE5QyxFQUEwRDtBQUN0RCxTQUFLSixNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLQyxFQUFMLEdBQVVBLEVBQVY7QUFDQSxTQUFLQyxLQUFMLEdBQWFBLEtBQUssSUFBSUQsRUFBRSxDQUFDSSxhQUFILEVBQXRCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFLSixLQUF6QjtBQUVBLFNBQUtDLGFBQUwsR0FBcUJJLE9BQU8sQ0FBQ0osYUFBRCxDQUE1QjtBQUNBLFNBQUtDLFVBQUwsR0FBa0JBLFVBQVUsSUFBSUksbUVBQWEsRUFBN0M7QUFFQSxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCO0FBRUEsU0FBS0MsTUFBTCxHQUFjVixNQUFNLENBQUNXLGVBQVAsRUFBZDtBQUVBLFNBQUtDLGtCQUFMLEdBQTBCLEtBQUtGLE1BQUwsQ0FBWUcsR0FBWixDQUFnQkMsVUFBVSxJQUFJO0FBQ3BELGVBQVNDLGlCQUFULEdBQTZCO0FBQ3pCLGVBQU9DLE9BQU8sQ0FBQ0MsU0FBUixDQUNISCxVQURHLEVBRUhJLFNBRkcsRUFHSEgsaUJBSEcsQ0FBUCxDQUR5QixDQUt0QjtBQUNOOztBQUNEQyxhQUFPLENBQUNHLGNBQVIsQ0FDSUosaUJBQWlCLENBQUNLLFNBRHRCLEVBRUlOLFVBQVUsQ0FBQ00sU0FGZjtBQUlBSixhQUFPLENBQUNHLGNBQVIsQ0FBdUJKLGlCQUF2QixFQUEwQ0QsVUFBMUM7QUFFQU8sWUFBTSxDQUFDQyxjQUFQLENBQXNCLElBQXRCLEVBQTRCUixV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L1Nlc3Npb24uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRCYXRjaFRva2VuIH0gZnJvbSBcImltbXV0YWJsZS1vcHNcIjtcblxuaW1wb3J0IHsgU1VDQ0VTUywgVVBEQVRFLCBERUxFVEUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdhcm5EZXByZWNhdGVkLCBjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBTZXNzaW9uID0gY2xhc3MgU2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RGF0YWJhc2V9IGRiIC0gYSB7QGxpbmsgRGF0YWJhc2V9IGluc3RhbmNlXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzdGF0ZSAtIHRoZSBkYXRhYmFzZSBzdGF0ZVxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IFt3aXRoTXV0YXRpb25zXSAtIHdoZXRoZXIgdGhlIHNlc3Npb24gc2hvdWxkIG11dGF0ZSBkYXRhXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbYmF0Y2hUb2tlbl0gLSB1c2VkIGJ5IHRoZSBiYWNrZW5kIHRvIGlkZW50aWZ5IG9iamVjdHMgdGhhdCBjYW4gYmVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBkYiwgc3RhdGUsIHdpdGhNdXRhdGlvbnMsIGJhdGNoVG9rZW4pIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMuZGIgPSBkYjtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IGRiLmdldEVtcHR5U3RhdGUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIHRoaXMud2l0aE11dGF0aW9ucyA9IEJvb2xlYW4od2l0aE11dGF0aW9ucyk7XG4gICAgICAgIHRoaXMuYmF0Y2hUb2tlbiA9IGJhdGNoVG9rZW4gfHwgZ2V0QmF0Y2hUb2tlbigpO1xuXG4gICAgICAgIHRoaXMubW9kZWxEYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5tb2RlbHMgPSBzY2hlbWEuZ2V0TW9kZWxDbGFzc2VzKCk7XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uQm91bmRNb2RlbHMgPSB0aGlzLm1vZGVscy5tYXAobW9kZWxDbGFzcyA9PiB7XG4gICAgICAgICAgICBmdW5jdGlvbiBTZXNzaW9uQm91bmRNb2RlbCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QoXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkJvdW5kTW9kZWxcbiAgICAgICAgICAgICAgICApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVmbGVjdC5zZXRQcm90b3R5cGVPZihcbiAgICAgICAgICAgICAgICBTZXNzaW9uQm91bmRNb2RlbC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgbW9kZWxDbGFzcy5wcm90b3R5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBSZWZsZWN0LnNldFByb3RvdHlwZU9mKFNlc3Npb25Cb3VuZE1vZGVsLCBtb2RlbENsYXNzKTtcblxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG1vZGVsQ2xhc3MubW9kZWxOYW1lLCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBTZXNzaW9uQm91bmRNb2RlbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBTZXNzaW9uQm91bmRNb2RlbC5jb25uZWN0KHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIFNlc3Npb25Cb3VuZE1vZGVsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREYXRhRm9yTW9kZWwobW9kZWxOYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbERhdGFbbW9kZWxOYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbERhdGFbbW9kZWxOYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVttb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGdldE1vZGVsRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhO1xuICAgIH1cblxuICAgIG1hcmtBY2Nlc3NlZChtb2RlbE5hbWUsIG1vZGVsSWRzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGb3JNb2RlbChtb2RlbE5hbWUpO1xuICAgICAgICBpZiAoIWRhdGEuYWNjZXNzZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzZWRJbnN0YW5jZXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBtb2RlbElkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzZWRJbnN0YW5jZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGFjY2Vzc2VkTW9kZWxJbnN0YW5jZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmdldE1vZGVsRGF0YSgpKS5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuYWNjZXNzZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZS5hY2Nlc3NlZEluc3RhbmNlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1hcmtGdWxsVGFibGVTY2FubmVkKG1vZGVsTmFtZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREYXRhRm9yTW9kZWwobW9kZWxOYW1lKTtcbiAgICAgICAgZGF0YS5mdWxsVGFibGVTY2FubmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgZnVsbFRhYmxlU2Nhbm5lZE1vZGVscygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0TW9kZWxEYXRhKCkpLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5mdWxsVGFibGVTY2FubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBtYXJrQWNjZXNzZWRJbmRleGVzKGluZGV4ZXMpIHtcbiAgICAgICAgaW5kZXhlcy5mb3JFYWNoKChbdGFibGUsIGF0dHIsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YUZvck1vZGVsKHRhYmxlKTtcbiAgICAgICAgICAgIGlmICghZGF0YS5hY2Nlc3NlZEluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmFjY2Vzc2VkSW5kZXhlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YS5hY2Nlc3NlZEluZGV4ZXNbYXR0cl0gPSBbXG4gICAgICAgICAgICAgICAgLi4uKGRhdGEuYWNjZXNzZWRJbmRleGVzW2F0dHJdIHx8IFtdKSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBhY2Nlc3NlZEluZGV4ZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmdldE1vZGVsRGF0YSgpKS5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuYWNjZXNzZWRJbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUuYWNjZXNzZWRJbmRleGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB1cGRhdGUgdG8gYSBtb2RlbCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZSAtIHRoZSB1cGRhdGUgb2JqZWN0LiBNdXN0IGhhdmUga2V5c1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBgdHlwZWAsIGBwYXlsb2FkYC5cbiAgICAgKi9cbiAgICBhcHBseVVwZGF0ZSh1cGRhdGVTcGVjKSB7XG4gICAgICAgIGNvbnN0IHR4ID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb24odXBkYXRlU3BlYyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGIudXBkYXRlKHVwZGF0ZVNwZWMsIHR4LCB0aGlzLnN0YXRlKTtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIHN0YXRlLCBwYXlsb2FkIH0gPSByZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gU1VDQ0VTUykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBBcHBseWluZyB1cGRhdGUgZmFpbGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfS4gUGF5bG9hZDogJHtwYXlsb2FkfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuXG4gICAgcXVlcnkocXVlcnlTcGVjKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGIucXVlcnkocXVlcnlTcGVjLCB0aGlzLnN0YXRlKTtcblxuICAgICAgICB0aGlzLl9tYXJrQWNjZXNzZWRCeVF1ZXJ5KHF1ZXJ5U3BlYywgcmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9nZXRUcmFuc2FjdGlvbih1cGRhdGVTcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgd2l0aE11dGF0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9IHVwZGF0ZVNwZWM7XG4gICAgICAgIGxldCB7IGJhdGNoVG9rZW4gfSA9IHRoaXM7XG4gICAgICAgIGlmIChbVVBEQVRFLCBERUxFVEVdLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICAgICAgICAgIGJhdGNoVG9rZW4gPSBnZXRCYXRjaFRva2VuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9O1xuICAgIH1cblxuICAgIF9tYXJrQWNjZXNzZWRCeVF1ZXJ5KHF1ZXJ5U3BlYywgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGUsIGNsYXVzZXMgfSA9IHF1ZXJ5U3BlYztcbiAgICAgICAgY29uc3QgeyByb3dzIH0gPSByZXN1bHQ7XG5cbiAgICAgICAgY29uc3QgeyBpZEF0dHJpYnV0ZSB9ID0gdGhpc1t0YWJsZV07XG4gICAgICAgIGNvbnN0IGFjY2Vzc2VkSWRzID0gbmV3IFNldChyb3dzLm1hcChyb3cgPT4gcm93W2lkQXR0cmlidXRlXSkpO1xuXG4gICAgICAgIGNvbnN0IGFueUNsYXVzZUZpbHRlcmVkQnlQayA9IGNsYXVzZXMuc29tZShjbGF1c2UgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUoY2xhdXNlLCBpZEF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdlIHByZXZpb3VzbHkga25ldyB3aGljaCByb3cgd2Ugd2FudGVkIHRvIGFjY2VzcyxcbiAgICAgICAgICAgICAqIHNvIHRoZXJlIHdhcyBubyBuZWVkIHRvIHNjYW4gdGhlIGVudGlyZSB0YWJsZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWNjZXNzZWRJZHMuYWRkKGNsYXVzZS5wYXlsb2FkW2lkQXR0cmlidXRlXSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYWNjZXNzZWRJbmRleGVzID0gW107XG4gICAgICAgIGNvbnN0IHsgaW5kZXhlcyB9ID0gdGhpcy5zdGF0ZVt0YWJsZV07XG4gICAgICAgIGNsYXVzZXMuZm9yRWFjaChjbGF1c2UgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoaW5kZXhlcykuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZShjbGF1c2UsIGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGF1c2UucGF5bG9hZFthdHRyXTtcbiAgICAgICAgICAgICAgICBhY2Nlc3NlZEluZGV4ZXMucHVzaChbdGFibGUsIGF0dHIsIHZhbHVlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFueUNsYXVzZUZpbHRlcmVkQnlQaykge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgY2xhdXNlcyBoYXZlIGJlZW4gb3JkZXJlZCBzbyB0aGF0IGFuIGluZGV4ZWQgb25lIHdhc1xuICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvIGhhdmUgYmVlbiBldmFsdWF0ZWQsIGFuZCB0aHVzIG9ubHkgdGhlIHJvd1xuICAgICAgICAgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIFBLIHZhbHVlIGhhcyBhY3R1YWxseSBiZWVuIGFjY2Vzc2VkLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLm1hcmtBY2Nlc3NlZCh0YWJsZSwgYWNjZXNzZWRJZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGFjY2Vzc2VkSW5kZXhlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQXQgbGVhc3Qgb25lIGNsYXVzZSB3YXMgb3B0aW1pemVkIHVzaW5nIGluZGV4ZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMubWFya0FjY2Vzc2VkKHRhYmxlLCBhY2Nlc3NlZElkcyk7XG4gICAgICAgICAgICB0aGlzLm1hcmtBY2Nlc3NlZEluZGV4ZXMoYWNjZXNzZWRJbmRleGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQXQgbGVhc3Qgb25lIGNsYXVzZSBjb3VsZCBub3QgYmUgZWZmaWNpZW50bHkgb3B0aW1pemVkXG4gICAgICAgICAgICAgKiBvciBubyBjbGF1c2Ugd2FzIHNwZWNpZmllZCBhdCBhbGwuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMubWFya0Z1bGxUYWJsZVNjYW5uZWQodGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gREVQUkVDQVRFRCBBTkQgUkVNT1ZFRCBNRVRIT0RTXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBBY2Nlc3Mge0BsaW5rIFNlc3Npb24jc3RhdGV9IGluc3RlYWQuXG4gICAgICovXG4gICAgZ2V0TmV4dFN0YXRlKCkge1xuICAgICAgICB3YXJuRGVwcmVjYXRlZChcbiAgICAgICAgICAgIFwiYFNlc3Npb24ucHJvdG90eXBlLmdldE5leHRTdGF0ZWAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQWNjZXNzIFwiICtcbiAgICAgICAgICAgICAgICBcInRoZSBgU2Vzc2lvbi5wcm90b3R5cGUuc3RhdGVgIHByb3BlcnR5IGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBUaGUgUmVkdXggaW50ZWdyYXRpb24gQVBJIGlzIG5vdyBkZWNvdXBsZWQgZnJvbSBPUk0gYW5kIFNlc3Npb24uPGJyPlxuICAgICAqIFNlZSB0aGUgMC45IG1pZ3JhdGlvbiBndWlkZSBpbiB0aGUgR2l0SHViIHJlcG8uXG4gICAgICovXG4gICAgcmVkdWNlKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImBTZXNzaW9uLnByb3RvdHlwZS5yZWR1Y2VgIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBSZWR1eCBpbnRlZ3JhdGlvbiBBUEkgXCIgK1xuICAgICAgICAgICAgICAgIFwiaXMgbm93IGRlY291cGxlZCBmcm9tIE9STSBhbmQgU2Vzc2lvbiAtIHNlZSB0aGUgMC45IG1pZ3JhdGlvbiBndWlkZSBcIiArXG4gICAgICAgICAgICAgICAgXCJpbiB0aGUgR2l0SHViIHJlcG8uXCJcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZXNzaW9uO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Session.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n\n\n\n\nconst Session = /*#__PURE__*/function () {\n /**\n * Creates a new Session.\n *\n * @param {Database} db - a {@link Database} instance\n * @param {Object} state - the database state\n * @param {Boolean} [withMutations] - whether the session should mutate data\n * @param {Object} [batchToken] - used by the backend to identify objects that can be\n * mutated.\n */\n function Session(schema, db, state, withMutations, batchToken) {\n this.schema = schema;\n this.db = db;\n this.state = state || db.getEmptyState();\n this.initialState = this.state;\n this.withMutations = Boolean(withMutations);\n this.batchToken = batchToken || Object(immutable_ops__WEBPACK_IMPORTED_MODULE_1__[\"getBatchToken\"])();\n this.modelData = {};\n this.models = schema.getModelClasses();\n this.sessionBoundModels = this.models.map(modelClass => {\n function SessionBoundModel() {\n return Reflect.construct(modelClass, arguments, SessionBoundModel); // eslint-disable-line prefer-rest-params\n }\n\n Reflect.setPrototypeOf(SessionBoundModel.prototype, modelClass.prototype);\n Reflect.setPrototypeOf(SessionBoundModel, modelClass);\n Object.defineProperty(this, modelClass.modelName, {\n get: () => SessionBoundModel\n });\n SessionBoundModel.connect(this);\n return SessionBoundModel;\n });\n }\n\n var _proto = Session.prototype;\n\n _proto.getDataForModel = function getDataForModel(modelName) {\n if (!this.modelData[modelName]) {\n this.modelData[modelName] = {};\n }\n\n return this.modelData[modelName];\n };\n\n _proto.getModelData = function getModelData() {\n return this.modelData;\n };\n\n _proto.markAccessed = function markAccessed(modelName, modelIds) {\n const data = this.getDataForModel(modelName);\n\n if (!data.accessedInstances) {\n data.accessedInstances = {};\n }\n\n modelIds.forEach(id => {\n data.accessedInstances[id] = true;\n });\n };\n\n _proto.markFullTableScanned = function markFullTableScanned(modelName) {\n const data = this.getDataForModel(modelName);\n data.fullTableScanned = true;\n };\n\n _proto.markAccessedIndexes = function markAccessedIndexes(indexes) {\n indexes.forEach(([table, attr, value]) => {\n const data = this.getDataForModel(table);\n\n if (!data.accessedIndexes) {\n data.accessedIndexes = {};\n }\n\n data.accessedIndexes[attr] = [...(data.accessedIndexes[attr] || []), value];\n });\n };\n\n /**\n * Applies update to a model state.\n *\n * @private\n * @param {Object} update - the update object. Must have keys\n * `type`, `payload`.\n */\n _proto.applyUpdate = function applyUpdate(updateSpec) {\n const tx = this._getTransaction(updateSpec);\n\n const result = this.db.update(updateSpec, tx, this.state);\n const {\n status,\n state,\n payload\n } = result;\n\n if (status !== _constants__WEBPACK_IMPORTED_MODULE_2__[\"SUCCESS\"]) {\n throw new Error(`Applying update failed with status ${status}. Payload: ${payload}`);\n }\n\n this.state = state;\n return payload;\n };\n\n _proto.query = function query(querySpec) {\n const result = this.db.query(querySpec, this.state);\n\n this._markAccessedByQuery(querySpec, result);\n\n return result;\n };\n\n _proto._getTransaction = function _getTransaction(updateSpec) {\n const {\n withMutations\n } = this;\n const {\n action\n } = updateSpec;\n let {\n batchToken\n } = this;\n\n if ([_constants__WEBPACK_IMPORTED_MODULE_2__[\"UPDATE\"], _constants__WEBPACK_IMPORTED_MODULE_2__[\"DELETE\"]].includes(action)) {\n batchToken = Object(immutable_ops__WEBPACK_IMPORTED_MODULE_1__[\"getBatchToken\"])();\n }\n\n return {\n batchToken,\n withMutations\n };\n };\n\n _proto._markAccessedByQuery = function _markAccessedByQuery(querySpec, result) {\n const {\n table,\n clauses\n } = querySpec;\n const {\n rows\n } = result;\n const {\n idAttribute\n } = this[table];\n const accessedIds = new Set(rows.map(row => row[idAttribute]));\n const anyClauseFilteredByPk = clauses.some(clause => {\n if (!Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n return false;\n }\n /**\n * We previously knew which row we wanted to access,\n * so there was no need to scan the entire table.\n */\n\n\n accessedIds.add(clause.payload[idAttribute]);\n return true;\n });\n const accessedIndexes = [];\n const {\n indexes\n } = this.state[table];\n clauses.forEach(clause => {\n Object.keys(indexes).forEach(attr => {\n if (!Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"clauseFiltersByAttribute\"])(clause, attr)) {\n return;\n }\n\n const value = clause.payload[attr];\n accessedIndexes.push([table, attr, value]);\n });\n });\n\n if (anyClauseFilteredByPk) {\n /**\n * The clauses have been ordered so that an indexed one was\n * the first to have been evaluated, and thus only the row\n * with the specified PK value has actually been accessed.\n */\n this.markAccessed(table, accessedIds);\n } else if (accessedIndexes.length) {\n /**\n * At least one clause was optimized using indexes.\n */\n this.markAccessed(table, accessedIds);\n this.markAccessedIndexes(accessedIndexes);\n } else {\n /**\n * At least one clause could not be efficiently optimized\n * or no clause was specified at all.\n */\n this.markFullTableScanned(table);\n }\n } // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Access {@link Session#state} instead.\n */\n ;\n\n _proto.getNextState = function getNextState() {\n Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"warnDeprecated\"])(\"`Session.prototype.getNextState` has been deprecated. Access \" + \"the `Session.prototype.state` property instead.\");\n return this.state;\n }\n /**\n * @deprecated\n * The Redux integration API is now decoupled from ORM and Session.<br>\n * See the 0.9 migration guide in the GitHub repo.\n */\n ;\n\n _proto.reduce = function reduce() {\n throw new Error(\"`Session.prototype.reduce` has been removed. The Redux integration API \" + \"is now decoupled from ORM and Session - see the 0.9 migration guide \" + \"in the GitHub repo.\");\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Session, [{\n key: \"accessedModelInstances\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.accessedInstances) {\n result[key] = value.accessedInstances;\n }\n\n return result;\n }, {});\n }\n }, {\n key: \"fullTableScannedModels\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.fullTableScanned) {\n result.push(key);\n }\n\n return result;\n }, []);\n }\n }, {\n key: \"accessedIndexes\",\n get: function () {\n return Object.entries(this.getModelData()).reduce((result, [key, value]) => {\n if (value.accessedIndexes) {\n result[key] = value.accessedIndexes;\n }\n\n return result;\n }, {});\n }\n }]);\n\n return Session;\n}();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Session);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9TZXNzaW9uLmpzPzU5MWMiXSwibmFtZXMiOlsiU2Vzc2lvbiIsInNjaGVtYSIsImRiIiwic3RhdGUiLCJ3aXRoTXV0YXRpb25zIiwiYmF0Y2hUb2tlbiIsImdldEVtcHR5U3RhdGUiLCJpbml0aWFsU3RhdGUiLCJCb29sZWFuIiwiZ2V0QmF0Y2hUb2tlbiIsIm1vZGVsRGF0YSIsIm1vZGVscyIsImdldE1vZGVsQ2xhc3NlcyIsInNlc3Npb25Cb3VuZE1vZGVscyIsIm1hcCIsIm1vZGVsQ2xhc3MiLCJTZXNzaW9uQm91bmRNb2RlbCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcmd1bWVudHMiLCJzZXRQcm90b3R5cGVPZiIsInByb3RvdHlwZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibW9kZWxOYW1lIiwiZ2V0IiwiY29ubmVjdCIsImdldERhdGFGb3JNb2RlbCIsImdldE1vZGVsRGF0YSIsIm1hcmtBY2Nlc3NlZCIsIm1vZGVsSWRzIiwiZGF0YSIsImFjY2Vzc2VkSW5zdGFuY2VzIiwiZm9yRWFjaCIsImlkIiwibWFya0Z1bGxUYWJsZVNjYW5uZWQiLCJmdWxsVGFibGVTY2FubmVkIiwibWFya0FjY2Vzc2VkSW5kZXhlcyIsImluZGV4ZXMiLCJ0YWJsZSIsImF0dHIiLCJ2YWx1ZSIsImFjY2Vzc2VkSW5kZXhlcyIsImFwcGx5VXBkYXRlIiwidXBkYXRlU3BlYyIsInR4IiwiX2dldFRyYW5zYWN0aW9uIiwicmVzdWx0IiwidXBkYXRlIiwic3RhdHVzIiwicGF5bG9hZCIsIlNVQ0NFU1MiLCJFcnJvciIsInF1ZXJ5IiwicXVlcnlTcGVjIiwiX21hcmtBY2Nlc3NlZEJ5UXVlcnkiLCJhY3Rpb24iLCJVUERBVEUiLCJERUxFVEUiLCJpbmNsdWRlcyIsImNsYXVzZXMiLCJyb3dzIiwiaWRBdHRyaWJ1dGUiLCJhY2Nlc3NlZElkcyIsIlNldCIsInJvdyIsImFueUNsYXVzZUZpbHRlcmVkQnlQayIsInNvbWUiLCJjbGF1c2UiLCJjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUiLCJhZGQiLCJrZXlzIiwicHVzaCIsImxlbmd0aCIsImdldE5leHRTdGF0ZSIsIndhcm5EZXByZWNhdGVkIiwicmVkdWNlIiwiZW50cmllcyIsImtleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFDQTs7QUFFQSxNQUFNQSxPQUFPO0FBQ1Q7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0ksbUJBQVlDLE1BQVosRUFBb0JDLEVBQXBCLEVBQXdCQyxLQUF4QixFQUErQkMsYUFBL0IsRUFBOENDLFVBQTlDLEVBQTBEO0FBQ3RELFNBQUtKLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtDLEVBQUwsR0FBVUEsRUFBVjtBQUNBLFNBQUtDLEtBQUwsR0FBYUEsS0FBSyxJQUFJRCxFQUFFLENBQUNJLGFBQUgsRUFBdEI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQUtKLEtBQXpCO0FBRUEsU0FBS0MsYUFBTCxHQUFxQkksT0FBTyxDQUFDSixhQUFELENBQTVCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQkEsVUFBVSxJQUFJSSxtRUFBYSxFQUE3QztBQUVBLFNBQUtDLFNBQUwsR0FBaUIsRUFBakI7QUFFQSxTQUFLQyxNQUFMLEdBQWNWLE1BQU0sQ0FBQ1csZUFBUCxFQUFkO0FBRUEsU0FBS0Msa0JBQUwsR0FBMEIsS0FBS0YsTUFBTCxDQUFZRyxHQUFaLENBQWlCQyxVQUFELElBQWdCO0FBQ3RELGVBQVNDLGlCQUFULEdBQTZCO0FBQ3pCLGVBQU9DLE9BQU8sQ0FBQ0MsU0FBUixDQUNISCxVQURHLEVBRUhJLFNBRkcsRUFHSEgsaUJBSEcsQ0FBUCxDQUR5QixDQUt0QjtBQUNOOztBQUNEQyxhQUFPLENBQUNHLGNBQVIsQ0FDSUosaUJBQWlCLENBQUNLLFNBRHRCLEVBRUlOLFVBQVUsQ0FBQ00sU0FGZjtBQUlBSixhQUFPLENBQUNHLGNBQVIsQ0FBdUJKLGlCQUF2QixFQUEwQ0QsVUFBMUM7QUFFQU8sWUFB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QUMrQixHQUFELENBQU4sR0FBY3JDLEtBQUssQ0FBQ0MsZUFBcEI7QUFDSDs7QUFDRCxlQUFPSyxNQUFQO0FBQ0gsT0FORSxFQU9ILEVBUEcsQ0FBUDtBQVNIO0FBdkhROztBQUFBO0FBQUEsR0FBYjs7QUFrUGUvQyxzRUFBZiIsImZpbGUiOiIuL3NyYy9TZXNzaW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0QmF0Y2hUb2tlbiB9IGZyb20gXCJpbW11dGFibGUtb3BzXCI7XG5cbmltcG9ydCB7IFNVQ0NFU1MsIFVQREFURSwgREVMRVRFIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB3YXJuRGVwcmVjYXRlZCwgY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuY29uc3QgU2Vzc2lvbiA9IGNsYXNzIFNlc3Npb24ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2Vzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0RhdGFiYXNlfSBkYiAtIGEge0BsaW5rIERhdGFiYXNlfSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc3RhdGUgLSB0aGUgZGF0YWJhc2Ugc3RhdGVcbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBbd2l0aE11dGF0aW9uc10gLSB3aGV0aGVyIHRoZSBzZXNzaW9uIHNob3VsZCBtdXRhdGUgZGF0YVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2JhdGNoVG9rZW5dIC0gdXNlZCBieSB0aGUgYmFja2VuZCB0byBpZGVudGlmeSBvYmplY3RzIHRoYXQgY2FuIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgZGIsIHN0YXRlLCB3aXRoTXV0YXRpb25zLCBiYXRjaFRva2VuKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLmRiID0gZGI7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBkYi5nZXRFbXB0eVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICB0aGlzLndpdGhNdXRhdGlvbnMgPSBCb29sZWFuKHdpdGhNdXRhdGlvbnMpO1xuICAgICAgICB0aGlzLmJhdGNoVG9rZW4gPSBiYXRjaFRva2VuIHx8IGdldEJhdGNoVG9rZW4oKTtcblxuICAgICAgICB0aGlzLm1vZGVsRGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMubW9kZWxzID0gc2NoZW1hLmdldE1vZGVsQ2xhc3NlcygpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbkJvdW5kTW9kZWxzID0gdGhpcy5tb2RlbHMubWFwKChtb2RlbENsYXNzKSA9PiB7XG4gICAgICAgICAgICBmdW5jdGlvbiBTZXNzaW9uQm91bmRNb2RlbCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QoXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkJvdW5kTW9kZWxcbiAgICAgICAgICAgICAgICApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVmbGVjdC5zZXRQcm90b3R5cGVPZihcbiAgICAgICAgICAgICAgICBTZXNzaW9uQm91bmRNb2RlbC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgbW9kZWxDbGFzcy5wcm90b3R5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBSZWZsZWN0LnNldFByb3RvdHlwZU9mKFNlc3Npb25Cb3VuZE1vZGVsLCBtb2RlbENsYXNzKTtcblxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG1vZGVsQ2xhc3MubW9kZWxOYW1lLCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBTZXNzaW9uQm91bmRNb2RlbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBTZXNzaW9uQm91bmRNb2RlbC5jb25uZWN0KHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIFNlc3Npb25Cb3VuZE1vZGVsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREYXRhRm9yTW9kZWwobW9kZWxOYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbERhdGFbbW9kZWxOYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbERhdGFbbW9kZWxOYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVttb2RlbE5hbWVdO1xuICAgIH1cblxuICAgIGdldE1vZGVsRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhO1xuICAgIH1cblxuICAgIG1hcmtBY2Nlc3NlZChtb2RlbE5hbWUsIG1vZGVsSWRzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGb3JNb2RlbChtb2RlbE5hbWUpO1xuICAgICAgICBpZiAoIWRhdGEuYWNjZXNzZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzZWRJbnN0YW5jZXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBtb2RlbElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgZGF0YS5hY2Nlc3NlZEluc3RhbmNlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgYWNjZXNzZWRNb2RlbEluc3RhbmNlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0TW9kZWxEYXRhKCkpLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5hY2Nlc3NlZEluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlLmFjY2Vzc2VkSW5zdGFuY2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbWFya0Z1bGxUYWJsZVNjYW5uZWQobW9kZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGb3JNb2RlbChtb2RlbE5hbWUpO1xuICAgICAgICBkYXRhLmZ1bGxUYWJsZVNjYW5uZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGdldCBmdWxsVGFibGVTY2FubmVkTW9kZWxzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5nZXRNb2RlbERhdGEoKSkucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmZ1bGxUYWJsZVNjYW5uZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1hcmtBY2Nlc3NlZEluZGV4ZXMoaW5kZXhlcykge1xuICAgICAgICBpbmRleGVzLmZvckVhY2goKFt0YWJsZSwgYXR0ciwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREYXRhRm9yTW9kZWwodGFibGUpO1xuICAgICAgICAgICAgaWYgKCFkYXRhLmFjY2Vzc2VkSW5kZXhlcykge1xuICAgICAgICAgICAgICAgIGRhdGEuYWNjZXNzZWRJbmRleGVzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLmFjY2Vzc2VkSW5kZXhlc1thdHRyXSA9IFtcbiAgICAgICAgICAgICAgICAuLi4oZGF0YS5hY2Nlc3NlZEluZGV4ZXNbYXR0cl0gfHwgW10pLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGFjY2Vzc2VkSW5kZXhlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0TW9kZWxEYXRhKCkpLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5hY2Nlc3NlZEluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZS5hY2Nlc3NlZEluZGV4ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge31cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHVwZGF0ZSB0byBhIG1vZGVsIHN0YXRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXBkYXRlIC0gdGhlIHVwZGF0ZSBvYmplY3QuIE11c3QgaGF2ZSBrZXlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGB0eXBlYCwgYHBheWxvYWRgLlxuICAgICAqL1xuICAgIGFwcGx5VXBkYXRlKHVwZGF0ZVNwZWMpIHtcbiAgICAgICAgY29uc3QgdHggPSB0aGlzLl9nZXRUcmFuc2FjdGlvbih1cGRhdGVTcGVjKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYi51cGRhdGUodXBkYXRlU3BlYywgdHgsIHRoaXMuc3RhdGUpO1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgc3RhdGUsIHBheWxvYWQgfSA9IHJlc3VsdDtcblxuICAgICAgICBpZiAoc3RhdHVzICE9PSBTVUNDRVNTKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEFwcGx5aW5nIHVwZGF0ZSBmYWlsZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9LiBQYXlsb2FkOiAke3BheWxvYWR9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBxdWVyeShxdWVyeVNwZWMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYi5xdWVyeShxdWVyeVNwZWMsIHRoaXMuc3RhdGUpO1xuXG4gICAgICAgIHRoaXMuX21hcmtBY2Nlc3NlZEJ5UXVlcnkocXVlcnlTcGVjLCByZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgX2dldFRyYW5zYWN0aW9uKHVwZGF0ZVNwZWMpIHtcbiAgICAgICAgY29uc3QgeyB3aXRoTXV0YXRpb25zIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgbGV0IHsgYmF0Y2hUb2tlbiB9ID0gdGhpcztcbiAgICAgICAgaWYgKFtVUERBVEUsIERFTEVURV0uaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICAgICAgYmF0Y2hUb2tlbiA9IGdldEJhdGNoVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH07XG4gICAgfVxuXG4gICAgX21hcmtBY2Nlc3NlZEJ5UXVlcnkocXVlcnlTcGVjLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZSwgY2xhdXNlcyB9ID0gcXVlcnlTcGVjO1xuICAgICAgICBjb25zdCB7IHJvd3MgfSA9IHJlc3VsdDtcblxuICAgICAgICBjb25zdCB7IGlkQXR0cmlidXRlIH0gPSB0aGlzW3RhYmxlXTtcbiAgICAgICAgY29uc3QgYWNjZXNzZWRJZHMgPSBuZXcgU2V0KHJvd3MubWFwKChyb3cpID0+IHJvd1tpZEF0dHJpYnV0ZV0pKTtcblxuICAgICAgICBjb25zdCBhbnlDbGF1c2VGaWx0ZXJlZEJ5UGsgPSBjbGF1c2VzLnNvbWUoKGNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUoY2xhdXNlLCBpZEF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdlIHByZXZpb3VzbHkga25ldyB3aGljaCByb3cgd2Ugd2FudGVkIHRvIGFjY2VzcyxcbiAgICAgICAgICAgICAqIHNvIHRoZXJlIHdhcyBubyBuZWVkIHRvIHNjYW4gdGhlIGVudGlyZSB0YWJsZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWNjZXNzZWRJZHMuYWRkKGNsYXVzZS5wYXlsb2FkW2lkQXR0cmlidXRlXSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYWNjZXNzZWRJbmRleGVzID0gW107XG4gICAgICAgIGNvbnN0IHsgaW5kZXhlcyB9ID0gdGhpcy5zdGF0ZVt0YWJsZV07XG4gICAgICAgIGNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhpbmRleGVzKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUoY2xhdXNlLCBhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhdXNlLnBheWxvYWRbYXR0cl07XG4gICAgICAgICAgICAgICAgYWNjZXNzZWRJbmRleGVzLnB1c2goW3RhYmxlLCBhdHRyLCB2YWx1ZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhbnlDbGF1c2VGaWx0ZXJlZEJ5UGspIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNsYXVzZXMgaGF2ZSBiZWVuIG9yZGVyZWQgc28gdGhhdCBhbiBpbmRleGVkIG9uZSB3YXNcbiAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0byBoYXZlIGJlZW4gZXZhbHVhdGVkLCBhbmQgdGh1cyBvbmx5IHRoZSByb3dcbiAgICAgICAgICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBQSyB2YWx1ZSBoYXMgYWN0dWFsbHkgYmVlbiBhY2Nlc3NlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5tYXJrQWNjZXNzZWQodGFibGUsIGFjY2Vzc2VkSWRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3NlZEluZGV4ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEF0IGxlYXN0IG9uZSBjbGF1c2Ugd2FzIG9wdGltaXplZCB1c2luZyBpbmRleGVzLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLm1hcmtBY2Nlc3NlZCh0YWJsZSwgYWNjZXNzZWRJZHMpO1xuICAgICAgICAgICAgdGhpcy5tYXJrQWNjZXNzZWRJbmRleGVzKGFjY2Vzc2VkSW5kZXhlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEF0IGxlYXN0IG9uZSBjbGF1c2UgY291bGQgbm90IGJlIGVmZmljaWVudGx5IG9wdGltaXplZFxuICAgICAgICAgICAgICogb3Igbm8gY2xhdXNlIHdhcyBzcGVjaWZpZWQgYXQgYWxsLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLm1hcmtGdWxsVGFibGVTY2FubmVkKHRhYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERFUFJFQ0FURUQgQU5EIFJFTU9WRUQgTUVUSE9EU1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgQWNjZXNzIHtAbGluayBTZXNzaW9uI3N0YXRlfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGdldE5leHRTdGF0ZSgpIHtcbiAgICAgICAgd2FybkRlcHJlY2F0ZWQoXG4gICAgICAgICAgICBcImBTZXNzaW9uLnByb3RvdHlwZS5nZXROZXh0U3RhdGVgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIEFjY2VzcyBcIiArXG4gICAgICAgICAgICAgICAgXCJ0aGUgYFNlc3Npb24ucHJvdG90eXBlLnN0YXRlYCBwcm9wZXJ0eSBpbnN0ZWFkLlwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogVGhlIFJlZHV4IGludGVncmF0aW9uIEFQSSBpcyBub3cgZGVjb3VwbGVkIGZyb20gT1JNIGFuZCBTZXNzaW9uLjxicj5cbiAgICAgKiBTZWUgdGhlIDAuOSBtaWdyYXRpb24gZ3VpZGUgaW4gdGhlIEdpdEh1YiByZXBvLlxuICAgICAqL1xuICAgIHJlZHVjZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJgU2Vzc2lvbi5wcm90b3R5cGUucmVkdWNlYCBoYXMgYmVlbiByZW1vdmVkLiBUaGUgUmVkdXggaW50ZWdyYXRpb24gQVBJIFwiICtcbiAgICAgICAgICAgICAgICBcImlzIG5vdyBkZWNvdXBsZWQgZnJvbSBPUk0gYW5kIFNlc3Npb24gLSBzZWUgdGhlIDAuOSBtaWdyYXRpb24gZ3VpZGUgXCIgK1xuICAgICAgICAgICAgICAgIFwiaW4gdGhlIEdpdEh1YiByZXBvLlwiXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2Vzc2lvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Session.js\n");
/***/ }),
@@ -4510,7 +4532,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createDatabase\", function() { return createDatabase; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n/* harmony import */ var _Table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Table */ \"./src/db/Table.js\");\n\n\n\nconst BASE_EMPTY_STATE = {};\nObject.defineProperty(BASE_EMPTY_STATE, _constants__WEBPACK_IMPORTED_MODULE_1__[\"STATE_FLAG\"], {\n enumerable: true,\n value: true\n});\n/** @private */\n\nfunction replaceTableState(tableName, newTableState, tx, state) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n if (withMutations) {\n state[tableName] = newTableState;\n return state;\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken, tableName, newTableState, state);\n}\n/** @private */\n\n\nfunction query(tables, querySpec, state) {\n const {\n table: tableName,\n clauses\n } = querySpec;\n const table = tables[tableName];\n const rows = table.query(state[tableName], clauses);\n return {\n rows\n };\n}\n/** @private */\n\n\nfunction update(tables, updateSpec, tx, state) {\n const {\n action,\n payload\n } = updateSpec;\n let tableName;\n let nextTableState;\n let resultPayload;\n\n if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"CREATE\"]) {\n ({\n table: tableName\n } = updateSpec);\n const table = tables[tableName];\n const currTableState = state[tableName];\n const result = table.insert(tx, currTableState, payload);\n nextTableState = result.state;\n resultPayload = result.created;\n } else {\n const {\n query: querySpec\n } = updateSpec;\n ({\n table: tableName\n } = querySpec);\n const {\n rows\n } = query(tables, querySpec, state);\n const table = tables[tableName];\n const currTableState = state[tableName];\n\n if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"UPDATE\"]) {\n nextTableState = table.update(tx, currTableState, rows, payload); // return updated rows\n\n resultPayload = query(tables, querySpec, state).rows;\n } else if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"DELETE\"]) {\n nextTableState = table.delete(tx, currTableState, rows); // return original rows that we just deleted\n\n resultPayload = rows;\n } else {\n throw new Error(`Database received unknown update type: ${action}`);\n }\n }\n\n const nextDBState = replaceTableState(tableName, nextTableState, tx, state);\n return {\n status: _constants__WEBPACK_IMPORTED_MODULE_1__[\"SUCCESS\"],\n state: nextDBState,\n payload: resultPayload\n };\n}\n/**\n * @memberof db\n * @param {Object} schemaSpec\n * @return Object database\n */\n\n\nfunction createDatabase(schemaSpec) {\n const {\n tables: tableSpecs\n } = schemaSpec;\n const tables = Object.entries(tableSpecs).reduce((map, [tableName, tableSpec]) => ({ ...map,\n [tableName]: new _Table__WEBPACK_IMPORTED_MODULE_2__[\"default\"](tableSpec)\n }), {});\n\n const getEmptyState = () => Object.entries(tables).reduce((map, [tableName, table]) => ({ ...map,\n [tableName]: table.getEmptyState()\n }), BASE_EMPTY_STATE);\n\n return {\n getEmptyState,\n query: query.bind(null, tables),\n update: update.bind(null, tables),\n // Used to inspect the schema.\n describe: tableName => tables[tableName]\n };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (createDatabase);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9EYXRhYmFzZS5qcz9lZjAxIl0sIm5hbWVzIjpbIkJBU0VfRU1QVFlfU1RBVEUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIlNUQVRFX0ZMQUciLCJlbnVtZXJhYmxlIiwidmFsdWUiLCJyZXBsYWNlVGFibGVTdGF0ZSIsInRhYmxlTmFtZSIsIm5ld1RhYmxlU3RhdGUiLCJ0eCIsInN0YXRlIiwiYmF0Y2hUb2tlbiIsIndpdGhNdXRhdGlvbnMiLCJvcHMiLCJiYXRjaCIsInNldCIsInF1ZXJ5IiwidGFibGVzIiwicXVlcnlTcGVjIiwidGFibGUiLCJjbGF1c2VzIiwicm93cyIsInVwZGF0ZSIsInVwZGF0ZVNwZWMiLCJhY3Rpb24iLCJwYXlsb2FkIiwibmV4dFRhYmxlU3RhdGUiLCJyZXN1bHRQYXlsb2FkIiwiQ1JFQVRFIiwiY3VyclRhYmxlU3RhdGUiLCJyZXN1bHQiLCJpbnNlcnQiLCJjcmVhdGVkIiwiVVBEQVRFIiwiREVMRVRFIiwiZGVsZXRlIiwiRXJyb3IiLCJuZXh0REJTdGF0ZSIsInN0YXR1cyIsIlNVQ0NFU1MiLCJjcmVhdGVEYXRhYmFzZSIsInNjaGVtYVNwZWMiLCJ0YWJsZVNwZWNzIiwiZW50cmllcyIsInJlZHVjZSIsIm1hcCIsInRhYmxlU3BlYyIsIlRhYmxlIiwiZ2V0RW1wdHlTdGF0ZSIsImJpbmQiLCJkZXNjcmliZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBLE1BQU1BLGdCQUFnQixHQUFHLEVBQXpCO0FBQ0FDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkYsZ0JBQXRCLEVBQXdDRyxxREFBeEMsRUFBb0Q7QUFDaERDLFlBQVUsRUFBRSxJQURvQztBQUVoREMsT0FBSyxFQUFFO0FBRnlDLENBQXBEO0FBS0E7O0FBQ0EsU0FBU0MsaUJBQVQsQ0FBMkJDLFNBQTNCLEVBQXNDQyxhQUF0QyxFQUFxREMsRUFBckQsRUFBeURD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bGUiOiIuL3NyYy9kYi9EYXRhYmFzZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcHMgZnJvbSBcImltbXV0YWJsZS1vcHNcIjtcblxuaW1wb3J0IHsgQ1JFQVRFLCBVUERBVEUsIERFTEVURSwgU1VDQ0VTUywgU1RBVEVfRkxBRyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuaW1wb3J0IFRhYmxlIGZyb20gXCIuL1RhYmxlXCI7XG5cbmNvbnN0IEJBU0VfRU1QVFlfU1RBVEUgPSB7fTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCQVNFX0VNUFRZX1NUQVRFLCBTVEFURV9GTEFHLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdHJ1ZSxcbn0pO1xuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIHJlcGxhY2VUYWJsZVN0YXRlKHRhYmxlTmFtZSwgbmV3VGFibGVTdGF0ZSwgdHgsIHN0YXRlKSB7XG4gICAgY29uc3QgeyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH0gPSB0eDtcblxuICAgIGlmICh3aXRoTXV0YXRpb25zKSB7XG4gICAgICAgIHN0YXRlW3RhYmxlTmFtZV0gPSBuZXdUYWJsZVN0YXRlO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wcy5iYXRjaC5zZXQoYmF0Y2hUb2tlbiwgdGFibGVOYW1lLCBuZXdUYWJsZVN0YXRlLCBzdGF0ZSk7XG59XG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gcXVlcnkodGFibGVzLCBxdWVyeVNwZWMsIHN0YXRlKSB7XG4gICAgY29uc3QgeyB0YWJsZTogdGFibGVOYW1lLCBjbGF1c2VzIH0gPSBxdWVyeVNwZWM7XG4gICAgY29uc3QgdGFibGUgPSB0YWJsZXNbdGFibGVOYW1lXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucXVlcnkoc3RhdGVbdGFibGVOYW1lXSwgY2xhdXNlcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcm93cyxcbiAgICB9O1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIHVwZGF0ZSh0YWJsZXMsIHVwZGF0ZVNwZWMsIHR4LCBzdGF0ZSkge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkIH0gPSB1cGRhdGVTcGVjO1xuXG4gICAgbGV0IHRhYmxlTmFtZTtcbiAgICBsZXQgbmV4dFRhYmxlU3RhdGU7XG4gICAgbGV0IHJlc3VsdFBheWxvYWQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSBDUkVBVEUpIHtcbiAgICAgICAgKHsgdGFibGU6IHRhYmxlTmFtZSB9ID0gdXBkYXRlU3BlYyk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW3RhYmxlTmFtZV07XG4gICAgICAgIGNvbnN0IGN1cnJUYWJsZVN0YXRlID0gc3RhdGVbdGFibGVOYW1lXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGFibGUuaW5zZXJ0KHR4LCBjdXJyVGFibGVTdGF0ZSwgcGF5bG9hZCk7XG4gICAgICAgIG5leHRUYWJsZVN0YXRlID0gcmVzdWx0LnN0YXRlO1xuICAgICAgICByZXN1bHRQYXlsb2FkID0gcmVzdWx0LmNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBxdWVyeTogcXVlcnlTcGVjIH0gPSB1cGRhdGVTcGVjO1xuICAgICAgICAoeyB0YWJsZTogdGFibGVOYW1lIH0gPSBxdWVyeVNwZWMpO1xuICAgICAgICBjb25zdCB7IHJvd3MgfSA9IHF1ZXJ5KHRhYmxlcywgcXVlcnlTcGVjLCBzdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbdGFibGVOYW1lXTtcbiAgICAgICAgY29uc3QgY3VyclRhYmxlU3RhdGUgPSBzdGF0ZVt0YWJsZU5hbWVdO1xuXG4gICAgICAgIGlmIChhY3Rpb24gPT09IFVQREFURSkge1xuICAgICAgICAgICAgbmV4dFRhYmxlU3RhdGUgPSB0YWJsZS51cGRhdGUodHgsIGN1cnJUYWJsZVN0YXRlLCByb3dzLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIC8vIHJldHVybiB1cGRhdGVkIHJvd3NcbiAgICAgICAgICAgIHJlc3VsdFBheWxvYWQgPSBxdWVyeSh0YWJsZXMsIHF1ZXJ5U3BlYywgc3RhdGUpLnJvd3M7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBERUxFVEUpIHtcbiAgICAgICAgICAgIG5leHRUYWJsZVN0YXRlID0gdGFibGUuZGVsZXRlKHR4LCBjdXJyVGFibGVTdGF0ZSwgcm93cyk7XG4gICAgICAgICAgICAvLyByZXR1cm4gb3JpZ2luYWwgcm93cyB0aGF0IHdlIGp1c3QgZGVsZXRlZFxuICAgICAgICAgICAgcmVzdWx0UGF5bG9hZCA9IHJvd3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFiYXNlIHJlY2VpdmVkIHVua25vd24gdXBkYXRlIHR5cGU6ICR7YWN0aW9ufWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dERCU3RhdGUgPSByZXBsYWNlVGFibGVTdGF0ZSh0YWJsZU5hbWUsIG5leHRUYWJsZVN0YXRlLCB0eCwgc3RhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogU1VDQ0VTUyxcbiAgICAgICAgc3RhdGU6IG5leHREQlN0YXRlLFxuICAgICAgICBwYXlsb2FkOiByZXN1bHRQYXlsb2FkLFxuICAgIH07XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIGRiXG4gKiBAcGFyYW0ge09iamVjdH0gc2NoZW1hU3BlY1xuICogQHJldHVybiBPYmplY3QgZGF0YWJhc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGFiYXNlKHNjaGVtYVNwZWMpIHtcbiAgICBjb25zdCB7IHRhYmxlczogdGFibGVTcGVjcyB9ID0gc2NoZW1hU3BlYztcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZVNwZWNzKS5yZWR1Y2UoXG4gICAgICAgIChtYXAsIFt0YWJsZU5hbWUsIHRhYmxlU3BlY10pID0+ICh7XG4gICAgICAgICAgICAuLi5tYXAsXG4gICAgICAgICAgICBbdGFibGVOYW1lXTogbmV3IFRhYmxlKHRhYmxlU3BlYyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fVxuICAgICk7XG5cbiAgICBjb25zdCBnZXRFbXB0eVN0YXRlID0gKCkgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModGFibGVzKS5yZWR1Y2UoXG4gICAgICAgICAgICAobWFwLCBbdGFibGVOYW1lLCB0YWJsZV0pID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ubWFwLFxuICAgICAgICAgICAgICAgIFt0YWJsZU5hbWVdOiB0YWJsZS5nZXRFbXB0eVN0YXRlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIEJBU0VfRU1QVFlfU1RBVEVcbiAgICAgICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldEVtcHR5U3RhdGUsXG4gICAgICAgIHF1ZXJ5OiBxdWVyeS5iaW5kKG51bGwsIHRhYmxlcyksXG4gICAgICAgIHVwZGF0ZTogdXBkYXRlLmJpbmQobnVsbCwgdGFibGVzKSxcbiAgICAgICAgLy8gVXNlZCB0byBpbnNwZWN0IHRoZSBzY2hlbWEuXG4gICAgICAgIGRlc2NyaWJlOiB0YWJsZU5hbWUgPT4gdGFibGVzW3RhYmxlTmFtZV0sXG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGF0YWJhc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/db/Database.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createDatabase\", function() { return createDatabase; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n/* harmony import */ var _Table__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Table */ \"./src/db/Table.js\");\n\n\n\nconst BASE_EMPTY_STATE = {};\nObject.defineProperty(BASE_EMPTY_STATE, _constants__WEBPACK_IMPORTED_MODULE_1__[\"STATE_FLAG\"], {\n enumerable: true,\n value: true\n});\n/** @private */\n\nfunction replaceTableState(tableName, newTableState, tx, state) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n if (withMutations) {\n state[tableName] = newTableState;\n return state;\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken, tableName, newTableState, state);\n}\n/** @private */\n\n\nfunction query(tables, querySpec, state) {\n const {\n table: tableName,\n clauses\n } = querySpec;\n const table = tables[tableName];\n const rows = table.query(state[tableName], clauses);\n return {\n rows\n };\n}\n/** @private */\n\n\nfunction update(tables, updateSpec, tx, state) {\n const {\n action,\n payload\n } = updateSpec;\n let tableName;\n let nextTableState;\n let resultPayload;\n\n if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"CREATE\"]) {\n ({\n table: tableName\n } = updateSpec);\n const table = tables[tableName];\n const currTableState = state[tableName];\n const result = table.insert(tx, currTableState, payload);\n nextTableState = result.state;\n resultPayload = result.created;\n } else {\n const {\n query: querySpec\n } = updateSpec;\n ({\n table: tableName\n } = querySpec);\n const {\n rows\n } = query(tables, querySpec, state);\n const table = tables[tableName];\n const currTableState = state[tableName];\n\n if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"UPDATE\"]) {\n nextTableState = table.update(tx, currTableState, rows, payload); // return updated rows\n\n resultPayload = query(tables, querySpec, state).rows;\n } else if (action === _constants__WEBPACK_IMPORTED_MODULE_1__[\"DELETE\"]) {\n nextTableState = table.delete(tx, currTableState, rows); // return original rows that we just deleted\n\n resultPayload = rows;\n } else {\n throw new Error(`Database received unknown update type: ${action}`);\n }\n }\n\n const nextDBState = replaceTableState(tableName, nextTableState, tx, state);\n return {\n status: _constants__WEBPACK_IMPORTED_MODULE_1__[\"SUCCESS\"],\n state: nextDBState,\n payload: resultPayload\n };\n}\n/**\n * @memberof db\n * @param {Object} schemaSpec\n * @return Object database\n */\n\n\nfunction createDatabase(schemaSpec) {\n const {\n tables: tableSpecs\n } = schemaSpec;\n const tables = Object.entries(tableSpecs).reduce((map, [tableName, tableSpec]) => ({ ...map,\n [tableName]: new _Table__WEBPACK_IMPORTED_MODULE_2__[\"default\"](tableSpec)\n }), {});\n\n const getEmptyState = () => Object.entries(tables).reduce((map, [tableName, table]) => ({ ...map,\n [tableName]: table.getEmptyState()\n }), BASE_EMPTY_STATE);\n\n return {\n getEmptyState,\n query: query.bind(null, tables),\n update: update.bind(null, tables),\n // Used to inspect the schema.\n describe: tableName => tables[tableName]\n };\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (createDatabase);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9EYXRhYmFzZS5qcz9lZjAxIl0sIm5hbWVzIjpbIkJBU0VfRU1QVFlfU1RBVEUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIlNUQVRFX0ZMQUciLCJlbnVtZXJhYmxlIiwidmFsdWUiLCJyZXBsYWNlVGFibGVTdGF0ZSIsInRhYmxlTmFtZSIsIm5ld1RhYmxlU3RhdGUiLCJ0eCIsInN0YXRlIiwiYmF0Y2hUb2tlbiIsIndpdGhNdXRhdGlvbnMiLCJvcHMiLCJiYXRjaCIsInNldCIsInF1ZXJ5IiwidGFibGVzIiwicXVlcnlTcGVjIiwidGFibGUiLCJjbGF1c2VzIiwicm93cyIsInVwZGF0ZSIsInVwZGF0ZVNwZWMiLCJhY3Rpb24iLCJwYXlsb2FkIiwibmV4dFRhYmxlU3RhdGUiLCJyZXN1bHRQYXlsb2FkIiwiQ1JFQVRFIiwiY3VyclRhYmxlU3RhdGUiLCJyZXN1bHQiLCJpbnNlcnQiLCJjcmVhdGVkIiwiVVBEQVRFIiwiREVMRVRFIiwiZGVsZXRlIiwiRXJyb3IiLCJuZXh0REJTdGF0ZSIsInN0YXR1cyIsIlNVQ0NFU1MiLCJjcmVhdGVEYXRhYmFzZSIsInNjaGVtYVNwZWMiLCJ0YWJsZVNwZWNzIiwiZW50cmllcyIsInJlZHVjZSIsIm1hcCIsInRhYmxlU3BlYyIsIlRhYmxlIiwiZ2V0RW1wdHlTdGF0ZSIsImJpbmQiLCJkZXNjcmliZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBLE1BQU1BLGdCQUFnQixHQUFHLEVBQXpCO0FBQ0FDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkYsZ0JBQXRCLEVBQXdDRyxxREFBeEMsRUFBb0Q7QUFDaERDLFlBQVUsRUFBRSxJQURvQztBQUVoREMsT0FBSyxFQUFFO0FBRnlDLENBQXBEO0FBS0E7O0FBQ0EsU0FBU0MsaUJBQVQsQ0FBMkJDLFNBQTNCLEVBQXNDQyxhQUF0QyxFQUFxREMsRUFBckQsRUFBeURD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QUVjaUMsNkVBQWYiLCJmaWxlIjoiLi9zcmMvZGIvRGF0YWJhc2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3BzIGZyb20gXCJpbW11dGFibGUtb3BzXCI7XG5cbmltcG9ydCB7IENSRUFURSwgVVBEQVRFLCBERUxFVEUsIFNVQ0NFU1MsIFNUQVRFX0ZMQUcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCBUYWJsZSBmcm9tIFwiLi9UYWJsZVwiO1xuXG5jb25zdCBCQVNFX0VNUFRZX1NUQVRFID0ge307XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkFTRV9FTVBUWV9TVEFURSwgU1RBVEVfRkxBRywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHRydWUsXG59KTtcblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiByZXBsYWNlVGFibGVTdGF0ZSh0YWJsZU5hbWUsIG5ld1RhYmxlU3RhdGUsIHR4LCBzdGF0ZSkge1xuICAgIGNvbnN0IHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9ID0gdHg7XG5cbiAgICBpZiAod2l0aE11dGF0aW9ucykge1xuICAgICAgICBzdGF0ZVt0YWJsZU5hbWVdID0gbmV3VGFibGVTdGF0ZTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBvcHMuYmF0Y2guc2V0KGJhdGNoVG9rZW4sIHRhYmxlTmFtZSwgbmV3VGFibGVTdGF0ZSwgc3RhdGUpO1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIHF1ZXJ5KHRhYmxlcywgcXVlcnlTcGVjLCBzdGF0ZSkge1xuICAgIGNvbnN0IHsgdGFibGU6IHRhYmxlTmFtZSwgY2xhdXNlcyB9ID0gcXVlcnlTcGVjO1xuICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW3RhYmxlTmFtZV07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnF1ZXJ5KHN0YXRlW3RhYmxlTmFtZV0sIGNsYXVzZXMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJvd3MsXG4gICAgfTtcbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiB1cGRhdGUodGFibGVzLCB1cGRhdGVTcGVjLCB0eCwgc3RhdGUpIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCB9ID0gdXBkYXRlU3BlYztcblxuICAgIGxldCB0YWJsZU5hbWU7XG4gICAgbGV0IG5leHRUYWJsZVN0YXRlO1xuICAgIGxldCByZXN1bHRQYXlsb2FkO1xuXG4gICAgaWYgKGFjdGlvbiA9PT0gQ1JFQVRFKSB7XG4gICAgICAgICh7IHRhYmxlOiB0YWJsZU5hbWUgfSA9IHVwZGF0ZVNwZWMpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRhYmxlc1t0YWJsZU5hbWVdO1xuICAgICAgICBjb25zdCBjdXJyVGFibGVTdGF0ZSA9IHN0YXRlW3RhYmxlTmFtZV07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlLmluc2VydCh0eCwgY3VyclRhYmxlU3RhdGUsIHBheWxvYWQpO1xuICAgICAgICBuZXh0VGFibGVTdGF0ZSA9IHJlc3VsdC5zdGF0ZTtcbiAgICAgICAgcmVzdWx0UGF5bG9hZCA9IHJlc3VsdC5jcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgcXVlcnk6IHF1ZXJ5U3BlYyB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgKHsgdGFibGU6IHRhYmxlTmFtZSB9ID0gcXVlcnlTcGVjKTtcbiAgICAgICAgY29uc3QgeyByb3dzIH0gPSBxdWVyeSh0YWJsZXMsIHF1ZXJ5U3BlYywgc3RhdGUpO1xuXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW3RhYmxlTmFtZV07XG4gICAgICAgIGNvbnN0IGN1cnJUYWJsZVN0YXRlID0gc3RhdGVbdGFibGVOYW1lXTtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSBVUERBVEUpIHtcbiAgICAgICAgICAgIG5leHRUYWJsZVN0YXRlID0gdGFibGUudXBkYXRlKHR4LCBjdXJyVGFibGVTdGF0ZSwgcm93cywgcGF5bG9hZCk7XG4gICAgICAgICAgICAvLyByZXR1cm4gdXBkYXRlZCByb3dzXG4gICAgICAgICAgICByZXN1bHRQYXlsb2FkID0gcXVlcnkodGFibGVzLCBxdWVyeVNwZWMsIHN0YXRlKS5yb3dzO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gREVMRVRFKSB7XG4gICAgICAgICAgICBuZXh0VGFibGVTdGF0ZSA9IHRhYmxlLmRlbGV0ZSh0eCwgY3VyclRhYmxlU3RhdGUsIHJvd3MpO1xuICAgICAgICAgICAgLy8gcmV0dXJuIG9yaWdpbmFsIHJvd3MgdGhhdCB3ZSBqdXN0IGRlbGV0ZWRcbiAgICAgICAgICAgIHJlc3VsdFBheWxvYWQgPSByb3dzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYmFzZSByZWNlaXZlZCB1bmtub3duIHVwZGF0ZSB0eXBlOiAke2FjdGlvbn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5leHREQlN0YXRlID0gcmVwbGFjZVRhYmxlU3RhdGUodGFibGVOYW1lLCBuZXh0VGFibGVTdGF0ZSwgdHgsIHN0YXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IFNVQ0NFU1MsXG4gICAgICAgIHN0YXRlOiBuZXh0REJTdGF0ZSxcbiAgICAgICAgcGF5bG9hZDogcmVzdWx0UGF5bG9hZCxcbiAgICB9O1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiBkYlxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYVNwZWNcbiAqIEByZXR1cm4gT2JqZWN0IGRhdGFiYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRhYmFzZShzY2hlbWFTcGVjKSB7XG4gICAgY29uc3QgeyB0YWJsZXM6IHRhYmxlU3BlY3MgfSA9IHNjaGVtYVNwZWM7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmVudHJpZXModGFibGVTcGVjcykucmVkdWNlKFxuICAgICAgICAobWFwLCBbdGFibGVOYW1lLCB0YWJsZVNwZWNdKSA9PiAoe1xuICAgICAgICAgICAgLi4ubWFwLFxuICAgICAgICAgICAgW3RhYmxlTmFtZV06IG5ldyBUYWJsZSh0YWJsZVNwZWMpLFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICApO1xuXG4gICAgY29uc3QgZ2V0RW1wdHlTdGF0ZSA9ICgpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRhYmxlcykucmVkdWNlKFxuICAgICAgICAgICAgKG1hcCwgW3RhYmxlTmFtZSwgdGFibGVdKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLm1hcCxcbiAgICAgICAgICAgICAgICBbdGFibGVOYW1lXTogdGFibGUuZ2V0RW1wdHlTdGF0ZSgpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBCQVNFX0VNUFRZX1NUQVRFXG4gICAgICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXRFbXB0eVN0YXRlLFxuICAgICAgICBxdWVyeTogcXVlcnkuYmluZChudWxsLCB0YWJsZXMpLFxuICAgICAgICB1cGRhdGU6IHVwZGF0ZS5iaW5kKG51bGwsIHRhYmxlcyksXG4gICAgICAgIC8vIFVzZWQgdG8gaW5zcGVjdCB0aGUgc2NoZW1hLlxuICAgICAgICBkZXNjcmliZTogKHRhYmxlTmFtZSkgPT4gdGFibGVzW3RhYmxlTmFtZV0sXG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGF0YWJhc2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/db/Database.js\n");
/***/ }),
@@ -4522,7 +4544,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Table\", function() { return Table; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var lodash_filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/filter */ \"./node_modules/lodash/filter.js\");\n/* harmony import */ var lodash_filter__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_filter__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/orderBy */ \"./node_modules/lodash/orderBy.js\");\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_orderBy__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var lodash_reject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/reject */ \"./node_modules/lodash/reject.js\");\n/* harmony import */ var lodash_reject__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_reject__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/sortBy */ \"./node_modules/lodash/sortBy.js\");\n/* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_sortBy__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n\n\n\n\nconst DEFAULT_TABLE_OPTIONS = {\n idAttribute: \"id\",\n arrName: \"items\",\n mapName: \"itemsById\",\n fields: {}\n};\n/**\n * @private\n * @param {*} _currMax - the current max id\n * @param {*} userPassedId - the new id passed to the create action\n *\n * Both may be undefined. The current max id in the case that this is the first Model\n * being created, and the new id if the id was not explicitly passed to the\n * database.\n *\n * @return {Array} the new max id and the id to use to create the new row\n *\n * If the id's are strings, the id must be passed explicitly every time.\n * In this case, the current max id will remain `NaN` due to `Math.max`, but that's fine.\n */\n\nfunction idSequencer(_currMax, userPassedId) {\n let currMax = _currMax;\n let newMax;\n let newId;\n\n if (currMax === undefined) {\n currMax = -1;\n }\n\n if (userPassedId === undefined) {\n newMax = currMax + 1;\n newId = newMax;\n } else {\n newMax = Math.max(currMax + 1, userPassedId);\n newId = userPassedId;\n }\n\n return [newMax, // new max id\n newId // id to use for row creation\n ];\n}\n/**\n * Adapt order directions array to @{lodash.orderBy} API.\n *\n * @private\n *\n * @param {Array<Boolean|'asc'|'desc'>} orders? - an array of optional order query directions as provided to {@Link {QuerySet.orderBy}}\n * @return {Array<'asc'|'desc'>|undefined} A normalized ordering array or undefined if none was provided.\n */\n\n\nfunction normalizeOrders(orders) {\n if (orders === undefined) {\n return undefined;\n }\n\n const convert = order => {\n if ([\"desc\", false].includes(order)) {\n return \"desc\";\n }\n\n return \"asc\";\n };\n\n return Array.isArray(orders) ? orders.map(convert) : convert(orders);\n}\n/**\n * Handles the underlying data structure for a {@link Model} class.\n * @private\n */\n\n\nlet Table = /*#__PURE__*/function () {\n /**\n * Creates a new {@link Table} instance.\n * @param {Object} userOpts - options to use.\n * @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.\n * @param {string} [userOpts.arrName=items] - the state attribute where an array of\n * entity id's are stored\n * @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects\n * are stored in a id to entity object\n * map.\n * @param {string} [userOpts.fields={}] - mapping of field key to {@link Field} object\n */\n function Table(userOpts) {\n Object.assign(this, DEFAULT_TABLE_OPTIONS, userOpts);\n }\n /**\n * Returns a reference to the object at index `id`\n * in state `branch`.\n *\n * @param {Object} branch - the state\n * @param {Number} id - the id of the object to get\n * @return {Object|undefined} A reference to the raw object in the state or\n * `undefined` if not found.\n */\n\n\n var _proto = Table.prototype;\n\n _proto.accessId = function accessId(branch, id) {\n return branch[this.mapName][id];\n };\n\n _proto.accessIds = function accessIds(branch, ids) {\n const map = branch[this.mapName];\n return ids.map(id => map[id]);\n };\n\n _proto.idExists = function idExists(branch, id) {\n return branch[this.mapName].hasOwnProperty(id);\n };\n\n _proto.accessIdList = function accessIdList(branch) {\n return branch[this.arrName];\n };\n\n _proto.accessList = function accessList(branch) {\n return this.accessIds(branch, this.accessIdList(branch));\n };\n\n _proto.getMaxId = function getMaxId(branch) {\n return this.getMeta(branch, \"maxId\");\n };\n\n _proto.setMaxId = function setMaxId(tx, branch, newMaxId) {\n return this.setMeta(tx, branch, \"maxId\", newMaxId);\n };\n\n _proto.nextId = function nextId(id) {\n return id + 1;\n }\n /**\n * Returns the default state for the data structure.\n * @return {Object} The default state for this {@link ORM} instance's data structure\n */\n ;\n\n _proto.getEmptyState = function getEmptyState() {\n const pkIndex = {\n [this.arrName]: [],\n [this.mapName]: {}\n };\n const attrIndexes = Object.keys(this.fields).filter(attr => attr !== this.idAttribute).filter(attr => this.fields[attr].index).reduce((indexes, attr) => ({ ...indexes,\n [attr]: {}\n }), {});\n return { ...pkIndex,\n indexes: attrIndexes,\n meta: {}\n };\n };\n\n _proto.setMeta = function setMeta(tx, branch, key, value) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n if (withMutations) {\n const res = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.setIn([\"meta\", key], value, branch);\n return res;\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.setIn(batchToken, [\"meta\", key], value, branch);\n };\n\n _proto.getMeta = function getMeta(branch, key) {\n return branch.meta[key];\n };\n\n _proto.query = function query(branch, clauses) {\n if (clauses.length === 0) {\n return this.accessList(branch);\n }\n\n const {\n idAttribute\n } = this;\n const optimallyOrderedClauses = lodash_sortBy__WEBPACK_IMPORTED_MODULE_4___default()(clauses, clause => {\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n return 1;\n }\n\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseReducesResultSetSize\"])(clause)) {\n return 2;\n }\n\n return 3;\n });\n\n const reducer = (rows, clause) => {\n const {\n type,\n payload\n } = clause;\n\n if (!rows) {\n /**\n * First time this reducer is called during query.\n * This is where we apply query optimizations.\n */\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n /**\n * Payload specified a primary key. Use PK index\n * to look up the single row identified by the PK.\n */\n const id = payload[idAttribute];\n const remainingPayload = Object.keys(payload).reduce((withoutPkAttr, filterAttr) => {\n if (filterAttr !== idAttribute) {\n withoutPkAttr[filterAttr] = payload[filterAttr];\n }\n\n return withoutPkAttr;\n }, {});\n const ids = this.idExists(branch, id) ? [id] : [];\n\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-PK columns.\n * Filter accessed row by remaining payload (if one was found).\n */\n return reducer(this.accessIds(branch, ids), { ...clause,\n payload: remainingPayload\n });\n }\n /**\n * No need to filter these rows any further.\n * The primary key value satisfies this clause's conditions.\n */\n\n\n return this.accessIds(branch, ids);\n }\n\n if (type === _constants__WEBPACK_IMPORTED_MODULE_5__[\"FILTER\"] && typeof payload === \"object\") {\n const indexes = Object.entries(branch.indexes);\n const accessedIndexes = [];\n const indexAttrs = [];\n indexes.forEach(([attr, index]) => {\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, attr)) {\n /**\n * Payload specified an indexed attribute. Use index\n * to potentially decrease amount of accessed rows.\n */\n if (index.hasOwnProperty(payload[attr])) {\n accessedIndexes.push(index[payload[attr]]);\n indexAttrs.push(attr);\n }\n }\n });\n /**\n * Calculate set of unique PK values corresponding to each\n * foreign key's attribute value. Then retrieve all those rows.\n */\n\n if (accessedIndexes.length) {\n const lastIndex = accessedIndexes.pop();\n const indexedIds = accessedIndexes.reduce((result, index) => {\n const indexSet = new Set(index);\n return result.filter(Set.prototype.has, indexSet);\n }, lastIndex);\n const remainingPayload = Object.keys(payload).reduce((withoutIndexAttrs, filterAttr) => {\n if (!indexAttrs.includes(filterAttr)) {\n withoutIndexAttrs[filterAttr] = payload[filterAttr];\n }\n\n return withoutIndexAttrs;\n }, {});\n\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-indexed columns.\n * Filter indexed rows by remaining payload (if any were found).\n */\n return reducer(this.accessIds(branch, indexedIds), { ...clause,\n payload: remainingPayload\n });\n }\n /**\n * No need to filter these rows any further.\n * The used indexes satisfy this clause's conditions.\n */\n\n\n return this.accessIds(branch, indexedIds);\n }\n } // Give up optimization: Retrieve all rows (full table scan).\n\n\n return reducer(this.accessList(branch), clause);\n }\n\n switch (type) {\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"FILTER\"]:\n {\n return lodash_filter__WEBPACK_IMPORTED_MODULE_1___default()(rows, payload);\n }\n\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"EXCLUDE\"]:\n {\n return lodash_reject__WEBPACK_IMPORTED_MODULE_3___default()(rows, payload);\n }\n\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"ORDER_BY\"]:\n {\n const [iteratees, orders] = payload;\n return lodash_orderBy__WEBPACK_IMPORTED_MODULE_2___default()(rows, iteratees, normalizeOrders(orders));\n }\n\n default:\n return rows;\n }\n };\n\n return optimallyOrderedClauses.reduce(reducer, undefined);\n }\n /**\n * Returns the data structure including a new object `entry`\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object} entry - the object to insert\n * @return {Object} an object with two keys: `state` and `created`.\n * `state` is the new table state and `created` is the\n * row that was created.\n */\n ;\n\n _proto.insert = function insert(tx, branch, entry) {\n const {\n batchToken,\n withMutations\n } = tx;\n const hasId = entry.hasOwnProperty(this.idAttribute);\n let workingState = branch; // This will not affect string id's.\n\n const [newMaxId, id] = idSequencer(this.getMaxId(branch), entry[this.idAttribute]);\n workingState = this.setMaxId(tx, branch, newMaxId);\n const finalEntry = hasId ? entry : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken, this.idAttribute, id, entry);\n const indexesToAppendTo = Object.keys(workingState.indexes).filter(fkAttr => entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null).map(fkAttr => [fkAttr, entry[fkAttr]]);\n\n if (withMutations) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, workingState[this.arrName]);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set(id, finalEntry, workingState[this.mapName]); // add id to indexes\n\n indexesToAppendTo.forEach(([attr, value]) => {\n const attrIndex = workingState.indexes[attr];\n\n if (attrIndex.hasOwnProperty(value)) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, attrIndex[value]);\n } else {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set(value, [id], attrIndex);\n }\n });\n return {\n state: workingState,\n created: finalEntry\n };\n }\n\n const nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexesToAppendTo.reduce((indexMap, [attr, value]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, indexMap[attr][value] || [])\n }, indexMap[attr]);\n return indexMap;\n }, { ...workingState.indexes\n }), workingState.indexes);\n const nextState = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [this.arrName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, workingState[this.arrName]),\n [this.mapName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [id]: finalEntry\n }, workingState[this.mapName]),\n indexes: nextIndexes\n }, workingState);\n return {\n state: nextState,\n created: finalEntry\n };\n }\n /**\n * Returns the data structure with objects where `rows`\n * are merged with `mergeObj`.\n *\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @param {Object} mergeObj - The object to merge with each row.\n * @return {Object}\n */\n ;\n\n _proto.update = function update(tx, branch, rows, mergeObj) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n const mergeObjInto = row => {\n const merge = withMutations ? immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.merge : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken);\n return merge(mergeObj, row);\n };\n\n const set = withMutations ? immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken);\n const indexedAttrs = Object.keys(branch.indexes).filter(attr => mergeObj.hasOwnProperty(attr));\n const indexIdsToAdd = [];\n const indexIdsToDelete = [];\n const nextMap = rows.reduce((map, row) => {\n const prevAttrValues = indexedAttrs.reduce((valueMap, attr) => ({ ...valueMap,\n [attr]: row[attr]\n }), {});\n const result = mergeObjInto(row);\n const nextAttrValues = indexedAttrs.reduce((valueMap, attr) => ({ ...valueMap,\n [attr]: result[attr]\n }), {});\n const id = result[this.idAttribute];\n const nextRow = set(id, result, map);\n indexedAttrs.forEach(attr => {\n const {\n [attr]: prevValue\n } = prevAttrValues;\n const {\n [attr]: nextValue\n } = nextAttrValues;\n\n if (prevValue === nextValue) {\n // attribute has not changed, no need to update any index\n return;\n }\n\n if (prevValue !== null && typeof prevValue !== \"undefined\") {\n // remove id from attribute's index for its old value\n indexIdsToDelete.push([attr, prevValue, id]);\n }\n\n if (nextValue !== null) {\n // add id to attribute's index for its new value\n indexIdsToAdd.push([attr, nextValue, id]);\n }\n });\n return nextRow;\n }, branch[this.mapName]);\n let nextIndexes = branch.indexes;\n\n if (withMutations) {\n indexIdsToDelete.forEach(([attr, value, id]) => {\n const arr = nextIndexes[attr][value];\n const idx = arr.indexOf(id);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], arr);\n });\n indexIdsToAdd.forEach(([attr, value, id]) => {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, nextIndexes[attr][value]);\n });\n } else {\n if (indexIdsToAdd.length) {\n nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexIdsToAdd.reduce((indexMap, [attr, value, id]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, indexMap[attr][value] || [])\n }, indexMap[attr]);\n return indexMap;\n }, { ...nextIndexes\n }), nextIndexes);\n }\n\n if (indexIdsToDelete.length) {\n nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexIdsToDelete.reduce((indexMap, [attr, value, id]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, rowId => rowId !== id, indexMap[attr][value])\n }, indexMap[attr]);\n return indexMap;\n }, { ...nextIndexes\n }), nextIndexes);\n }\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [this.mapName]: nextMap,\n indexes: nextIndexes\n }, branch);\n }\n /**\n * Returns the data structure without rows `rows`.\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @return {Object} the data structure without ids in `idsToDelete`.\n */\n ;\n\n _proto.delete = function _delete(tx, branch, rows) {\n const {\n batchToken,\n withMutations\n } = tx;\n const {\n arrName,\n mapName\n } = this;\n const arr = branch[arrName];\n const idsToDelete = rows.map(row => row[this.idAttribute]);\n\n if (withMutations) {\n idsToDelete.forEach(id => {\n const idx = arr.indexOf(id);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], arr);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.omit(id, branch[mapName]);\n }); // delete ids from all indexes\n\n Object.values(branch.indexes).forEach(attrIndex => Object.values(attrIndex).forEach(valueIndex => idsToDelete.forEach(id => {\n const idx = valueIndex.indexOf(id);\n\n if (idx !== -1) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], valueIndex);\n }\n })));\n return branch;\n }\n\n const nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, Object.entries(branch.indexes).reduce((indexMap, [attr, attrIndex]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, Object.entries(attrIndex).reduce((attrIndexMap, [value, valueIndex]) => {\n attrIndexMap[value] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, id => !idsToDelete.includes(id), valueIndex);\n return attrIndexMap;\n }, { ...indexMap[attr]\n }), indexMap[attr]);\n return indexMap;\n }, { ...branch.indexes\n }), branch.indexes);\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [arrName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, id => !idsToDelete.includes(id), branch[arrName]),\n [mapName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.omit(batchToken, idsToDelete, branch[mapName]),\n indexes: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, nextIndexes, branch.indexes)\n }, branch);\n };\n\n return Table;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Table);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9UYWJsZS5qcz83NDk3Il0sIm5hbWVzIjpbIkRFRkFVTFRfVEFCTEVfT1BUSU9OUyIsImlkQXR0cmlidXRlIiwiYXJyTmFtZSIsIm1hcE5hbWUiLCJmaWVsZHMiLCJpZFNlcXVlbmNlciIsIl9jdXJyTWF4IiwidXNlclBhc3NlZElkIiwiY3Vyck1heCIsIm5ld01heCIsIm5ld0lkIiwidW5kZWZpbmVkIiwiTWF0aCIsIm1heCIsIm5vcm1hbGl6ZU9yZGVycyIsIm9yZGVycyIsImNvbnZlcnQiLCJvcmRlciIsImluY2x1ZGVzIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiVGFibGUiLCJ1c2VyT3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImFjY2Vzc0lkIiwiYnJhbmNoIiwiaWQiLCJhY2Nlc3NJZHMiLCJpZHMiLCJpZEV4aXN0cyIsImhhc093blByb3BlcnR5IiwiYWNjZXNzSWRMaXN0IiwiYWNjZXNzTGlzdCIsImdldE1heElkIiwiZ2V0TWV0YSIsInNldE1heElkIiwidHgiLCJuZXdNYXhJZCIsInNldE1ldGEiLCJuZXh0SWQiLCJnZXRFbXB0eVN0YXRlIiwicGtJbmRleCIsImF0dHJJbmRleGVzIiwia2V5cyIsImZpbHRlciIsImF0dHIiLCJpbmRleCIsInJlZHVjZSIsImluZGV4ZXMiLCJtZXRhIiwia2V5IiwidmFsdWUiLCJiYXRjaFRva2VuIiwid2l0aE11dGF0aW9ucyIsInJlcyIsIm9wcyIsIm11dGFibGUiLCJzZXRJbiIsImJhdGNoIiwicXVlcnkiLCJjbGF1c2VzIiwibGVuZ3RoIiwib3B0aW1hbGx5T3JkZXJlZENsYXVzZXMiLCJzb3J0QnkiLCJjbGF1c2UiLCJjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUiLCJjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZSIsInJlZHVjZXIiLCJyb3dzIiwidHlwZSIsInBheWxvYWQiLCJyZW1haW5pbmdQYXlsb2FkIiwid2l0aG91dFBrQXR0ciIsImZpbHRlckF0dHIiLCJGSUxURVIiLCJlbnRyaWVzIiwiYWNjZXNzZWRJbmRleGVzIiwiaW5kZXhBdHRycyIsImZvckVhY2giLCJwdXNoIiwibGFzdEluZGV4IiwicG9wIiwiaW5kZXhlZElkcyIsInJlc3VsdCIsImluZGV4U2V0IiwiU2V0IiwicHJvdG90eXBlIiwiaGFzIiwid2l0aG91dEluZGV4QXR0cnMiLCJFWENMVURFIiwicmVqZWN0IiwiT1JERVJfQlkiLCJpdGVyYXRlZXMiLCJvcmRlckJ5IiwiaW5zZXJ0IiwiZW50cnkiLCJoYXNJZCIsIndvcmtpbmdTdGF0ZSIsImZpbmFsRW50cnkiLCJzZXQiLCJpbmRleGVzVG9BcHBlbmRUbyIsImZrQXR0ciIsImF0dHJJbmRleCIsInN0YXRlIiwiY3JlYXRlZCIsIm5leHRJbmRleGVzIiwibWVyZ2UiLCJpbmRleE1hcCIsIm5leHRTdGF0ZSIsInVwZGF0ZSIsIm1lcmdlT2JqIiwibWVyZ2VPYmpJbnRvIiwicm93IiwiaW5kZXhlZEF0dHJzIiwiaW5kZXhJZHNUb0FkZCIsImluZGV4SWRzVG9EZWxldGUiLCJuZXh0TWFwIiwicHJldkF0dHJWYWx1ZXMiLCJ2YWx1ZU1hcCIsIm5leHRBdHRyVmFsdWVzIiwibmV4dFJvdyIsInByZXZWYWx1ZSIsIm5leHRWYWx1ZSIsImFyciIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyb3dJZCIsImRlbGV0ZSIsImlkc1RvRGVsZXRlIiwib21pdCIsInZhbHVlcyIsInZhbHVlSW5kZXgiLCJhdHRySW5kZXhNYXAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRztBQUMxQkMsYUFBVyxFQUFFLElBRGE7QUFFMUJDLFNBQU8sRUFBRSxPQUZpQjtBQUcxQkMsU0FBTyxFQUFFLFdBSGlCO0FBSTFCQyxRQUFNLEVBQUU7QUFKa0IsQ0FB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LENBQUN4QixPQUFELENBSEMsQ0FOZjtBQVdJK0MsYUFBTyxFQUFFTyxxREFBRyxDQUFDRyxLQUFKLENBQVVnRCxLQUFWLENBQ0x0RCxVQURLLEVBRUxxRCxXQUZLLEVBR0xoRixNQUFNLENBQUN1QixPQUhGO0FBWGIsS0FGRyxFQW1CSHZCLE1BbkJHLENBQVA7QUFxQkgsR0F6aUJMOztBQUFBO0FBQUE7QUE0aUJlTCxvRUFBZiIsImZpbGUiOiIuL3NyYy9kYi9UYWJsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvcHMgZnJvbSBcImltbXV0YWJsZS1vcHNcIjtcbmltcG9ydCBmaWx0ZXIgZnJvbSBcImxvZGFzaC9maWx0ZXJcIjtcbmltcG9ydCBvcmRlckJ5IGZyb20gXCJsb2Rhc2gvb3JkZXJCeVwiO1xuaW1wb3J0IHJlamVjdCBmcm9tIFwibG9kYXNoL3JlamVjdFwiO1xuaW1wb3J0IHNvcnRCeSBmcm9tIFwibG9kYXNoL3NvcnRCeVwiO1xuXG5pbXBvcnQgeyBFWENMVURFLCBGSUxURVIsIE9SREVSX0JZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlLCBjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5jb25zdCBERUZBVUxUX1RBQkxFX09QVElPTlMgPSB7XG4gICAgaWRBdHRyaWJ1dGU6IFwiaWRcIixcbiAgICBhcnJOYW1lOiBcIml0ZW1zXCIsXG4gICAgbWFwTmFtZTogXCJpdGVtc0J5SWRcIixcbiAgICBmaWVsZHM6IHt9LFxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBfY3Vyck1heCAtIHRoZSBjdXJyZW50IG1heCBpZFxuICogQHBhcmFtIHsqfSB1c2VyUGFzc2VkSWQgLSB0aGUgbmV3IGlkIHBhc3NlZCB0byB0aGUgY3JlYXRlIGFjdGlvblxuICpcbiAqIEJvdGggbWF5IGJlIHVuZGVmaW5lZC4gVGhlIGN1cnJlbnQgbWF4IGlkIGluIHRoZSBjYXNlIHRoYXQgdGhpcyBpcyB0aGUgZmlyc3QgTW9kZWxcbiAqIGJlaW5nIGNyZWF0ZWQsIGFuZCB0aGUgbmV3IGlkIGlmIHRoZSBpZCB3YXMgbm90IGV4cGxpY2l0bHkgcGFzc2VkIHRvIHRoZVxuICogZGF0YWJhc2UuXG4gKlxuICogQHJldHVybiB7QXJyYXl9IHRoZSBuZXcgbWF4IGlkIGFuZCB0aGUgaWQgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgbmV3IHJvd1xuICpcbiAqIElmIHRoZSBpZCdzIGFyZSBzdHJpbmdzLCB0aGUgaWQgbXVzdCBiZSBwYXNzZWQgZXhwbGljaXRseSBldmVyeSB0aW1lLlxuICogSW4gdGhpcyBjYXNlLCB0aGUgY3VycmVudCBtYXggaWQgd2lsbCByZW1haW4gYE5hTmAgZHVlIHRvIGBNYXRoLm1heGAsIGJ1dCB0aGF0J3MgZmluZS5cbiAqL1xuZnVuY3Rpb24gaWRTZXF1ZW5jZXIoX2N1cnJNYXgsIHVzZXJQYXNzZWRJZCkge1xuICAgIGxldCBjdXJyTWF4ID0gX2N1cnJNYXg7XG4gICAgbGV0IG5ld01heDtcbiAgICBsZXQgbmV3SWQ7XG5cbiAgICBpZiAoY3Vyck1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGN1cnJNYXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAodXNlclBhc3NlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3TWF4ID0gY3Vyck1heCArIDE7XG4gICAgICAgIG5ld0lkID0gbmV3TWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld01heCA9IE1hdGgubWF4KGN1cnJNYXggKyAxLCB1c2VyUGFzc2VkSWQpO1xuICAgICAgICBuZXdJZCA9IHVzZXJQYXNzZWRJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBuZXdNYXgsIC8vIG5ldyBtYXggaWRcbiAgICAgICAgbmV3SWQsIC8vIGlkIHRvIHVzZSBmb3Igcm93IGNyZWF0aW9uXG4gICAgXTtcbn1cblxuLyoqXG4gKiBBZGFwdCBvcmRlciBkaXJlY3Rpb25zIGFycmF5IHRvIEB7bG9kYXNoLm9yZGVyQnl9IEFQSS5cbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8Qm9vbGVhbnwnYXNjJ3wnZGVzYyc+fSBvcmRlcnM/IC0gYW4gYXJyYXkgb2Ygb3B0aW9uYWwgb3JkZXIgcXVlcnkgZGlyZWN0aW9ucyBhcyBwcm92aWRlZCB0byB7QExpbmsge1F1ZXJ5U2V0Lm9yZGVyQnl9fVxuICogQHJldHVybiB7QXJyYXk8J2FzYyd8J2Rlc2MnPnx1bmRlZmluZWR9IEEgbm9ybWFsaXplZCBvcmRlcmluZyBhcnJheSBvciB1bmRlZmluZWQgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yZGVycyhvcmRlcnMpIHtcbiAgICBpZiAob3JkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udmVydCA9IG9yZGVyID0+IHtcbiAgICAgICAgaWYgKFtcImRlc2NcIiwgZmFsc2VdLmluY2x1ZGVzKG9yZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiZGVzY1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcImFzY1wiO1xuICAgIH07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3JkZXJzKSA/IG9yZGVycy5tYXAoY29udmVydCkgOiBjb252ZXJ0KG9yZGVycyk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSBmb3IgYSB7QGxpbmsgTW9kZWx9IGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUYWJsZX0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB1c2VyT3B0cyAtIG9wdGlvbnMgdG8gdXNlLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3VzZXJPcHRzLmlkQXR0cmlidXRlPWlkXSAtIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFt1c2VyT3B0cy5hcnJOYW1lPWl0ZW1zXSAtIHRoZSBzdGF0ZSBhdHRyaWJ1dGUgd2hlcmUgYW4gYXJyYXkgb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBpZCdzIGFyZSBzdG9yZWRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFt1c2VyT3B0cy5tYXBOYW1lPWl0ZW1zQnlJZF0gLSB0aGUgc3RhdGUgYXR0cmlidXRlIHdoZXJlIHRoZSBlbnRpdHkgb2JqZWN0c1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQgaW4gYSBpZCB0byBlbnRpdHkgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3VzZXJPcHRzLmZpZWxkcz17fV0gLSBtYXBwaW5nIG9mIGZpZWxkIGtleSB0byB7QGxpbmsgRmllbGR9IG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVzZXJPcHRzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgREVGQVVMVF9UQUJMRV9PUFRJT05TLCB1c2VyT3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGF0IGluZGV4IGBpZGBcbiAgICAgKiBpbiBzdGF0ZSBgYnJhbmNoYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gYnJhbmNoIC0gdGhlIHN0YXRlXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAtIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGdldFxuICAgICAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoZSByYXcgb2JqZWN0IGluIHRoZSBzdGF0ZSBvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBhY2Nlc3NJZChicmFuY2gsIGlkKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hbdGhpcy5tYXBOYW1lXVtpZF07XG4gICAgfVxuXG4gICAgYWNjZXNzSWRzKGJyYW5jaCwgaWRzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGJyYW5jaFt0aGlzLm1hcE5hbWVdO1xuICAgICAgICByZXR1cm4gaWRzLm1hcChpZCA9PiBtYXBbaWRdKTtcbiAgICB9XG5cbiAgICBpZEV4aXN0cyhicmFuY2gsIGlkKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hbdGhpcy5tYXBOYW1lXS5oYXNPd25Qcm9wZXJ0eShpZCk7XG4gICAgfVxuXG4gICAgYWNjZXNzSWRMaXN0KGJyYW5jaCkge1xuICAgICAgICByZXR1cm4gYnJhbmNoW3RoaXMuYXJyTmFtZV07XG4gICAgfVxuXG4gICAgYWNjZXNzTGlzdChicmFuY2gpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzSWRzKGJyYW5jaCwgdGhpcy5hY2Nlc3NJZExpc3QoYnJhbmNoKSk7XG4gICAgfVxuXG4gICAgZ2V0TWF4SWQoYnJhbmNoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGEoYnJhbmNoLCBcIm1heElkXCIpO1xuICAgIH1cblxuICAgIHNldE1heElkKHR4LCBicmFuY2gsIG5ld01heElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldE1ldGEodHgsIGJyYW5jaCwgXCJtYXhJZFwiLCBuZXdNYXhJZCk7XG4gICAgfVxuXG4gICAgbmV4dElkKGlkKSB7XG4gICAgICAgIHJldHVybiBpZCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBzdGF0ZSBmb3IgdGhlIGRhdGEgc3RydWN0dXJlLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGRlZmF1bHQgc3RhdGUgZm9yIHRoaXMge0BsaW5rIE9STX0gaW5zdGFuY2UncyBkYXRhIHN0cnVjdHVyZVxuICAgICAqL1xuICAgIGdldEVtcHR5U3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IHBrSW5kZXggPSB7XG4gICAgICAgICAgICBbdGhpcy5hcnJOYW1lXTogW10sXG4gICAgICAgICAgICBbdGhpcy5tYXBOYW1lXToge30sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGF0dHJJbmRleGVzID0gT2JqZWN0LmtleXModGhpcy5maWVsZHMpXG4gICAgICAgICAgICAuZmlsdGVyKGF0dHIgPT4gYXR0ciAhPT0gdGhpcy5pZEF0dHJpYnV0ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoYXR0ciA9PiB0aGlzLmZpZWxkc1thdHRyXS5pbmRleClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4ZXMsIGF0dHIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmluZGV4ZXMsXG4gICAgICAgICAgICAgICAgICAgIFthdHRyXToge30sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wa0luZGV4LFxuICAgICAgICAgICAgaW5kZXhlczogYXR0ckluZGV4ZXMsXG4gICAgICAgICAgICBtZXRhOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRNZXRhKHR4LCBicmFuY2gsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH0gPSB0eDtcbiAgICAgICAgaWYgKHdpdGhNdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG9wcy5tdXRhYmxlLnNldEluKFtcIm1ldGFcIiwga2V5XSwgdmFsdWUsIGJyYW5jaCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wcy5iYXRjaC5zZXRJbihiYXRjaFRva2VuLCBbXCJtZXRhXCIsIGtleV0sIHZhbHVlLCBicmFuY2gpO1xuICAgIH1cblxuICAgIGdldE1ldGEoYnJhbmNoLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5jaC5tZXRhW2tleV07XG4gICAgfVxuXG4gICAgcXVlcnkoYnJhbmNoLCBjbGF1c2VzKSB7XG4gICAgICAgIGlmIChjbGF1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzTGlzdChicmFuY2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpZEF0dHJpYnV0ZSB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBvcHRpbWFsbHlPcmRlcmVkQ2xhdXNlcyA9IHNvcnRCeShjbGF1c2VzLCBjbGF1c2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZShjbGF1c2UsIGlkQXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2xhdXNlUmVkdWNlc1Jlc3VsdFNldFNpemUoY2xhdXNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVkdWNlciA9IChyb3dzLCBjbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgcGF5bG9hZCB9ID0gY2xhdXNlO1xuICAgICAgICAgICAgaWYgKCFyb3dzKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRmlyc3QgdGltZSB0aGlzIHJlZHVjZXIgaXMgY2FsbGVkIGR1cmluZyBxdWVyeS5cbiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHdoZXJlIHdlIGFwcGx5IHF1ZXJ5IG9wdGltaXphdGlvbnMuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZShjbGF1c2UsIGlkQXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogUGF5bG9hZCBzcGVjaWZpZWQgYSBwcmltYXJ5IGtleS4gVXNlIFBLIGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAqIHRvIGxvb2sgdXAgdGhlIHNpbmdsZSByb3cgaWRlbnRpZmllZCBieSB0aGUgUEsuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHBheWxvYWRbaWRBdHRyaWJ1dGVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdQYXlsb2FkID0gT2JqZWN0LmtleXMocGF5bG9hZCkucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXRQa0F0dHIsIGZpbHRlckF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyQXR0ciAhPT0gaWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dFBrQXR0cltmaWx0ZXJBdHRyXSA9IHBheWxvYWRbZmlsdGVyQXR0cl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0UGtBdHRyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuaWRFeGlzdHMoYnJhbmNoLCBpZCkgPyBbaWRdIDogW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZW1haW5pbmdQYXlsb2FkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogUGF5bG9hZCBoYXMgYWRkaXRpb25hbCwgbm9uLVBLIGNvbHVtbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgYWNjZXNzZWQgcm93IGJ5IHJlbWFpbmluZyBwYXlsb2FkIChpZiBvbmUgd2FzIGZvdW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIodGhpcy5hY2Nlc3NJZHMoYnJhbmNoLCBpZHMpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2xhdXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHJlbWFpbmluZ1BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogTm8gbmVlZCB0byBmaWx0ZXIgdGhlc2Ugcm93cyBhbnkgZnVydGhlci5cbiAgICAgICAgICAgICAgICAgICAgICogVGhlIHByaW1hcnkga2V5IHZhbHVlIHNhdGlzZmllcyB0aGlzIGNsYXVzZSdzIGNvbmRpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NJZHMoYnJhbmNoLCBpZHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gRklMVEVSICYmIHR5cGVvZiBwYXlsb2FkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ZXMgPSBPYmplY3QuZW50cmllcyhicmFuY2guaW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc2VkSW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleEF0dHJzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoW2F0dHIsIGluZGV4XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZShjbGF1c2UsIGF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGF5bG9hZCBzcGVjaWZpZWQgYW4gaW5kZXhlZCBhdHRyaWJ1dGUuIFVzZSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHBvdGVudGlhbGx5IGRlY3JlYXNlIGFtb3VudCBvZiBhY2Nlc3NlZCByb3dzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleC5oYXNPd25Qcm9wZXJ0eShwYXlsb2FkW2F0dHJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZEluZGV4ZXMucHVzaChpbmRleFtwYXlsb2FkW2F0dHJdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4QXR0cnMucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHNldCBvZiB1bmlxdWUgUEsgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgICAgICAgICAgICAgICAgICAgKiBmb3JlaWduIGtleSdzIGF0dHJpYnV0ZSB2YWx1ZS4gVGhlbiByZXRyaWV2ZSBhbGwgdGhvc2Ugcm93cy5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NlZEluZGV4ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBhY2Nlc3NlZEluZGV4ZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleGVkSWRzID0gYWNjZXNzZWRJbmRleGVzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleFNldCA9IG5ldyBTZXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1BheWxvYWQgPSBPYmplY3Qua2V5cyhwYXlsb2FkKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXRJbmRleEF0dHJzLCBmaWx0ZXJBdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXhBdHRycy5pbmNsdWRlcyhmaWx0ZXJBdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dEluZGV4QXR0cnNbZmlsdGVyQXR0cl0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRbZmlsdGVyQXR0cl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRJbmRleEF0dHJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVtYWluaW5nUGF5bG9hZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGF5bG9hZCBoYXMgYWRkaXRpb25hbCwgbm9uLWluZGV4ZWQgY29sdW1ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgaW5kZXhlZCByb3dzIGJ5IHJlbWFpbmluZyBwYXlsb2FkIChpZiBhbnkgd2VyZSBmb3VuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIodGhpcy5hY2Nlc3NJZHMoYnJhbmNoLCBpbmRleGVkSWRzKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jbGF1c2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHJlbWFpbmluZ1BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIE5vIG5lZWQgdG8gZmlsdGVyIHRoZXNlIHJvd3MgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdXNlZCBpbmRleGVzIHNhdGlzZnkgdGhpcyBjbGF1c2UncyBjb25kaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NJZHMoYnJhbmNoLCBpbmRleGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgb3B0aW1pemF0aW9uOiBSZXRyaWV2ZSBhbGwgcm93cyAoZnVsbCB0YWJsZSBzY2FuKS5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVkdWNlcih0aGlzLmFjY2Vzc0xpc3QoYnJhbmNoKSwgY2xhdXNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGSUxURVI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihyb3dzLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBFWENMVURFOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3Qocm93cywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgT1JERVJfQlk6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2l0ZXJhdGVlcywgb3JkZXJzXSA9IHBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmRlckJ5KHJvd3MsIGl0ZXJhdGVlcywgbm9ybWFsaXplT3JkZXJzKG9yZGVycykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gb3B0aW1hbGx5T3JkZXJlZENsYXVzZXMucmVkdWNlKHJlZHVjZXIsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW5jbHVkaW5nIGEgbmV3IG9iamVjdCBgZW50cnlgXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB0eCAtIHRyYW5zYWN0aW9uIGluZm9cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGJyYW5jaCAtIHRoZSBkYXRhIHN0cnVjdHVyZSBzdGF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gZW50cnkgLSB0aGUgb2JqZWN0IHRvIGluc2VydFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gYW4gb2JqZWN0IHdpdGggdHdvIGtleXM6IGBzdGF0ZWAgYW5kIGBjcmVhdGVkYC5cbiAgICAgKiAgICAgICAgICAgICAgICAgIGBzdGF0ZWAgaXMgdGhlIG5ldyB0YWJsZSBzdGF0ZSBhbmQgYGNyZWF0ZWRgIGlzIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgcm93IHRoYXQgd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgaW5zZXJ0KHR4LCBicmFuY2gsIGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9ID0gdHg7XG5cbiAgICAgICAgY29uc3QgaGFzSWQgPSBlbnRyeS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmlkQXR0cmlidXRlKTtcblxuICAgICAgICBsZXQgd29ya2luZ1N0YXRlID0gYnJhbmNoO1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBub3QgYWZmZWN0IHN0cmluZyBpZCdzLlxuICAgICAgICBjb25zdCBbbmV3TWF4SWQsIGlkXSA9IGlkU2VxdWVuY2VyKFxuICAgICAgICAgICAgdGhpcy5nZXRNYXhJZChicmFuY2gpLFxuICAgICAgICAgICAgZW50cnlbdGhpcy5pZEF0dHJpYnV0ZV1cbiAgICAgICAgKTtcbiAgICAgICAgd29ya2luZ1N0YXRlID0gdGhpcy5zZXRNYXhJZCh0eCwgYnJhbmNoLCBuZXdNYXhJZCk7XG5cbiAgICAgICAgY29uc3QgZmluYWxFbnRyeSA9IGhhc0lkXG4gICAgICAgICAgICA/IGVudHJ5XG4gICAgICAgICAgICA6IG9wcy5iYXRjaC5zZXQoYmF0Y2hUb2tlbiwgdGhpcy5pZEF0dHJpYnV0ZSwgaWQsIGVudHJ5KTtcblxuICAgICAgICBjb25zdCBpbmRleGVzVG9BcHBlbmRUbyA9IE9iamVjdC5rZXlzKHdvcmtpbmdTdGF0ZS5pbmRleGVzKVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICBma0F0dHIgPT4gZW50cnkuaGFzT3duUHJvcGVydHkoZmtBdHRyKSAmJiBlbnRyeVtma0F0dHJdICE9PSBudWxsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKGZrQXR0ciA9PiBbZmtBdHRyLCBlbnRyeVtma0F0dHJdXSk7XG5cbiAgICAgICAgaWYgKHdpdGhNdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIG9wcy5tdXRhYmxlLnB1c2goaWQsIHdvcmtpbmdTdGF0ZVt0aGlzLmFyck5hbWVdKTtcbiAgICAgICAgICAgIG9wcy5tdXRhYmxlLnNldChpZCwgZmluYWxFbnRyeSwgd29ya2luZ1N0YXRlW3RoaXMubWFwTmFtZV0pO1xuICAgICAgICAgICAgLy8gYWRkIGlkIHRvIGluZGV4ZXNcbiAgICAgICAgICAgIGluZGV4ZXNUb0FwcGVuZFRvLmZvckVhY2goKFthdHRyLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5kZXggPSB3b3JraW5nU3RhdGUuaW5kZXhlc1thdHRyXTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ckluZGV4Lmhhc093blByb3BlcnR5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5wdXNoKGlkLCBhdHRySW5kZXhbdmFsdWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zZXQodmFsdWUsIFtpZF0sIGF0dHJJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXRlOiB3b3JraW5nU3RhdGUsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogZmluYWxFbnRyeSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0SW5kZXhlcyA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICBpbmRleGVzVG9BcHBlbmRUby5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4TWFwLCBbYXR0ciwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdOiBvcHMuYmF0Y2gucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdW3ZhbHVlXSB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXBbYXR0cl1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4TWFwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyAuLi53b3JraW5nU3RhdGUuaW5kZXhlcyB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya2luZ1N0YXRlLmluZGV4ZXNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSBvcHMuYmF0Y2gubWVyZ2UoXG4gICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFt0aGlzLmFyck5hbWVdOiBvcHMuYmF0Y2gucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdTdGF0ZVt0aGlzLmFyck5hbWVdXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBbdGhpcy5tYXBOYW1lXTogb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdOiBmaW5hbEVudHJ5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JraW5nU3RhdGVbdGhpcy5tYXBOYW1lXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaW5kZXhlczogbmV4dEluZGV4ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd29ya2luZ1N0YXRlXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXRlOiBuZXh0U3RhdGUsXG4gICAgICAgICAgICBjcmVhdGVkOiBmaW5hbEVudHJ5LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGggb2JqZWN0cyB3aGVyZSBgcm93c2BcbiAgICAgKiBhcmUgbWVyZ2VkIHdpdGggYG1lcmdlT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdHggLSB0cmFuc2FjdGlvbiBpbmZvXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBicmFuY2ggLSB0aGUgZGF0YSBzdHJ1Y3R1cmUgc3RhdGVcbiAgICAgKiBAcGFyYW0gIHtPYmplY3RbXX0gcm93cyAtIHJvd3MgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBtZXJnZU9iaiAtIFRoZSBvYmplY3QgdG8gbWVyZ2Ugd2l0aCBlYWNoIHJvdy5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgdXBkYXRlKHR4LCBicmFuY2gsIHJvd3MsIG1lcmdlT2JqKSB7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9ID0gdHg7XG5cbiAgICAgICAgY29uc3QgbWVyZ2VPYmpJbnRvID0gcm93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlID0gd2l0aE11dGF0aW9uc1xuICAgICAgICAgICAgICAgID8gb3BzLm11dGFibGUubWVyZ2VcbiAgICAgICAgICAgICAgICA6IG9wcy5iYXRjaC5tZXJnZShiYXRjaFRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZShtZXJnZU9iaiwgcm93KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzZXQgPSB3aXRoTXV0YXRpb25zID8gb3BzLm11dGFibGUuc2V0IDogb3BzLmJhdGNoLnNldChiYXRjaFRva2VuKTtcblxuICAgICAgICBjb25zdCBpbmRleGVkQXR0cnMgPSBPYmplY3Qua2V5cyhicmFuY2guaW5kZXhlcykuZmlsdGVyKGF0dHIgPT5cbiAgICAgICAgICAgIG1lcmdlT2JqLmhhc093blByb3BlcnR5KGF0dHIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluZGV4SWRzVG9BZGQgPSBbXTtcbiAgICAgICAgY29uc3QgaW5kZXhJZHNUb0RlbGV0ZSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IG5leHRNYXAgPSByb3dzLnJlZHVjZSgobWFwLCByb3cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZBdHRyVmFsdWVzID0gaW5kZXhlZEF0dHJzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAodmFsdWVNYXAsIGF0dHIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlTWFwLFxuICAgICAgICAgICAgICAgICAgICBbYXR0cl06IHJvd1thdHRyXSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlT2JqSW50byhyb3cpO1xuICAgICAgICAgICAgY29uc3QgbmV4dEF0dHJWYWx1ZXMgPSBpbmRleGVkQXR0cnMucmVkdWNlKFxuICAgICAgICAgICAgICAgICh2YWx1ZU1hcCwgYXR0cikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsdWVNYXAsXG4gICAgICAgICAgICAgICAgICAgIFthdHRyXTogcmVzdWx0W2F0dHJdLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaWQgPSByZXN1bHRbdGhpcy5pZEF0dHJpYnV0ZV07XG4gICAgICAgICAgICBjb25zdCBuZXh0Um93ID0gc2V0KGlkLCByZXN1bHQsIG1hcCk7XG4gICAgICAgICAgICBpbmRleGVkQXR0cnMuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IFthdHRyXTogcHJldlZhbHVlIH0gPSBwcmV2QXR0clZhbHVlcztcbiAgICAgICAgICAgICAgICBjb25zdCB7IFthdHRyXTogbmV4dFZhbHVlIH0gPSBuZXh0QXR0clZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAocHJldlZhbHVlID09PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIGhhcyBub3QgY2hhbmdlZCwgbm8gbmVlZCB0byB1cGRhdGUgYW55IGluZGV4XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZWYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgcHJldlZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpZCBmcm9tIGF0dHJpYnV0ZSdzIGluZGV4IGZvciBpdHMgb2xkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGluZGV4SWRzVG9EZWxldGUucHVzaChbYXR0ciwgcHJldlZhbHVlLCBpZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpZCB0byBhdHRyaWJ1dGUncyBpbmRleCBmb3IgaXRzIG5ldyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvQWRkLnB1c2goW2F0dHIsIG5leHRWYWx1ZSwgaWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0Um93O1xuICAgICAgICB9LCBicmFuY2hbdGhpcy5tYXBOYW1lXSk7XG5cbiAgICAgICAgbGV0IG5leHRJbmRleGVzID0gYnJhbmNoLmluZGV4ZXM7XG4gICAgICAgIGlmICh3aXRoTXV0YXRpb25zKSB7XG4gICAgICAgICAgICBpbmRleElkc1RvRGVsZXRlLmZvckVhY2goKFthdHRyLCB2YWx1ZSwgaWRdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gbmV4dEluZGV4ZXNbYXR0cl1bdmFsdWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGFyci5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zcGxpY2UoaWR4LCAxLCBbXSwgYXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhJZHNUb0FkZC5mb3JFYWNoKChbYXR0ciwgdmFsdWUsIGlkXSkgPT4ge1xuICAgICAgICAgICAgICAgIG9wcy5tdXRhYmxlLnB1c2goaWQsIG5leHRJbmRleGVzW2F0dHJdW3ZhbHVlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmRleElkc1RvQWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvQWRkLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleE1hcCwgW2F0dHIsIHZhbHVlLCBpZF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXTogb3BzLmJhdGNoLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXVt2YWx1ZV0gfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyAuLi5uZXh0SW5kZXhlcyB9XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleElkc1RvRGVsZXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvRGVsZXRlLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleE1hcCwgW2F0dHIsIHZhbHVlLCBpZF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXTogb3BzLmJhdGNoLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lkID0+IHJvd0lkICE9PSBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXVt2YWx1ZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyAuLi5uZXh0SW5kZXhlcyB9XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHMuYmF0Y2gubWVyZ2UoXG4gICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFt0aGlzLm1hcE5hbWVdOiBuZXh0TWFwLFxuICAgICAgICAgICAgICAgIGluZGV4ZXM6IG5leHRJbmRleGVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJyYW5jaFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgcm93cyBgcm93c2AuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB0eCAtIHRyYW5zYWN0aW9uIGluZm9cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGJyYW5jaCAtIHRoZSBkYXRhIHN0cnVjdHVyZSBzdGF0ZVxuICAgICAqIEBwYXJhbSAge09iamVjdFtdfSByb3dzIC0gcm93cyB0byB1cGRhdGVcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IGlkcyBpbiBgaWRzVG9EZWxldGVgLlxuICAgICAqL1xuICAgIGRlbGV0ZSh0eCwgYnJhbmNoLCByb3dzKSB7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9ID0gdHg7XG5cbiAgICAgICAgY29uc3QgeyBhcnJOYW1lLCBtYXBOYW1lIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBhcnIgPSBicmFuY2hbYXJyTmFtZV07XG5cbiAgICAgICAgY29uc3QgaWRzVG9EZWxldGUgPSByb3dzLm1hcChyb3cgPT4gcm93W3RoaXMuaWRBdHRyaWJ1dGVdKTtcbiAgICAgICAgaWYgKHdpdGhNdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIGlkc1RvRGVsZXRlLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGFyci5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zcGxpY2UoaWR4LCAxLCBbXSwgYXJyKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5vbWl0KGlkLCBicmFuY2hbbWFwTmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBkZWxldGUgaWRzIGZyb20gYWxsIGluZGV4ZXNcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoYnJhbmNoLmluZGV4ZXMpLmZvckVhY2goYXR0ckluZGV4ID0+XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhdHRySW5kZXgpLmZvckVhY2godmFsdWVJbmRleCA9PlxuICAgICAgICAgICAgICAgICAgICBpZHNUb0RlbGV0ZS5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHZhbHVlSW5kZXguaW5kZXhPZihpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcy5tdXRhYmxlLnNwbGljZShpZHgsIDEsIFtdLCB2YWx1ZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGJyYW5jaC5pbmRleGVzKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4TWFwLCBbYXR0ciwgYXR0ckluZGV4XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhhdHRySW5kZXgpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ckluZGV4TWFwLCBbdmFsdWUsIHZhbHVlSW5kZXhdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJJbmRleE1hcFt2YWx1ZV0gPSBvcHMuYmF0Y2guZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0+ICFpZHNUb0RlbGV0ZS5pbmNsdWRlcyhpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRySW5kZXhNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC4uLmluZGV4TWFwW2F0dHJdIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhNYXA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IC4uLmJyYW5jaC5pbmRleGVzIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBicmFuY2guaW5kZXhlc1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBvcHMuYmF0Y2gubWVyZ2UoXG4gICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFthcnJOYW1lXTogb3BzLmJhdGNoLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgaWQgPT4gIWlkc1RvRGVsZXRlLmluY2x1ZGVzKGlkKSxcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoW2Fyck5hbWVdXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBbbWFwTmFtZV06IG9wcy5iYXRjaC5vbWl0KFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBpZHNUb0RlbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoW21hcE5hbWVdXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBpbmRleGVzOiBvcHMuYmF0Y2gubWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleGVzLFxuICAgICAgICAgICAgICAgICAgICBicmFuY2guaW5kZXhlc1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnJhbmNoXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUYWJsZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/db/Table.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Table\", function() { return Table; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony import */ var lodash_filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/filter */ \"./node_modules/lodash/filter.js\");\n/* harmony import */ var lodash_filter__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_filter__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/orderBy */ \"./node_modules/lodash/orderBy.js\");\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_orderBy__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var lodash_reject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/reject */ \"./node_modules/lodash/reject.js\");\n/* harmony import */ var lodash_reject__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_reject__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/sortBy */ \"./node_modules/lodash/sortBy.js\");\n/* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_sortBy__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n\n\n\n\nconst DEFAULT_TABLE_OPTIONS = {\n idAttribute: \"id\",\n arrName: \"items\",\n mapName: \"itemsById\",\n fields: {}\n};\n/**\n * @private\n * @param {*} _currMax - the current max id\n * @param {*} userPassedId - the new id passed to the create action\n *\n * Both may be undefined. The current max id in the case that this is the first Model\n * being created, and the new id if the id was not explicitly passed to the\n * database.\n *\n * @return {Array} the new max id and the id to use to create the new row\n *\n * If the id's are strings, the id must be passed explicitly every time.\n * In this case, the current max id will remain `NaN` due to `Math.max`, but that's fine.\n */\n\nfunction idSequencer(_currMax, userPassedId) {\n let currMax = _currMax;\n let newMax;\n let newId;\n\n if (currMax === undefined) {\n currMax = -1;\n }\n\n if (userPassedId === undefined) {\n newMax = currMax + 1;\n newId = newMax;\n } else {\n newMax = Math.max(currMax + 1, userPassedId);\n newId = userPassedId;\n }\n\n return [newMax, // new max id\n newId // id to use for row creation\n ];\n}\n/**\n * Adapt order directions array to @{lodash.orderBy} API.\n *\n * @private\n *\n * @param {Array<Boolean|'asc'|'desc'>} orders? - an array of optional order query directions as provided to {@Link {QuerySet.orderBy}}\n * @return {Array<'asc'|'desc'>|undefined} A normalized ordering array or undefined if none was provided.\n */\n\n\nfunction normalizeOrders(orders) {\n if (orders === undefined) {\n return undefined;\n }\n\n const convert = order => {\n if ([\"desc\", false].includes(order)) {\n return \"desc\";\n }\n\n return \"asc\";\n };\n\n return Array.isArray(orders) ? orders.map(convert) : convert(orders);\n}\n/**\n * Handles the underlying data structure for a {@link Model} class.\n * @private\n */\n\n\nlet Table = /*#__PURE__*/function () {\n /**\n * Creates a new {@link Table} instance.\n * @param {Object} userOpts - options to use.\n * @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.\n * @param {string} [userOpts.arrName=items] - the state attribute where an array of\n * entity id's are stored\n * @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects\n * are stored in a id to entity object\n * map.\n * @param {string} [userOpts.fields={}] - mapping of field key to {@link Field} object\n */\n function Table(userOpts) {\n Object.assign(this, DEFAULT_TABLE_OPTIONS, userOpts);\n }\n /**\n * Returns a reference to the object at index `id`\n * in state `branch`.\n *\n * @param {Object} branch - the state\n * @param {Number} id - the id of the object to get\n * @return {Object|undefined} A reference to the raw object in the state or\n * `undefined` if not found.\n */\n\n\n var _proto = Table.prototype;\n\n _proto.accessId = function accessId(branch, id) {\n return branch[this.mapName][id];\n };\n\n _proto.accessIds = function accessIds(branch, ids) {\n const map = branch[this.mapName];\n return ids.map(id => map[id]);\n };\n\n _proto.idExists = function idExists(branch, id) {\n return branch[this.mapName].hasOwnProperty(id);\n };\n\n _proto.accessIdList = function accessIdList(branch) {\n return branch[this.arrName];\n };\n\n _proto.accessList = function accessList(branch) {\n return this.accessIds(branch, this.accessIdList(branch));\n };\n\n _proto.getMaxId = function getMaxId(branch) {\n return this.getMeta(branch, \"maxId\");\n };\n\n _proto.setMaxId = function setMaxId(tx, branch, newMaxId) {\n return this.setMeta(tx, branch, \"maxId\", newMaxId);\n };\n\n _proto.nextId = function nextId(id) {\n return id + 1;\n }\n /**\n * Returns the default state for the data structure.\n * @return {Object} The default state for this {@link ORM} instance's data structure\n */\n ;\n\n _proto.getEmptyState = function getEmptyState() {\n const pkIndex = {\n [this.arrName]: [],\n [this.mapName]: {}\n };\n const attrIndexes = Object.keys(this.fields).filter(attr => attr !== this.idAttribute).filter(attr => this.fields[attr].index).reduce((indexes, attr) => ({ ...indexes,\n [attr]: {}\n }), {});\n return { ...pkIndex,\n indexes: attrIndexes,\n meta: {}\n };\n };\n\n _proto.setMeta = function setMeta(tx, branch, key, value) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n if (withMutations) {\n const res = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.setIn([\"meta\", key], value, branch);\n return res;\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.setIn(batchToken, [\"meta\", key], value, branch);\n };\n\n _proto.getMeta = function getMeta(branch, key) {\n return branch.meta[key];\n };\n\n _proto.query = function query(branch, clauses) {\n if (clauses.length === 0) {\n return this.accessList(branch);\n }\n\n const {\n idAttribute\n } = this;\n const optimallyOrderedClauses = lodash_sortBy__WEBPACK_IMPORTED_MODULE_4___default()(clauses, clause => {\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n return 1;\n }\n\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseReducesResultSetSize\"])(clause)) {\n return 2;\n }\n\n return 3;\n });\n\n const reducer = (rows, clause) => {\n const {\n type,\n payload\n } = clause;\n\n if (!rows) {\n /**\n * First time this reducer is called during query.\n * This is where we apply query optimizations.\n */\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, idAttribute)) {\n /**\n * Payload specified a primary key. Use PK index\n * to look up the single row identified by the PK.\n */\n const id = payload[idAttribute];\n const remainingPayload = Object.keys(payload).reduce((withoutPkAttr, filterAttr) => {\n if (filterAttr !== idAttribute) {\n withoutPkAttr[filterAttr] = payload[filterAttr];\n }\n\n return withoutPkAttr;\n }, {});\n const ids = this.idExists(branch, id) ? [id] : [];\n\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-PK columns.\n * Filter accessed row by remaining payload (if one was found).\n */\n return reducer(this.accessIds(branch, ids), { ...clause,\n payload: remainingPayload\n });\n }\n /**\n * No need to filter these rows any further.\n * The primary key value satisfies this clause's conditions.\n */\n\n\n return this.accessIds(branch, ids);\n }\n\n if (type === _constants__WEBPACK_IMPORTED_MODULE_5__[\"FILTER\"] && typeof payload === \"object\") {\n const indexes = Object.entries(branch.indexes);\n const accessedIndexes = [];\n const indexAttrs = [];\n indexes.forEach(([attr, index]) => {\n if (Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"clauseFiltersByAttribute\"])(clause, attr)) {\n /**\n * Payload specified an indexed attribute. Use index\n * to potentially decrease amount of accessed rows.\n */\n if (index.hasOwnProperty(payload[attr])) {\n accessedIndexes.push(index[payload[attr]]);\n indexAttrs.push(attr);\n }\n }\n });\n /**\n * Calculate set of unique PK values corresponding to each\n * foreign key's attribute value. Then retrieve all those rows.\n */\n\n if (accessedIndexes.length) {\n const lastIndex = accessedIndexes.pop();\n const indexedIds = accessedIndexes.reduce((result, index) => {\n const indexSet = new Set(index);\n return result.filter(Set.prototype.has, indexSet);\n }, lastIndex);\n const remainingPayload = Object.keys(payload).reduce((withoutIndexAttrs, filterAttr) => {\n if (!indexAttrs.includes(filterAttr)) {\n withoutIndexAttrs[filterAttr] = payload[filterAttr];\n }\n\n return withoutIndexAttrs;\n }, {});\n\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-indexed columns.\n * Filter indexed rows by remaining payload (if any were found).\n */\n return reducer(this.accessIds(branch, indexedIds), { ...clause,\n payload: remainingPayload\n });\n }\n /**\n * No need to filter these rows any further.\n * The used indexes satisfy this clause's conditions.\n */\n\n\n return this.accessIds(branch, indexedIds);\n }\n } // Give up optimization: Retrieve all rows (full table scan).\n\n\n return reducer(this.accessList(branch), clause);\n }\n\n switch (type) {\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"FILTER\"]:\n {\n return lodash_filter__WEBPACK_IMPORTED_MODULE_1___default()(rows, payload);\n }\n\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"EXCLUDE\"]:\n {\n return lodash_reject__WEBPACK_IMPORTED_MODULE_3___default()(rows, payload);\n }\n\n case _constants__WEBPACK_IMPORTED_MODULE_5__[\"ORDER_BY\"]:\n {\n const [iteratees, orders] = payload;\n return lodash_orderBy__WEBPACK_IMPORTED_MODULE_2___default()(rows, iteratees, normalizeOrders(orders));\n }\n\n default:\n return rows;\n }\n };\n\n return optimallyOrderedClauses.reduce(reducer, undefined);\n }\n /**\n * Returns the data structure including a new object `entry`\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object} entry - the object to insert\n * @return {Object} an object with two keys: `state` and `created`.\n * `state` is the new table state and `created` is the\n * row that was created.\n */\n ;\n\n _proto.insert = function insert(tx, branch, entry) {\n const {\n batchToken,\n withMutations\n } = tx;\n const hasId = entry.hasOwnProperty(this.idAttribute);\n let workingState = branch; // This will not affect string id's.\n\n const [newMaxId, id] = idSequencer(this.getMaxId(branch), entry[this.idAttribute]);\n workingState = this.setMaxId(tx, branch, newMaxId);\n const finalEntry = hasId ? entry : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken, this.idAttribute, id, entry);\n const indexesToAppendTo = Object.keys(workingState.indexes).filter(fkAttr => entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null).map(fkAttr => [fkAttr, entry[fkAttr]]);\n\n if (withMutations) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, workingState[this.arrName]);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set(id, finalEntry, workingState[this.mapName]); // add id to indexes\n\n indexesToAppendTo.forEach(([attr, value]) => {\n const attrIndex = workingState.indexes[attr];\n\n if (attrIndex.hasOwnProperty(value)) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, attrIndex[value]);\n } else {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set(value, [id], attrIndex);\n }\n });\n return {\n state: workingState,\n created: finalEntry\n };\n }\n\n const nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexesToAppendTo.reduce((indexMap, [attr, value]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, indexMap[attr][value] || [])\n }, indexMap[attr]);\n return indexMap;\n }, { ...workingState.indexes\n }), workingState.indexes);\n const nextState = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [this.arrName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, workingState[this.arrName]),\n [this.mapName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [id]: finalEntry\n }, workingState[this.mapName]),\n indexes: nextIndexes\n }, workingState);\n return {\n state: nextState,\n created: finalEntry\n };\n }\n /**\n * Returns the data structure with objects where `rows`\n * are merged with `mergeObj`.\n *\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @param {Object} mergeObj - The object to merge with each row.\n * @return {Object}\n */\n ;\n\n _proto.update = function update(tx, branch, rows, mergeObj) {\n const {\n batchToken,\n withMutations\n } = tx;\n\n const mergeObjInto = row => {\n const merge = withMutations ? immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.merge : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken);\n return merge(mergeObj, row);\n };\n\n const set = withMutations ? immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.set : immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.set(batchToken);\n const indexedAttrs = Object.keys(branch.indexes).filter(attr => mergeObj.hasOwnProperty(attr));\n const indexIdsToAdd = [];\n const indexIdsToDelete = [];\n const nextMap = rows.reduce((map, row) => {\n const prevAttrValues = indexedAttrs.reduce((valueMap, attr) => ({ ...valueMap,\n [attr]: row[attr]\n }), {});\n const result = mergeObjInto(row);\n const nextAttrValues = indexedAttrs.reduce((valueMap, attr) => ({ ...valueMap,\n [attr]: result[attr]\n }), {});\n const id = result[this.idAttribute];\n const nextRow = set(id, result, map);\n indexedAttrs.forEach(attr => {\n const {\n [attr]: prevValue\n } = prevAttrValues;\n const {\n [attr]: nextValue\n } = nextAttrValues;\n\n if (prevValue === nextValue) {\n // attribute has not changed, no need to update any index\n return;\n }\n\n if (prevValue !== null && typeof prevValue !== \"undefined\") {\n // remove id from attribute's index for its old value\n indexIdsToDelete.push([attr, prevValue, id]);\n }\n\n if (nextValue !== null) {\n // add id to attribute's index for its new value\n indexIdsToAdd.push([attr, nextValue, id]);\n }\n });\n return nextRow;\n }, branch[this.mapName]);\n let nextIndexes = branch.indexes;\n\n if (withMutations) {\n indexIdsToDelete.forEach(([attr, value, id]) => {\n const arr = nextIndexes[attr][value];\n const idx = arr.indexOf(id);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], arr);\n });\n indexIdsToAdd.forEach(([attr, value, id]) => {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.push(id, nextIndexes[attr][value]);\n });\n } else {\n if (indexIdsToAdd.length) {\n nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexIdsToAdd.reduce((indexMap, [attr, value, id]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.push(batchToken, id, indexMap[attr][value] || [])\n }, indexMap[attr]);\n return indexMap;\n }, { ...nextIndexes\n }), nextIndexes);\n }\n\n if (indexIdsToDelete.length) {\n nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, indexIdsToDelete.reduce((indexMap, [attr, value, id]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [value]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, rowId => rowId !== id, indexMap[attr][value])\n }, indexMap[attr]);\n return indexMap;\n }, { ...nextIndexes\n }), nextIndexes);\n }\n }\n\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [this.mapName]: nextMap,\n indexes: nextIndexes\n }, branch);\n }\n /**\n * Returns the data structure without rows `rows`.\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @return {Object} the data structure without ids in `idsToDelete`.\n */\n ;\n\n _proto.delete = function _delete(tx, branch, rows) {\n const {\n batchToken,\n withMutations\n } = tx;\n const {\n arrName,\n mapName\n } = this;\n const arr = branch[arrName];\n const idsToDelete = rows.map(row => row[this.idAttribute]);\n\n if (withMutations) {\n idsToDelete.forEach(id => {\n const idx = arr.indexOf(id);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], arr);\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.omit(id, branch[mapName]);\n }); // delete ids from all indexes\n\n Object.values(branch.indexes).forEach(attrIndex => Object.values(attrIndex).forEach(valueIndex => idsToDelete.forEach(id => {\n const idx = valueIndex.indexOf(id);\n\n if (idx !== -1) {\n immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].mutable.splice(idx, 1, [], valueIndex);\n }\n })));\n return branch;\n }\n\n const nextIndexes = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, Object.entries(branch.indexes).reduce((indexMap, [attr, attrIndex]) => {\n indexMap[attr] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, Object.entries(attrIndex).reduce((attrIndexMap, [value, valueIndex]) => {\n attrIndexMap[value] = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, id => !idsToDelete.includes(id), valueIndex);\n return attrIndexMap;\n }, { ...indexMap[attr]\n }), indexMap[attr]);\n return indexMap;\n }, { ...branch.indexes\n }), branch.indexes);\n return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, {\n [arrName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.filter(batchToken, id => !idsToDelete.includes(id), branch[arrName]),\n [mapName]: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.omit(batchToken, idsToDelete, branch[mapName]),\n indexes: immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"].batch.merge(batchToken, nextIndexes, branch.indexes)\n }, branch);\n };\n\n return Table;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Table);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9UYWJsZS5qcz83NDk3Il0sIm5hbWVzIjpbIkRFRkFVTFRfVEFCTEVfT1BUSU9OUyIsImlkQXR0cmlidXRlIiwiYXJyTmFtZSIsIm1hcE5hbWUiLCJmaWVsZHMiLCJpZFNlcXVlbmNlciIsIl9jdXJyTWF4IiwidXNlclBhc3NlZElkIiwiY3Vyck1heCIsIm5ld01heCIsIm5ld0lkIiwidW5kZWZpbmVkIiwiTWF0aCIsIm1heCIsIm5vcm1hbGl6ZU9yZGVycyIsIm9yZGVycyIsImNvbnZlcnQiLCJvcmRlciIsImluY2x1ZGVzIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiVGFibGUiLCJ1c2VyT3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImFjY2Vzc0lkIiwiYnJhbmNoIiwiaWQiLCJhY2Nlc3NJZHMiLCJpZHMiLCJpZEV4aXN0cyIsImhhc093blByb3BlcnR5IiwiYWNjZXNzSWRMaXN0IiwiYWNjZXNzTGlzdCIsImdldE1heElkIiwiZ2V0TWV0YSIsInNldE1heElkIiwidHgiLCJuZXdNYXhJZCIsInNldE1ldGEiLCJuZXh0SWQiLCJnZXRFbXB0eVN0YXRlIiwicGtJbmRleCIsImF0dHJJbmRleGVzIiwia2V5cyIsImZpbHRlciIsImF0dHIiLCJpbmRleCIsInJlZHVjZSIsImluZGV4ZXMiLCJtZXRhIiwia2V5IiwidmFsdWUiLCJiYXRjaFRva2VuIiwid2l0aE11dGF0aW9ucyIsInJlcyIsIm9wcyIsIm11dGFibGUiLCJzZXRJbiIsImJhdGNoIiwicXVlcnkiLCJjbGF1c2VzIiwibGVuZ3RoIiwib3B0aW1hbGx5T3JkZXJlZENsYXVzZXMiLCJzb3J0QnkiLCJjbGF1c2UiLCJjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUiLCJjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZSIsInJlZHVjZXIiLCJyb3dzIiwidHlwZSIsInBheWxvYWQiLCJyZW1haW5pbmdQYXlsb2FkIiwid2l0aG91dFBrQXR0ciIsImZpbHRlckF0dHIiLCJGSUxURVIiLCJlbnRyaWVzIiwiYWNjZXNzZWRJbmRleGVzIiwiaW5kZXhBdHRycyIsImZvckVhY2giLCJwdXNoIiwibGFzdEluZGV4IiwicG9wIiwiaW5kZXhlZElkcyIsInJlc3VsdCIsImluZGV4U2V0IiwiU2V0IiwicHJvdG90eXBlIiwiaGFzIiwid2l0aG91dEluZGV4QXR0cnMiLCJFWENMVURFIiwicmVqZWN0IiwiT1JERVJfQlkiLCJpdGVyYXRlZXMiLCJvcmRlckJ5IiwiaW5zZXJ0IiwiZW50cnkiLCJoYXNJZCIsIndvcmtpbmdTdGF0ZSIsImZpbmFsRW50cnkiLCJzZXQiLCJpbmRleGVzVG9BcHBlbmRUbyIsImZrQXR0ciIsImF0dHJJbmRleCIsInN0YXRlIiwiY3JlYXRlZCIsIm5leHRJbmRleGVzIiwibWVyZ2UiLCJpbmRleE1hcCIsIm5leHRTdGF0ZSIsInVwZGF0ZSIsIm1lcmdlT2JqIiwibWVyZ2VPYmpJbnRvIiwicm93IiwiaW5kZXhlZEF0dHJzIiwiaW5kZXhJZHNUb0FkZCIsImluZGV4SWRzVG9EZWxldGUiLCJuZXh0TWFwIiwicHJldkF0dHJWYWx1ZXMiLCJ2YWx1ZU1hcCIsIm5leHRBdHRyVmFsdWVzIiwibmV4dFJvdyIsInByZXZWYWx1ZSIsIm5leHRWYWx1ZSIsImFyciIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyb3dJZCIsImRlbGV0ZSIsImlkc1RvRGVsZXRlIiwib21pdCIsInZhbHVlcyIsInZhbHVlSW5kZXgiLCJhdHRySW5kZXhNYXAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRztBQUMxQkMsYUFBVyxFQUFFLElBRGE7QUFFMUJDLFNBQU8sRUFBRSxPQUZpQjtBQUcxQkMsU0FBTyxFQUFFLFdBSGlCO0FBSTFCQyxRQUFNLEVBQUU7QUFKa0IsQ0FB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TCxFQW1CSSxFQUFFLEdBQUdsRixNQUFNLENBQUN1QjtBQUFaLEtBbkJKLENBRmdCLEVBdUJoQnZCLE1BQU0sQ0FBQ3VCLE9BdkJTLENBQXBCO0FBMEJBLFdBQU9PLHFEQUFHLENBQUNHLEtBQUosQ0FBVWdELEtBQVYsQ0FDSHRELFVBREcsRUFFSDtBQUNJLE9BQUNwRCxPQUFELEdBQVd1RCxxREFBRyxDQUFDRyxLQUFKLENBQVVkLE1BQVYsQ0FDUFEsVUFETyxFQUVOMUIsRUFBRCxJQUFRLENBQUN1RyxXQUFXLENBQUNqSCxRQUFaLENBQXFCVSxFQUFyQixDQUZGLEVBR1BELE1BQU0sQ0FBQ3pCLE9BQUQsQ0FIQyxDQURmO0FBTUksT0FBQ0MsT0FBRCxHQUFXc0QscURBQUcsQ0FBQ0csS0FBSixDQUFVd0UsSUFBVixDQUNQOUUsVUFETyxFQUVQNkUsV0FGTyxFQUdQeEcsTUFBTSxDQUFDeEIsT0FBRCxDQUhDLENBTmY7QUFXSStDLGFBQU8sRUFBRU8scURBQUcsQ0FBQ0csS0FBSixDQUFVZ0QsS0FBVixDQUNMdEQsVUFESyxFQUVMcUQsV0FGSyxFQUdMaEYsTUFBTSxDQUFDdUIsT0FIRjtBQVhiLEtBRkcsRUFtQkh2QixNQW5CRyxDQUFQO0FBcUJILEdBMWlCTDs7QUFBQTtBQUFBO0FBNmlCZUwsb0VBQWYiLCJmaWxlIjoiLi9zcmMvZGIvVGFibGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3BzIGZyb20gXCJpbW11dGFibGUtb3BzXCI7XG5pbXBvcnQgZmlsdGVyIGZyb20gXCJsb2Rhc2gvZmlsdGVyXCI7XG5pbXBvcnQgb3JkZXJCeSBmcm9tIFwibG9kYXNoL29yZGVyQnlcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcImxvZGFzaC9yZWplY3RcIjtcbmltcG9ydCBzb3J0QnkgZnJvbSBcImxvZGFzaC9zb3J0QnlcIjtcblxuaW1wb3J0IHsgRVhDTFVERSwgRklMVEVSLCBPUkRFUl9CWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZSwgY2xhdXNlUmVkdWNlc1Jlc3VsdFNldFNpemUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuY29uc3QgREVGQVVMVF9UQUJMRV9PUFRJT05TID0ge1xuICAgIGlkQXR0cmlidXRlOiBcImlkXCIsXG4gICAgYXJyTmFtZTogXCJpdGVtc1wiLFxuICAgIG1hcE5hbWU6IFwiaXRlbXNCeUlkXCIsXG4gICAgZmllbGRzOiB7fSxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gX2N1cnJNYXggLSB0aGUgY3VycmVudCBtYXggaWRcbiAqIEBwYXJhbSB7Kn0gdXNlclBhc3NlZElkIC0gdGhlIG5ldyBpZCBwYXNzZWQgdG8gdGhlIGNyZWF0ZSBhY3Rpb25cbiAqXG4gKiBCb3RoIG1heSBiZSB1bmRlZmluZWQuIFRoZSBjdXJyZW50IG1heCBpZCBpbiB0aGUgY2FzZSB0aGF0IHRoaXMgaXMgdGhlIGZpcnN0IE1vZGVsXG4gKiBiZWluZyBjcmVhdGVkLCBhbmQgdGhlIG5ldyBpZCBpZiB0aGUgaWQgd2FzIG5vdCBleHBsaWNpdGx5IHBhc3NlZCB0byB0aGVcbiAqIGRhdGFiYXNlLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fSB0aGUgbmV3IG1heCBpZCBhbmQgdGhlIGlkIHRvIHVzZSB0byBjcmVhdGUgdGhlIG5ldyByb3dcbiAqXG4gKiBJZiB0aGUgaWQncyBhcmUgc3RyaW5ncywgdGhlIGlkIG11c3QgYmUgcGFzc2VkIGV4cGxpY2l0bHkgZXZlcnkgdGltZS5cbiAqIEluIHRoaXMgY2FzZSwgdGhlIGN1cnJlbnQgbWF4IGlkIHdpbGwgcmVtYWluIGBOYU5gIGR1ZSB0byBgTWF0aC5tYXhgLCBidXQgdGhhdCdzIGZpbmUuXG4gKi9cbmZ1bmN0aW9uIGlkU2VxdWVuY2VyKF9jdXJyTWF4LCB1c2VyUGFzc2VkSWQpIHtcbiAgICBsZXQgY3Vyck1heCA9IF9jdXJyTWF4O1xuICAgIGxldCBuZXdNYXg7XG4gICAgbGV0IG5ld0lkO1xuXG4gICAgaWYgKGN1cnJNYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjdXJyTWF4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKHVzZXJQYXNzZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld01heCA9IGN1cnJNYXggKyAxO1xuICAgICAgICBuZXdJZCA9IG5ld01heDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBuZXdNYXggPSBNYXRoLm1heChjdXJyTWF4ICsgMSwgdXNlclBhc3NlZElkKTtcbiAgICAgICAgbmV3SWQgPSB1c2VyUGFzc2VkSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgbmV3TWF4LCAvLyBuZXcgbWF4IGlkXG4gICAgICAgIG5ld0lkLCAvLyBpZCB0byB1c2UgZm9yIHJvdyBjcmVhdGlvblxuICAgIF07XG59XG5cbi8qKlxuICogQWRhcHQgb3JkZXIgZGlyZWN0aW9ucyBhcnJheSB0byBAe2xvZGFzaC5vcmRlckJ5fSBBUEkuXG4gKlxuICogQHByaXZhdGVcbiAqXG4gKiBAcGFyYW0ge0FycmF5PEJvb2xlYW58J2FzYyd8J2Rlc2MnPn0gb3JkZXJzPyAtIGFuIGFycmF5IG9mIG9wdGlvbmFsIG9yZGVyIHF1ZXJ5IGRpcmVjdGlvbnMgYXMgcHJvdmlkZWQgdG8ge0BMaW5rIHtRdWVyeVNldC5vcmRlckJ5fX1cbiAqIEByZXR1cm4ge0FycmF5PCdhc2MnfCdkZXNjJz58dW5kZWZpbmVkfSBBIG5vcm1hbGl6ZWQgb3JkZXJpbmcgYXJyYXkgb3IgdW5kZWZpbmVkIGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVPcmRlcnMob3JkZXJzKSB7XG4gICAgaWYgKG9yZGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnQgPSAob3JkZXIpID0+IHtcbiAgICAgICAgaWYgKFtcImRlc2NcIiwgZmFsc2VdLmluY2x1ZGVzKG9yZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiZGVzY1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcImFzY1wiO1xuICAgIH07XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3JkZXJzKSA/IG9yZGVycy5tYXAoY29udmVydCkgOiBjb252ZXJ0KG9yZGVycyk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZSBmb3IgYSB7QGxpbmsgTW9kZWx9IGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUYWJsZX0gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB1c2VyT3B0cyAtIG9wdGlvbnMgdG8gdXNlLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3VzZXJPcHRzLmlkQXR0cmlidXRlPWlkXSAtIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFt1c2VyT3B0cy5hcnJOYW1lPWl0ZW1zXSAtIHRoZSBzdGF0ZSBhdHRyaWJ1dGUgd2hlcmUgYW4gYXJyYXkgb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBpZCdzIGFyZSBzdG9yZWRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFt1c2VyT3B0cy5tYXBOYW1lPWl0ZW1zQnlJZF0gLSB0aGUgc3RhdGUgYXR0cmlidXRlIHdoZXJlIHRoZSBlbnRpdHkgb2JqZWN0c1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQgaW4gYSBpZCB0byBlbnRpdHkgb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3VzZXJPcHRzLmZpZWxkcz17fV0gLSBtYXBwaW5nIG9mIGZpZWxkIGtleSB0byB7QGxpbmsgRmllbGR9IG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVzZXJPcHRzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgREVGQVVMVF9UQUJMRV9PUFRJT05TLCB1c2VyT3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGF0IGluZGV4IGBpZGBcbiAgICAgKiBpbiBzdGF0ZSBgYnJhbmNoYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gYnJhbmNoIC0gdGhlIHN0YXRlXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAtIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGdldFxuICAgICAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoZSByYXcgb2JqZWN0IGluIHRoZSBzdGF0ZSBvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBhY2Nlc3NJZChicmFuY2gsIGlkKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hbdGhpcy5tYXBOYW1lXVtpZF07XG4gICAgfVxuXG4gICAgYWNjZXNzSWRzKGJyYW5jaCwgaWRzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGJyYW5jaFt0aGlzLm1hcE5hbWVdO1xuICAgICAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IG1hcFtpZF0pO1xuICAgIH1cblxuICAgIGlkRXhpc3RzKGJyYW5jaCwgaWQpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5jaFt0aGlzLm1hcE5hbWVdLmhhc093blByb3BlcnR5KGlkKTtcbiAgICB9XG5cbiAgICBhY2Nlc3NJZExpc3QoYnJhbmNoKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hbdGhpcy5hcnJOYW1lXTtcbiAgICB9XG5cbiAgICBhY2Nlc3NMaXN0KGJyYW5jaCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NJZHMoYnJhbmNoLCB0aGlzLmFjY2Vzc0lkTGlzdChicmFuY2gpKTtcbiAgICB9XG5cbiAgICBnZXRNYXhJZChicmFuY2gpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YShicmFuY2gsIFwibWF4SWRcIik7XG4gICAgfVxuXG4gICAgc2V0TWF4SWQodHgsIGJyYW5jaCwgbmV3TWF4SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TWV0YSh0eCwgYnJhbmNoLCBcIm1heElkXCIsIG5ld01heElkKTtcbiAgICB9XG5cbiAgICBuZXh0SWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkICsgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHN0YXRlIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgZGVmYXVsdCBzdGF0ZSBmb3IgdGhpcyB7QGxpbmsgT1JNfSBpbnN0YW5jZSdzIGRhdGEgc3RydWN0dXJlXG4gICAgICovXG4gICAgZ2V0RW1wdHlTdGF0ZSgpIHtcbiAgICAgICAgY29uc3QgcGtJbmRleCA9IHtcbiAgICAgICAgICAgIFt0aGlzLmFyck5hbWVdOiBbXSxcbiAgICAgICAgICAgIFt0aGlzLm1hcE5hbWVdOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYXR0ckluZGV4ZXMgPSBPYmplY3Qua2V5cyh0aGlzLmZpZWxkcylcbiAgICAgICAgICAgIC5maWx0ZXIoKGF0dHIpID0+IGF0dHIgIT09IHRoaXMuaWRBdHRyaWJ1dGUpXG4gICAgICAgICAgICAuZmlsdGVyKChhdHRyKSA9PiB0aGlzLmZpZWxkc1thdHRyXS5pbmRleClcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4ZXMsIGF0dHIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmluZGV4ZXMsXG4gICAgICAgICAgICAgICAgICAgIFthdHRyXToge30sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wa0luZGV4LFxuICAgICAgICAgICAgaW5kZXhlczogYXR0ckluZGV4ZXMsXG4gICAgICAgICAgICBtZXRhOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRNZXRhKHR4LCBicmFuY2gsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH0gPSB0eDtcbiAgICAgICAgaWYgKHdpdGhNdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IG9wcy5tdXRhYmxlLnNldEluKFtcIm1ldGFcIiwga2V5XSwgdmFsdWUsIGJyYW5jaCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wcy5iYXRjaC5zZXRJbihiYXRjaFRva2VuLCBbXCJtZXRhXCIsIGtleV0sIHZhbHVlLCBicmFuY2gpO1xuICAgIH1cblxuICAgIGdldE1ldGEoYnJhbmNoLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5jaC5tZXRhW2tleV07XG4gICAgfVxuXG4gICAgcXVlcnkoYnJhbmNoLCBjbGF1c2VzKSB7XG4gICAgICAgIGlmIChjbGF1c2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzTGlzdChicmFuY2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpZEF0dHJpYnV0ZSB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBvcHRpbWFsbHlPcmRlcmVkQ2xhdXNlcyA9IHNvcnRCeShjbGF1c2VzLCAoY2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlKGNsYXVzZSwgaWRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZShjbGF1c2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZWR1Y2VyID0gKHJvd3MsIGNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0eXBlLCBwYXlsb2FkIH0gPSBjbGF1c2U7XG4gICAgICAgICAgICBpZiAoIXJvd3MpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBGaXJzdCB0aW1lIHRoaXMgcmVkdWNlciBpcyBjYWxsZWQgZHVyaW5nIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgd2hlcmUgd2UgYXBwbHkgcXVlcnkgb3B0aW1pemF0aW9ucy5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAoY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlKGNsYXVzZSwgaWRBdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBQYXlsb2FkIHNwZWNpZmllZCBhIHByaW1hcnkga2V5LiBVc2UgUEsgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICogdG8gbG9vayB1cCB0aGUgc2luZ2xlIHJvdyBpZGVudGlmaWVkIGJ5IHRoZSBQSy5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gcGF5bG9hZFtpZEF0dHJpYnV0ZV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1BheWxvYWQgPSBPYmplY3Qua2V5cyhwYXlsb2FkKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dFBrQXR0ciwgZmlsdGVyQXR0cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJBdHRyICE9PSBpZEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0UGtBdHRyW2ZpbHRlckF0dHJdID0gcGF5bG9hZFtmaWx0ZXJBdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRQa0F0dHI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gdGhpcy5pZEV4aXN0cyhicmFuY2gsIGlkKSA/IFtpZF0gOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbWFpbmluZ1BheWxvYWQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXlsb2FkIGhhcyBhZGRpdGlvbmFsLCBub24tUEsgY29sdW1ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEZpbHRlciBhY2Nlc3NlZCByb3cgYnkgcmVtYWluaW5nIHBheWxvYWQgKGlmIG9uZSB3YXMgZm91bmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVkdWNlcih0aGlzLmFjY2Vzc0lkcyhicmFuY2gsIGlkcyksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jbGF1c2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogcmVtYWluaW5nUGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBObyBuZWVkIHRvIGZpbHRlciB0aGVzZSByb3dzIGFueSBmdXJ0aGVyLlxuICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgc2F0aXNmaWVzIHRoaXMgY2xhdXNlJ3MgY29uZGl0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc0lkcyhicmFuY2gsIGlkcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBGSUxURVIgJiYgdHlwZW9mIHBheWxvYWQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhlcyA9IE9iamVjdC5lbnRyaWVzKGJyYW5jaC5pbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzZWRJbmRleGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4QXR0cnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5mb3JFYWNoKChbYXR0ciwgaW5kZXhdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlKGNsYXVzZSwgYXR0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXlsb2FkIHNwZWNpZmllZCBhbiBpbmRleGVkIGF0dHJpYnV0ZS4gVXNlIGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gcG90ZW50aWFsbHkgZGVjcmVhc2UgYW1vdW50IG9mIGFjY2Vzc2VkIHJvd3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4Lmhhc093blByb3BlcnR5KHBheWxvYWRbYXR0cl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2VkSW5kZXhlcy5wdXNoKGluZGV4W3BheWxvYWRbYXR0cl1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhBdHRycy5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgc2V0IG9mIHVuaXF1ZSBQSyB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoXG4gICAgICAgICAgICAgICAgICAgICAqIGZvcmVpZ24ga2V5J3MgYXR0cmlidXRlIHZhbHVlLiBUaGVuIHJldHJpZXZlIGFsbCB0aG9zZSByb3dzLlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc2VkSW5kZXhlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGFjY2Vzc2VkSW5kZXhlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ZWRJZHMgPSBhY2Nlc3NlZEluZGV4ZXMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4U2V0ID0gbmV3IFNldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5oYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nUGF5bG9hZCA9IE9iamVjdC5rZXlzKHBheWxvYWQpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dEluZGV4QXR0cnMsIGZpbHRlckF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleEF0dHJzLmluY2x1ZGVzKGZpbHRlckF0dHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0SW5kZXhBdHRyc1tmaWx0ZXJBdHRyXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtmaWx0ZXJBdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dEluZGV4QXR0cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZW1haW5pbmdQYXlsb2FkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXlsb2FkIGhhcyBhZGRpdGlvbmFsLCBub24taW5kZXhlZCBjb2x1bW5zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZpbHRlciBpbmRleGVkIHJvd3MgYnkgcmVtYWluaW5nIHBheWxvYWQgKGlmIGFueSB3ZXJlIGZvdW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVkdWNlcih0aGlzLmFjY2Vzc0lkcyhicmFuY2gsIGluZGV4ZWRJZHMpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNsYXVzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogcmVtYWluaW5nUGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogTm8gbmVlZCB0byBmaWx0ZXIgdGhlc2Ugcm93cyBhbnkgZnVydGhlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB1c2VkIGluZGV4ZXMgc2F0aXNmeSB0aGlzIGNsYXVzZSdzIGNvbmRpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc0lkcyhicmFuY2gsIGluZGV4ZWRJZHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gR2l2ZSB1cCBvcHRpbWl6YXRpb246IFJldHJpZXZlIGFsbCByb3dzIChmdWxsIHRhYmxlIHNjYW4pLlxuICAgICAgICAgICAgICAgIHJldHVybiByZWR1Y2VyKHRoaXMuYWNjZXNzTGlzdChicmFuY2gpLCBjbGF1c2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZJTFRFUjoge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyKHJvd3MsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEVYQ0xVREU6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChyb3dzLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBPUkRFUl9CWToge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbaXRlcmF0ZWVzLCBvcmRlcnNdID0gcGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyQnkocm93cywgaXRlcmF0ZWVzLCBub3JtYWxpemVPcmRlcnMob3JkZXJzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBvcHRpbWFsbHlPcmRlcmVkQ2xhdXNlcy5yZWR1Y2UocmVkdWNlciwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIHN0cnVjdHVyZSBpbmNsdWRpbmcgYSBuZXcgb2JqZWN0IGBlbnRyeWBcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHR4IC0gdHJhbnNhY3Rpb24gaW5mb1xuICAgICAqIEBwYXJhbSAge09iamVjdH0gYnJhbmNoIC0gdGhlIGRhdGEgc3RydWN0dXJlIHN0YXRlXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBlbnRyeSAtIHRoZSBvYmplY3QgdG8gaW5zZXJ0XG4gICAgICogQHJldHVybiB7T2JqZWN0fSBhbiBvYmplY3Qgd2l0aCB0d28ga2V5czogYHN0YXRlYCBhbmQgYGNyZWF0ZWRgLlxuICAgICAqICAgICAgICAgICAgICAgICAgYHN0YXRlYCBpcyB0aGUgbmV3IHRhYmxlIHN0YXRlIGFuZCBgY3JlYXRlZGAgaXMgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICByb3cgdGhhdCB3YXMgY3JlYXRlZC5cbiAgICAgKi9cbiAgICBpbnNlcnQodHgsIGJyYW5jaCwgZW50cnkpIHtcbiAgICAgICAgY29uc3QgeyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH0gPSB0eDtcblxuICAgICAgICBjb25zdCBoYXNJZCA9IGVudHJ5Lmhhc093blByb3BlcnR5KHRoaXMuaWRBdHRyaWJ1dGUpO1xuXG4gICAgICAgIGxldCB3b3JraW5nU3RhdGUgPSBicmFuY2g7XG5cbiAgICAgICAgLy8gVGhpcyB3aWxsIG5vdCBhZmZlY3Qgc3RyaW5nIGlkJ3MuXG4gICAgICAgIGNvbnN0IFtuZXdNYXhJZCwgaWRdID0gaWRTZXF1ZW5jZXIoXG4gICAgICAgICAgICB0aGlzLmdldE1heElkKGJyYW5jaCksXG4gICAgICAgICAgICBlbnRyeVt0aGlzLmlkQXR0cmlidXRlXVxuICAgICAgICApO1xuICAgICAgICB3b3JraW5nU3RhdGUgPSB0aGlzLnNldE1heElkKHR4LCBicmFuY2gsIG5ld01heElkKTtcblxuICAgICAgICBjb25zdCBmaW5hbEVudHJ5ID0gaGFzSWRcbiAgICAgICAgICAgID8gZW50cnlcbiAgICAgICAgICAgIDogb3BzLmJhdGNoLnNldChiYXRjaFRva2VuLCB0aGlzLmlkQXR0cmlidXRlLCBpZCwgZW50cnkpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ZXNUb0FwcGVuZFRvID0gT2JqZWN0LmtleXMod29ya2luZ1N0YXRlLmluZGV4ZXMpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChma0F0dHIpID0+XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Lmhhc093blByb3BlcnR5KGZrQXR0cikgJiYgZW50cnlbZmtBdHRyXSAhPT0gbnVsbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZmtBdHRyKSA9PiBbZmtBdHRyLCBlbnRyeVtma0F0dHJdXSk7XG5cbiAgICAgICAgaWYgKHdpdGhNdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIG9wcy5tdXRhYmxlLnB1c2goaWQsIHdvcmtpbmdTdGF0ZVt0aGlzLmFyck5hbWVdKTtcbiAgICAgICAgICAgIG9wcy5tdXRhYmxlLnNldChpZCwgZmluYWxFbnRyeSwgd29ya2luZ1N0YXRlW3RoaXMubWFwTmFtZV0pO1xuICAgICAgICAgICAgLy8gYWRkIGlkIHRvIGluZGV4ZXNcbiAgICAgICAgICAgIGluZGV4ZXNUb0FwcGVuZFRvLmZvckVhY2goKFthdHRyLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5kZXggPSB3b3JraW5nU3RhdGUuaW5kZXhlc1thdHRyXTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ckluZGV4Lmhhc093blByb3BlcnR5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5wdXNoKGlkLCBhdHRySW5kZXhbdmFsdWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zZXQodmFsdWUsIFtpZF0sIGF0dHJJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXRlOiB3b3JraW5nU3RhdGUsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogZmluYWxFbnRyeSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0SW5kZXhlcyA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICBpbmRleGVzVG9BcHBlbmRUby5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4TWFwLCBbYXR0ciwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdOiBvcHMuYmF0Y2gucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdW3ZhbHVlXSB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXBbYXR0cl1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4TWFwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyAuLi53b3JraW5nU3RhdGUuaW5kZXhlcyB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya2luZ1N0YXRlLmluZGV4ZXNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSBvcHMuYmF0Y2gubWVyZ2UoXG4gICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFt0aGlzLmFyck5hbWVdOiBvcHMuYmF0Y2gucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdTdGF0ZVt0aGlzLmFyck5hbWVdXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBbdGhpcy5tYXBOYW1lXTogb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdOiBmaW5hbEVudHJ5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JraW5nU3RhdGVbdGhpcy5tYXBOYW1lXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaW5kZXhlczogbmV4dEluZGV4ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd29ya2luZ1N0YXRlXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXRlOiBuZXh0U3RhdGUsXG4gICAgICAgICAgICBjcmVhdGVkOiBmaW5hbEVudHJ5LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGggb2JqZWN0cyB3aGVyZSBgcm93c2BcbiAgICAgKiBhcmUgbWVyZ2VkIHdpdGggYG1lcmdlT2JqYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdHggLSB0cmFuc2FjdGlvbiBpbmZvXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBicmFuY2ggLSB0aGUgZGF0YSBzdHJ1Y3R1cmUgc3RhdGVcbiAgICAgKiBAcGFyYW0gIHtPYmplY3RbXX0gcm93cyAtIHJvd3MgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBtZXJnZU9iaiAtIFRoZSBvYmplY3QgdG8gbWVyZ2Ugd2l0aCBlYWNoIHJvdy5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgdXBkYXRlKHR4LCBicmFuY2gsIHJvd3MsIG1lcmdlT2JqKSB7XG4gICAgICAgIGNvbnN0IHsgYmF0Y2hUb2tlbiwgd2l0aE11dGF0aW9ucyB9ID0gdHg7XG5cbiAgICAgICAgY29uc3QgbWVyZ2VPYmpJbnRvID0gKHJvdykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2UgPSB3aXRoTXV0YXRpb25zXG4gICAgICAgICAgICAgICAgPyBvcHMubXV0YWJsZS5tZXJnZVxuICAgICAgICAgICAgICAgIDogb3BzLmJhdGNoLm1lcmdlKGJhdGNoVG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuIG1lcmdlKG1lcmdlT2JqLCByb3cpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNldCA9IHdpdGhNdXRhdGlvbnMgPyBvcHMubXV0YWJsZS5zZXQgOiBvcHMuYmF0Y2guc2V0KGJhdGNoVG9rZW4pO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ZWRBdHRycyA9IE9iamVjdC5rZXlzKGJyYW5jaC5pbmRleGVzKS5maWx0ZXIoKGF0dHIpID0+XG4gICAgICAgICAgICBtZXJnZU9iai5oYXNPd25Qcm9wZXJ0eShhdHRyKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbmRleElkc1RvQWRkID0gW107XG4gICAgICAgIGNvbnN0IGluZGV4SWRzVG9EZWxldGUgPSBbXTtcblxuICAgICAgICBjb25zdCBuZXh0TWFwID0gcm93cy5yZWR1Y2UoKG1hcCwgcm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2QXR0clZhbHVlcyA9IGluZGV4ZWRBdHRycy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHZhbHVlTWFwLCBhdHRyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi52YWx1ZU1hcCxcbiAgICAgICAgICAgICAgICAgICAgW2F0dHJdOiByb3dbYXR0cl0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBtZXJnZU9iakludG8ocm93KTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRBdHRyVmFsdWVzID0gaW5kZXhlZEF0dHJzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAodmFsdWVNYXAsIGF0dHIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlTWFwLFxuICAgICAgICAgICAgICAgICAgICBbYXR0cl06IHJlc3VsdFthdHRyXSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcmVzdWx0W3RoaXMuaWRBdHRyaWJ1dGVdO1xuICAgICAgICAgICAgY29uc3QgbmV4dFJvdyA9IHNldChpZCwgcmVzdWx0LCBtYXApO1xuICAgICAgICAgICAgaW5kZXhlZEF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IFthdHRyXTogcHJldlZhbHVlIH0gPSBwcmV2QXR0clZhbHVlcztcbiAgICAgICAgICAgICAgICBjb25zdCB7IFthdHRyXTogbmV4dFZhbHVlIH0gPSBuZXh0QXR0clZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAocHJldlZhbHVlID09PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIGhhcyBub3QgY2hhbmdlZCwgbm8gbmVlZCB0byB1cGRhdGUgYW55IGluZGV4XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZWYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgcHJldlZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpZCBmcm9tIGF0dHJpYnV0ZSdzIGluZGV4IGZvciBpdHMgb2xkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGluZGV4SWRzVG9EZWxldGUucHVzaChbYXR0ciwgcHJldlZhbHVlLCBpZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpZCB0byBhdHRyaWJ1dGUncyBpbmRleCBmb3IgaXRzIG5ldyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvQWRkLnB1c2goW2F0dHIsIG5leHRWYWx1ZSwgaWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0Um93O1xuICAgICAgICB9LCBicmFuY2hbdGhpcy5tYXBOYW1lXSk7XG5cbiAgICAgICAgbGV0IG5leHRJbmRleGVzID0gYnJhbmNoLmluZGV4ZXM7XG4gICAgICAgIGlmICh3aXRoTXV0YXRpb25zKSB7XG4gICAgICAgICAgICBpbmRleElkc1RvRGVsZXRlLmZvckVhY2goKFthdHRyLCB2YWx1ZSwgaWRdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gbmV4dEluZGV4ZXNbYXR0cl1bdmFsdWVdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGFyci5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zcGxpY2UoaWR4LCAxLCBbXSwgYXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhJZHNUb0FkZC5mb3JFYWNoKChbYXR0ciwgdmFsdWUsIGlkXSkgPT4ge1xuICAgICAgICAgICAgICAgIG9wcy5tdXRhYmxlLnB1c2goaWQsIG5leHRJbmRleGVzW2F0dHJdW3ZhbHVlXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmRleElkc1RvQWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvQWRkLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleE1hcCwgW2F0dHIsIHZhbHVlLCBpZF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXTogb3BzLmJhdGNoLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXVt2YWx1ZV0gfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyAuLi5uZXh0SW5kZXhlcyB9XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleElkc1RvRGVsZXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBpbmRleElkc1RvRGVsZXRlLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleE1hcCwgW2F0dHIsIHZhbHVlLCBpZF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXTogb3BzLmJhdGNoLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3dJZCkgPT4gcm93SWQgIT09IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdW3ZhbHVlXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXBbYXR0cl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleE1hcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IC4uLm5leHRJbmRleGVzIH1cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4ZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgW3RoaXMubWFwTmFtZV06IG5leHRNYXAsXG4gICAgICAgICAgICAgICAgaW5kZXhlczogbmV4dEluZGV4ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnJhbmNoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCByb3dzIGByb3dzYC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHR4IC0gdHJhbnNhY3Rpb24gaW5mb1xuICAgICAqIEBwYXJhbSAge09iamVjdH0gYnJhbmNoIC0gdGhlIGRhdGEgc3RydWN0dXJlIHN0YXRlXG4gICAgICogQHBhcmFtICB7T2JqZWN0W119IHJvd3MgLSByb3dzIHRvIHVwZGF0ZVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgaWRzIGluIGBpZHNUb0RlbGV0ZWAuXG4gICAgICovXG4gICAgZGVsZXRlKHR4LCBicmFuY2gsIHJvd3MpIHtcbiAgICAgICAgY29uc3QgeyBiYXRjaFRva2VuLCB3aXRoTXV0YXRpb25zIH0gPSB0eDtcblxuICAgICAgICBjb25zdCB7IGFyck5hbWUsIG1hcE5hbWUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGFyciA9IGJyYW5jaFthcnJOYW1lXTtcblxuICAgICAgICBjb25zdCBpZHNUb0RlbGV0ZSA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t0aGlzLmlkQXR0cmlidXRlXSk7XG4gICAgICAgIGlmICh3aXRoTXV0YXRpb25zKSB7XG4gICAgICAgICAgICBpZHNUb0RlbGV0ZS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGFyci5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5zcGxpY2UoaWR4LCAxLCBbXSwgYXJyKTtcbiAgICAgICAgICAgICAgICBvcHMubXV0YWJsZS5vbWl0KGlkLCBicmFuY2hbbWFwTmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBkZWxldGUgaWRzIGZyb20gYWxsIGluZGV4ZXNcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoYnJhbmNoLmluZGV4ZXMpLmZvckVhY2goKGF0dHJJbmRleCkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGF0dHJJbmRleCkuZm9yRWFjaCgodmFsdWVJbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgaWRzVG9EZWxldGUuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHZhbHVlSW5kZXguaW5kZXhPZihpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcy5tdXRhYmxlLnNwbGljZShpZHgsIDEsIFtdLCB2YWx1ZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGJyYW5jaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRJbmRleGVzID0gb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGJyYW5jaC5pbmRleGVzKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGluZGV4TWFwLCBbYXR0ciwgYXR0ckluZGV4XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbmRleE1hcFthdHRyXSA9IG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhhdHRySW5kZXgpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ckluZGV4TWFwLCBbdmFsdWUsIHZhbHVlSW5kZXhdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJJbmRleE1hcFt2YWx1ZV0gPSBvcHMuYmF0Y2guZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZCkgPT4gIWlkc1RvRGVsZXRlLmluY2x1ZGVzKGlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJJbmRleE1hcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLi4uaW5kZXhNYXBbYXR0cl0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWFwW2F0dHJdXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleE1hcDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgLi4uYnJhbmNoLmluZGV4ZXMgfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGJyYW5jaC5pbmRleGVzXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9wcy5iYXRjaC5tZXJnZShcbiAgICAgICAgICAgIGJhdGNoVG9rZW4sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgW2Fyck5hbWVdOiBvcHMuYmF0Y2guZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAoaWQpID0+ICFpZHNUb0RlbGV0ZS5pbmNsdWRlcyhpZCksXG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaFthcnJOYW1lXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgW21hcE5hbWVdOiBvcHMuYmF0Y2gub21pdChcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgaWRzVG9EZWxldGUsXG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaFttYXBOYW1lXVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaW5kZXhlczogb3BzLmJhdGNoLm1lcmdlKFxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRva2VuLFxuICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXhlcyxcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoLmluZGV4ZXNcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJyYW5jaFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFibGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/db/Table.js\n");
/***/ }),
@@ -4534,7 +4556,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Database__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Database */ \"./src/db/Database.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createDatabase\", function() { return _Database__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _Table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Table */ \"./src/db/Table.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Table\", function() { return _Table__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/**\n * @module db\n * @desc Internal implementation of data storage, fetching and optimizations.\n * @private\n */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_Database__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9pbmRleC5qcz84MTQ5Il0sIm5hbWVzIjpbImNyZWF0ZURhdGFiYXNlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7OztBQU1BO0FBQ0E7QUFFQTtBQUVlQSxnSEFBZiIsImZpbGUiOiIuL3NyYy9kYi9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBkYlxuICogQGRlc2MgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgZGF0YSBzdG9yYWdlLCBmZXRjaGluZyBhbmQgb3B0aW1pemF0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cblxuaW1wb3J0IGNyZWF0ZURhdGFiYXNlIGZyb20gXCIuL0RhdGFiYXNlXCI7XG5pbXBvcnQgVGFibGUgZnJvbSBcIi4vVGFibGVcIjtcblxuZXhwb3J0IHsgY3JlYXRlRGF0YWJhc2UsIFRhYmxlIH07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZURhdGFiYXNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/db/index.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Database__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Database */ \"./src/db/Database.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createDatabase\", function() { return _Database__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _Table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Table */ \"./src/db/Table.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Table\", function() { return _Table__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; });\n\n/**\n * @module db\n * @desc Internal implementation of data storage, fetching and optimizations.\n * @private\n */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_Database__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kYi9pbmRleC5qcz84MTQ5Il0sIm5hbWVzIjpbImNyZWF0ZURhdGFiYXNlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFZUEsZ0hBQWYiLCJmaWxlIjoiLi9zcmMvZGIvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgZGJcbiAqIEBkZXNjIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGRhdGEgc3RvcmFnZSwgZmV0Y2hpbmcgYW5kIG9wdGltaXphdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmltcG9ydCBjcmVhdGVEYXRhYmFzZSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCIuL1RhYmxlXCI7XG5cbmV4cG9ydCB7IGNyZWF0ZURhdGFiYXNlLCBUYWJsZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVEYXRhYmFzZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/db/index.js\n");
/***/ }),
@@ -4546,7 +4568,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Dat
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attrDescriptor\", function() { return attrDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forwardsManyToOneDescriptor\", function() { return forwardsManyToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forwardsOneToOneDescriptor\", function() { return forwardsOneToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"backwardsOneToOneDescriptor\", function() { return backwardsOneToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"backwardsManyToOneDescriptor\", function() { return backwardsManyToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"manyToManyDescriptor\", function() { return manyToManyDescriptor; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n/**\n * The functions in this file return custom JS property descriptors\n * that are supposed to be assigned to Model fields.\n *\n * Some include the logic to look up models using foreign keys and\n * to add or remove relationships between models.\n *\n * @module descriptors\n * @private\n */\n\n/**\n * Defines a basic non-key attribute.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n */\n\nfunction attrDescriptor(fieldName) {\n return {\n get() {\n return this._fields[fieldName];\n },\n\n set(value) {\n return this.set(fieldName, value);\n },\n\n enumerable: true,\n configurable: true\n };\n}\n/**\n * Forwards direction of a Foreign Key: returns one object.\n * Also works as {@link .forwardsOneToOneDescriptor|forwardsOneToOneDescriptor}.\n *\n * For `book.author` referencing an `Author` model instance,\n * `fieldName` would be `'author'` and `declaredToModelName` would be `'Author'`.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n * @param {string} declaredToModelName - the name of the model that the field references.\n */\n\n\nfunction forwardsManyToOneDescriptor(fieldName, declaredToModelName) {\n return {\n get() {\n const {\n session: {\n [declaredToModelName]: DeclaredToModel\n }\n } = this.getClass();\n const {\n [fieldName]: toId\n } = this._fields;\n return DeclaredToModel.withId(toId);\n },\n\n set(value) {\n this.update({\n [fieldName]: Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"])(value)\n });\n }\n\n };\n}\n/**\n * Dereferencing foreign keys in {@link module:fields.oneToOne|oneToOne}\n * relationships works the same way as in many-to-one relationships:\n * just look up the related model.\n *\n * For example, a human face tends to have a single nose.\n * So if we want to resolve `face.nose`, we need to\n * look up the `Nose` that has the primary key that `face` references.\n *\n * @see {@link module:descriptors~forwardsManyToOneDescriptor|forwardsManyToOneDescriptor}\n */\n\n\nfunction forwardsOneToOneDescriptor(...args) {\n return forwardsManyToOneDescriptor(...args);\n}\n/**\n * Here we resolve 1-to-1 relationships starting at the model on which the\n * field was not installed. This means we need to find the instance of the\n * other model whose {@link module:fields.oneToOne|oneToOne} FK field contains the current model's primary key.\n *\n * @param {string} declaredFieldName - the name of the field referencing the current model.\n * @param {string} declaredFromModelName - the name of the other model.\n */\n\n\nfunction backwardsOneToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel\n }\n } = this.getClass();\n return DeclaredFromModel.get({\n [declaredFieldName]: this.getId()\n });\n },\n\n set() {\n throw new Error(\"Can't mutate a reverse one-to-one relation.\");\n }\n\n };\n}\n/**\n * The backwards direction of a n-to-1 relationship (i.e. 1-to-n),\n * meaning this will return an a collection (`QuerySet`) of model instances.\n *\n * An example would be `author.books` referencing all instances of\n * the `Book` model that reference the author using `fk()`.\n */\n\n\nfunction backwardsManyToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel\n }\n } = this.getClass();\n return DeclaredFromModel.filter({\n [declaredFieldName]: this.getId()\n });\n },\n\n set() {\n throw new Error(\"Can't mutate a reverse many-to-one relation.\");\n }\n\n };\n}\n/**\n * This descriptor is assigned to both sides of a many-to-many relationship.\n * To indicate the backwards direction pass `true` for `reverse`.\n */\n\n\nfunction manyToManyDescriptor(declaredFromModelName, declaredToModelName, throughModelName, throughFields, reverse) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel,\n [declaredToModelName]: DeclaredToModel,\n [throughModelName]: ThroughModel\n }\n } = this.getClass();\n const ThisModel = reverse ? DeclaredToModel : DeclaredFromModel;\n const OtherModel = reverse ? DeclaredFromModel : DeclaredToModel;\n const thisReferencingField = reverse ? throughFields.to : throughFields.from;\n const otherReferencingField = reverse ? throughFields.from : throughFields.to;\n const thisId = this.getId();\n const throughQs = ThroughModel.filter({\n [thisReferencingField]: thisId\n });\n /**\n * all IDs of instances of the other model that are\n * referenced by any instance of the current model\n */\n\n const referencedOtherIds = new Set(throughQs.toRefArray().map(obj => obj[otherReferencingField]));\n /**\n * selects all instances of other model that are referenced\n * by any instance of the current model\n */\n\n const qs = OtherModel.filter(otherModelInstance => referencedOtherIds.has(otherModelInstance[OtherModel.idAttribute]));\n /**\n * Allows adding OtherModel instances to be referenced by the current instance.\n *\n * E.g. Book.first().authors.add(1, 2) would add the authors with IDs 1 and 2\n * to the first book's list of referenced authors.\n *\n * @return undefined\n */\n\n qs.add = function add(...entities) {\n const idsToAdd = new Set(entities.map(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"]));\n const existingQs = throughQs.filter(through => idsToAdd.has(through[otherReferencingField]));\n\n if (existingQs.exists()) {\n const existingIds = existingQs.toRefArray().map(through => through[otherReferencingField]);\n throw new Error(`Tried to add already existing ${OtherModel.modelName} id(s) ${existingIds} to the ${ThisModel.modelName} instance with id ${thisId}`);\n }\n\n idsToAdd.forEach(id => {\n ThroughModel.create({\n [otherReferencingField]: id,\n [thisReferencingField]: thisId\n });\n });\n };\n /**\n * Removes references to all OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.clear() would cause the first book's list\n * of referenced authors to become empty.\n *\n * @return undefined\n */\n\n\n qs.clear = function clear() {\n throughQs.delete();\n };\n /**\n * Removes references to all passed OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.remove(1, 2) would cause the authors with\n * IDs 1 and 2 to no longer be referenced by the first book.\n *\n * @return undefined\n */\n\n\n qs.remove = function remove(...entities) {\n const idsToRemove = new Set(entities.map(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"]));\n const entitiesToDelete = throughQs.filter(through => idsToRemove.has(through[otherReferencingField]));\n\n if (entitiesToDelete.count() !== idsToRemove.size) {\n // Tried deleting non-existing entities.\n const entitiesToDeleteIds = entitiesToDelete.toRefArray().map(through => through[otherReferencingField]);\n const unexistingIds = [...idsToRemove].filter(id => !entitiesToDeleteIds.includes(id));\n throw new Error(`Tried to delete non-existing ${OtherModel.modelName} id(s) ${unexistingIds} from the ${ThisModel.modelName} instance with id ${thisId}`);\n }\n\n entitiesToDelete.delete();\n };\n\n return qs;\n },\n\n set() {\n throw new Error(\"Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.\");\n }\n\n };\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kZXNjcmlwdG9ycy5qcz8zZDUxIl0sIm5hbWVzIjpbImF0dHJEZXNjcmlwdG9yIiwiZmllbGROYW1lIiwiZ2V0IiwiX2ZpZWxkcyIsInNldCIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImZvcndhcmRzTWFueVRvT25lRGVzY3JpcHRvciIsImRlY2xhcmVkVG9Nb2RlbE5hbWUiLCJzZXNzaW9uIiwiRGVjbGFyZWRUb01vZGVsIiwiZ2V0Q2xhc3MiLCJ0b0lkIiwid2l0aElkIiwidXBkYXRlIiwibm9ybWFsaXplRW50aXR5IiwiZm9yd2FyZHNPbmVUb09uZURlc2NyaXB0b3IiLCJhcmdzIiwiYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yIiwiZGVjbGFyZWRGaWVsZE5hbWUiLCJkZWNsYXJlZEZyb21Nb2RlbE5hbWUiLCJEZWNsYXJlZEZyb21Nb2RlbCIsImdldElkIiwiRXJyb3IiLCJiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yIiwiZmlsdGVyIiwibWFueVRvTWFueURlc2NyaXB0b3IiLCJ0aHJvdWdoTW9kZWxOYW1lIiwidGhyb3VnaEZpZWxkcyIsInJldmVyc2UiLCJUaHJvdWdoTW9kZWwiLCJUaGlzTW9kZWwiLCJPdGhlck1vZGVsIiwidGhpc1JlZmVyZW5jaW5nRmllbGQiLCJ0byIsImZyb20iLCJvdGhlclJlZmVyZW5jaW5nRmllbGQiLCJ0aGlzSWQiLCJ0aHJvdWdoUXMiLCJyZWZlcmVuY2VkT3RoZXJJZHMiLCJTZXQiLCJ0b1JlZkFycmF5IiwibWFwIiwib2JqIiwicXMiLCJvdGhlck1vZGVsSW5zdGFuY2UiLCJoYXMiLCJpZEF0dHJpYnV0ZSIsImFkZCIsImVudGl0aWVzIiwiaWRzVG9BZGQiLCJleGlzdGluZ1FzIiwidGhyb3VnaCIsImV4aXN0cyIsImV4aXN0aW5nSWRzIiwibW9kZWxOYW1lIiwiZm9yRWFjaCIsImlkIiwiY3JlYXRlIiwiY2xlYXIiLCJkZWxldGUiLCJyZW1vdmUiLCJpZHNUb1JlbW92ZSIsImVudGl0aWVzVG9EZWxldGUiLCJjb3VudCIsInNpemUiLCJlbnRpdGllc1RvRGVsZXRlSWRzIiwidW5leGlzdGluZ0lkcyIsImluY2x1ZGVzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7QUFXQTs7Ozs7QUFJQSxTQUFTQSxjQUFULENBQXdCQyxTQUF4QixFQUFtQztBQUMvQixTQUFPO0FBQ0hDLE9BQUcsR0FBRztBQUNGLGFBQU8sS0FBS0MsT0FBTCxDQUFhRixTQUFiLENBQVA7QUFDSCxLQUhFOztBQUtIRyxPQUFHLENBQUNDLEtBQUQsRUFBUTtBQUNQLGFBQU8sS0FBS0QsR0FBTCxDQUFTSCxTQUFULEVBQW9CSSxLQUFwQixDQUFQO0FBQ0gsS0FQRTs7QUFTSEMsY0FBVSxFQUFFLElBVFQ7QUFVSEMsZ0JBQVksRUFBRTtBQVZYLEdBQVA7QUFZSDtBQUVEOzs7Ozs7Ozs7OztBQVNBLFNBQVNDLDJCQUFULENBQXFDUCxTQUFyQyxFQUFnRFEsbUJBQWhELEVBQXFFO0FBQ2pFLFNBQU87QUFDSFAsT0FBRyxHQUFHO0FBQ0YsWUFBTTtBQUNGUSxlQUFPLEVBQUU7QUFBRSxXQUFDRCxtQkFBRCxHQUF1QkU7QUFBekI7QUFEUCxVQUVGLEtBQUtDLFFBQUwsRUFGSjtBQUdBLFlBQU07QUFBRSxTQUFDWCxTQUFELEdBQWFZO0FBQWYsVUFBd0IsS0FBS1YsT0FBbkM7QUFFQSxhQUFPUSxlQUFlLENBQUNHLE1BQWhCLENBQXVCRCxJQUF2QixDQUFQO0FBQ0gsS0FSRTs7QUFTSFQsT0FBRyxDQUFDQyxLQUFELEVBQVE7QUFDUCxXQUFLVSxNQUFMLENBQVk7QUFDUixTQUFDZCxTQUFELEdBQWFlLDhEQUFlLENBQUNYLEtBQUQ7QUFEcEIsT0FBWjtBQUdIOztBQWJFLEdBQVA7QUFlSDtBQUVEOzs7Ozs7Ozs7Ozs7O0FBV0EsU0FBU1ksMEJBQVQsQ0FBb0MsR0FBR0MsSUFBdkMsRUFB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QUQsQ0FBdkIsQ0FEcUIsQ0FBekI7O0FBSUEsWUFBSTJCLGdCQUFnQixDQUFDQyxLQUFqQixPQUE2QkYsV0FBVyxDQUFDRyxJQUE3QyxFQUFtRDtBQUMvQztBQUNBLGdCQUFNQyxtQkFBbUIsR0FBR0gsZ0JBQWdCLENBQ3ZDdEIsVUFEdUIsR0FFdkJDLEdBRnVCLENBRW5CVSxPQUFPLElBQUlBLE9BQU8sQ0FBQ2hCLHFCQUFELENBRkMsQ0FBNUI7QUFJQSxnQkFBTStCLGFBQWEsR0FBRyxDQUFDLEdBQUdMLFdBQUosRUFBaUJyQyxNQUFqQixDQUNsQmdDLEVBQUUsSUFBSSxDQUFDUyxtQkFBbUIsQ0FBQ0UsUUFBcEIsQ0FBNkJYLEVBQTdCLENBRFcsQ0FBdEI7QUFJQSxnQkFBTSxJQUFJbEMsS0FBSixDQUNELGdDQUErQlMsVUFBVSxDQUFDdUIsU0FBVSxVQUFTWSxhQUFjLGFBQVlwQyxTQUFTLENBQUN3QixTQUFVLHFCQUFvQmxCLE1BQU8sRUFEckksQ0FBTjtBQUdIOztBQUVEMEIsd0JBQWdCLENBQUNILE1BQWpCO0FBQ0gsT0F2QkQ7O0FBeUJBLGFBQU9oQixFQUFQO0FBQ0gsS0EzSEU7O0FBNkhIekMsT0FBRyxHQUFHO0FBQ0YsWUFBTSxJQUFJb0IsS0FBSixDQUNGLDJGQURFLENBQU47QUFHSDs7QUFqSUUsR0FBUDtBQW1JSCIsImZpbGUiOiIuL3NyYy9kZXNjcmlwdG9ycy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgcmV0dXJuIGN1c3RvbSBKUyBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICogdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYXNzaWduZWQgdG8gTW9kZWwgZmllbGRzLlxuICpcbiAqIFNvbWUgaW5jbHVkZSB0aGUgbG9naWMgdG8gbG9vayB1cCBtb2RlbHMgdXNpbmcgZm9yZWlnbiBrZXlzIGFuZFxuICogdG8gYWRkIG9yIHJlbW92ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gbW9kZWxzLlxuICpcbiAqIEBtb2R1bGUgZGVzY3JpcHRvcnNcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgYmFzaWMgbm9uLWtleSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZpZWxkTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGFzc2lnbmVkIHRvLlxuICovXG5mdW5jdGlvbiBhdHRyRGVzY3JpcHRvcihmaWVsZE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXQoZmllbGROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH07XG59XG5cbi8qKlxuICogRm9yd2FyZHMgZGlyZWN0aW9uIG9mIGEgRm9yZWlnbiBLZXk6IHJldHVybnMgb25lIG9iamVjdC5cbiAqIEFsc28gd29ya3MgYXMge0BsaW5rIC5mb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcnxmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcn0uXG4gKlxuICogRm9yIGBib29rLmF1dGhvcmAgcmVmZXJlbmNpbmcgYW4gYEF1dGhvcmAgbW9kZWwgaW5zdGFuY2UsXG4gKiBgZmllbGROYW1lYCB3b3VsZCBiZSBgJ2F1dGhvcidgIGFuZCBgZGVjbGFyZWRUb01vZGVsTmFtZWAgd291bGQgYmUgYCdBdXRob3InYC5cbiAqIEBwYXJhbSAge3N0cmluZ30gZmllbGROYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXNzaWduZWQgdG8uXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmVkVG9Nb2RlbE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgbW9kZWwgdGhhdCB0aGUgZmllbGQgcmVmZXJlbmNlcy5cbiAqL1xuZnVuY3Rpb24gZm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgZGVjbGFyZWRUb01vZGVsTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiB7IFtkZWNsYXJlZFRvTW9kZWxOYW1lXTogRGVjbGFyZWRUb01vZGVsIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICAgICAgY29uc3QgeyBbZmllbGROYW1lXTogdG9JZCB9ID0gdGhpcy5fZmllbGRzO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVjbGFyZWRUb01vZGVsLndpdGhJZCh0b0lkKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IG5vcm1hbGl6ZUVudGl0eSh2YWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vKipcbiAqIERlcmVmZXJlbmNpbmcgZm9yZWlnbiBrZXlzIGluIHtAbGluayBtb2R1bGU6ZmllbGRzLm9uZVRvT25lfG9uZVRvT25lfVxuICogcmVsYXRpb25zaGlwcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gbWFueS10by1vbmUgcmVsYXRpb25zaGlwczpcbiAqIGp1c3QgbG9vayB1cCB0aGUgcmVsYXRlZCBtb2RlbC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSBodW1hbiBmYWNlIHRlbmRzIHRvIGhhdmUgYSBzaW5nbGUgbm9zZS5cbiAqIFNvIGlmIHdlIHdhbnQgdG8gcmVzb2x2ZSBgZmFjZS5ub3NlYCwgd2UgbmVlZCB0b1xuICogbG9vayB1cCB0aGUgYE5vc2VgIHRoYXQgaGFzIHRoZSBwcmltYXJ5IGtleSB0aGF0IGBmYWNlYCByZWZlcmVuY2VzLlxuICpcbiAqIEBzZWUge0BsaW5rIG1vZHVsZTpkZXNjcmlwdG9yc35mb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3J8Zm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yfVxuICovXG5mdW5jdGlvbiBmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvciguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGZvcndhcmRzTWFueVRvT25lRGVzY3JpcHRvciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBIZXJlIHdlIHJlc29sdmUgMS10by0xIHJlbGF0aW9uc2hpcHMgc3RhcnRpbmcgYXQgdGhlIG1vZGVsIG9uIHdoaWNoIHRoZVxuICogZmllbGQgd2FzIG5vdCBpbnN0YWxsZWQuIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBmaW5kIHRoZSBpbnN0YW5jZSBvZiB0aGVcbiAqIG90aGVyIG1vZGVsIHdob3NlIHtAbGluayBtb2R1bGU6ZmllbGRzLm9uZVRvT25lfG9uZVRvT25lfSBGSyBmaWVsZCBjb250YWlucyB0aGUgY3VycmVudCBtb2RlbCdzIHByaW1hcnkga2V5LlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZGVjbGFyZWRGaWVsZE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmllbGQgcmVmZXJlbmNpbmcgdGhlIGN1cnJlbnQgbW9kZWwuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmVkRnJvbU1vZGVsTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvdGhlciBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yKGRlY2xhcmVkRmllbGROYW1lLCBkZWNsYXJlZEZyb21Nb2RlbE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbjogeyBbZGVjbGFyZWRGcm9tTW9kZWxOYW1lXTogRGVjbGFyZWRGcm9tTW9kZWwgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmdldENsYXNzKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBEZWNsYXJlZEZyb21Nb2RlbC5nZXQoe1xuICAgICAgICAgICAgICAgIFtkZWNsYXJlZEZpZWxkTmFtZV06IHRoaXMuZ2V0SWQoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtdXRhdGUgYSByZXZlcnNlIG9uZS10by1vbmUgcmVsYXRpb24uXCIpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8qKlxuICogVGhlIGJhY2t3YXJkcyBkaXJlY3Rpb24gb2YgYSBuLXRvLTEgcmVsYXRpb25zaGlwIChpLmUuIDEtdG8tbiksXG4gKiBtZWFuaW5nIHRoaXMgd2lsbCByZXR1cm4gYW4gYSBjb2xsZWN0aW9uIChgUXVlcnlTZXRgKSBvZiBtb2RlbCBpbnN0YW5jZXMuXG4gKlxuICogQW4gZXhhbXBsZSB3b3VsZCBiZSBgYXV0aG9yLmJvb2tzYCByZWZlcmVuY2luZyBhbGwgaW5zdGFuY2VzIG9mXG4gKiB0aGUgYEJvb2tgIG1vZGVsIHRoYXQgcmVmZXJlbmNlIHRoZSBhdXRob3IgdXNpbmcgYGZrKClgLlxuICovXG5mdW5jdGlvbiBiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKFxuICAgIGRlY2xhcmVkRmllbGROYW1lLFxuICAgIGRlY2xhcmVkRnJvbU1vZGVsTmFtZVxuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNlc3Npb246IHsgW2RlY2xhcmVkRnJvbU1vZGVsTmFtZV06IERlY2xhcmVkRnJvbU1vZGVsIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5nZXRDbGFzcygpO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVjbGFyZWRGcm9tTW9kZWwuZmlsdGVyKHtcbiAgICAgICAgICAgICAgICBbZGVjbGFyZWRGaWVsZE5hbWVdOiB0aGlzLmdldElkKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbXV0YXRlIGEgcmV2ZXJzZSBtYW55LXRvLW9uZSByZWxhdGlvbi5cIik7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGRlc2NyaXB0b3IgaXMgYXNzaWduZWQgdG8gYm90aCBzaWRlcyBvZiBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuXG4gKiBUbyBpbmRpY2F0ZSB0aGUgYmFja3dhcmRzIGRpcmVjdGlvbiBwYXNzIGB0cnVlYCBmb3IgYHJldmVyc2VgLlxuICovXG5mdW5jdGlvbiBtYW55VG9NYW55RGVzY3JpcHRvcihcbiAgICBkZWNsYXJlZEZyb21Nb2RlbE5hbWUsXG4gICAgZGVjbGFyZWRUb01vZGVsTmFtZSxcbiAgICB0aHJvdWdoTW9kZWxOYW1lLFxuICAgIHRocm91Z2hGaWVsZHMsXG4gICAgcmV2ZXJzZVxuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICAgICAgICAgICAgW2RlY2xhcmVkRnJvbU1vZGVsTmFtZV06IERlY2xhcmVkRnJvbU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBbZGVjbGFyZWRUb01vZGVsTmFtZV06IERlY2xhcmVkVG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgW3Rocm91Z2hNb2RlbE5hbWVdOiBUaHJvdWdoTW9kZWwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmdldENsYXNzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHJldmVyc2UgPyBEZWNsYXJlZFRvTW9kZWwgOiBEZWNsYXJlZEZyb21Nb2RlbDtcbiAgICAgICAgICAgIGNvbnN0IE90aGVyTW9kZWwgPSByZXZlcnNlID8gRGVjbGFyZWRGcm9tTW9kZWwgOiBEZWNsYXJlZFRvTW9kZWw7XG5cbiAgICAgICAgICAgIGNvbnN0IHRoaXNSZWZlcmVuY2luZ0ZpZWxkID0gcmV2ZXJzZVxuICAgICAgICAgICAgICAgID8gdGhyb3VnaEZpZWxkcy50b1xuICAgICAgICAgICAgICAgIDogdGhyb3VnaEZpZWxkcy5mcm9tO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJSZWZlcmVuY2luZ0ZpZWxkID0gcmV2ZXJzZVxuICAgICAgICAgICAgICAgID8gdGhyb3VnaEZpZWxkcy5mcm9tXG4gICAgICAgICAgICAgICAgOiB0aHJvdWdoRmllbGRzLnRvO1xuXG4gICAgICAgICAgICBjb25zdCB0aGlzSWQgPSB0aGlzLmdldElkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRocm91Z2hRcyA9IFRocm91Z2hNb2RlbC5maWx0ZXIoe1xuICAgICAgICAgICAgICAgIFt0aGlzUmVmZXJlbmNpbmdGaWVsZF06IHRoaXNJZCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFsbCBJRHMgb2YgaW5zdGFuY2VzIG9mIHRoZSBvdGhlciBtb2RlbCB0aGF0IGFyZVxuICAgICAgICAgICAgICogcmVmZXJlbmNlZCBieSBhbnkgaW5zdGFuY2Ugb2YgdGhlIGN1cnJlbnQgbW9kZWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlZE90aGVySWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICB0aHJvdWdoUXMudG9SZWZBcnJheSgpLm1hcChvYmogPT4gb2JqW290aGVyUmVmZXJlbmNpbmdGaWVsZF0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHNlbGVjdHMgYWxsIGluc3RhbmNlcyBvZiBvdGhlciBtb2RlbCB0aGF0IGFyZSByZWZlcmVuY2VkXG4gICAgICAgICAgICAgKiBieSBhbnkgaW5zdGFuY2Ugb2YgdGhlIGN1cnJlbnQgbW9kZWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgcXMgPSBPdGhlck1vZGVsLmZpbHRlcihvdGhlck1vZGVsSW5zdGFuY2UgPT5cbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkT3RoZXJJZHMuaGFzKFxuICAgICAgICAgICAgICAgICAgICBvdGhlck1vZGVsSW5zdGFuY2VbT3RoZXJNb2RlbC5pZEF0dHJpYnV0ZV1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEFsbG93cyBhZGRpbmcgT3RoZXJNb2RlbCBpbnN0YW5jZXMgdG8gYmUgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBFLmcuIEJvb2suZmlyc3QoKS5hdXRob3JzLmFkZCgxLCAyKSB3b3VsZCBhZGQgdGhlIGF1dGhvcnMgd2l0aCBJRHMgMSBhbmQgMlxuICAgICAgICAgICAgICogdG8gdGhlIGZpcnN0IGJvb2sncyBsaXN0IG9mIHJlZmVyZW5jZWQgYXV0aG9ycy5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBxcy5hZGQgPSBmdW5jdGlvbiBhZGQoLi4uZW50aXRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHNUb0FkZCA9IG5ldyBTZXQoZW50aXRpZXMubWFwKG5vcm1hbGl6ZUVudGl0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdRcyA9IHRocm91Z2hRcy5maWx0ZXIodGhyb3VnaCA9PlxuICAgICAgICAgICAgICAgICAgICBpZHNUb0FkZC5oYXModGhyb3VnaFtvdGhlclJlZmVyZW5jaW5nRmllbGRdKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdRcy5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IGV4aXN0aW5nUXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JlZkFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGhyb3VnaCA9PiB0aHJvdWdoW290aGVyUmVmZXJlbmNpbmdGaWVsZF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBhZGQgYWxyZWFkeSBleGlzdGluZyAke090aGVyTW9kZWwubW9kZWxOYW1lfSBpZChzKSAke2V4aXN0aW5nSWRzfSB0byB0aGUgJHtUaGlzTW9kZWwubW9kZWxOYW1lfSBpbnN0YW5jZSB3aXRoIGlkICR7dGhpc0lkfWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZHNUb0FkZC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgVGhyb3VnaE1vZGVsLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBbb3RoZXJSZWZlcmVuY2luZ0ZpZWxkXTogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGhpc1JlZmVyZW5jaW5nRmllbGRdOiB0aGlzSWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZW1vdmVzIHJlZmVyZW5jZXMgdG8gYWxsIE90aGVyTW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogRS5nLiBCb29rLmZpcnN0KCkuYXV0aG9ycy5jbGVhcigpIHdvdWxkIGNhdXNlIHRoZSBmaXJzdCBib29rJ3MgbGlzdFxuICAgICAgICAgICAgICogb2YgcmVmZXJlbmNlZCBhdXRob3JzIHRvIGJlY29tZSBlbXB0eS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBxcy5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICAgICAgICAgIHRocm91Z2hRcy5kZWxldGUoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVtb3ZlcyByZWZlcmVuY2VzIHRvIGFsbCBwYXNzZWQgT3RoZXJNb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgY3VycmVudCBtb2RlbC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBFLmcuIEJvb2suZmlyc3QoKS5hdXRob3JzLnJlbW92ZSgxLCAyKSB3b3VsZCBjYXVzZSB0aGUgYXV0aG9ycyB3aXRoXG4gICAgICAgICAgICAgKiBJRHMgMSBhbmQgMiB0byBubyBsb25nZXIgYmUgcmVmZXJlbmNlZCBieSB0aGUgZmlyc3QgYm9vay5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBxcy5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoLi4uZW50aXRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHNUb1JlbW92ZSA9IG5ldyBTZXQoZW50aXRpZXMubWFwKG5vcm1hbGl6ZUVudGl0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZW50aXRpZXNUb0RlbGV0ZSA9IHRocm91Z2hRcy5maWx0ZXIodGhyb3VnaCA9PlxuICAgICAgICAgICAgICAgICAgICBpZHNUb1JlbW92ZS5oYXModGhyb3VnaFtvdGhlclJlZmVyZW5jaW5nRmllbGRdKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXNUb0RlbGV0ZS5jb3VudCgpICE9PSBpZHNUb1JlbW92ZS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyaWVkIGRlbGV0aW5nIG5vbi1leGlzdGluZyBlbnRpdGllcy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXRpZXNUb0RlbGV0ZUlkcyA9IGVudGl0aWVzVG9EZWxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JlZkFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGhyb3VnaCA9PiB0aHJvdWdoW290aGVyUmVmZXJlbmNpbmdGaWVsZF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuZXhpc3RpbmdJZHMgPSBbLi4uaWRzVG9SZW1vdmVdLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0+ICFlbnRpdGllc1RvRGVsZXRlSWRzLmluY2x1ZGVzKGlkKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUcmllZCB0byBkZWxldGUgbm9uLWV4aXN0aW5nICR7T3RoZXJNb2RlbC5tb2RlbE5hbWV9IGlkKHMpICR7dW5leGlzdGluZ0lkc30gZnJvbSB0aGUgJHtUaGlzTW9kZWwubW9kZWxOYW1lfSBpbnN0YW5jZSB3aXRoIGlkICR7dGhpc0lkfWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbnRpdGllc1RvRGVsZXRlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHFzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldCgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRyaWVkIHNldHRpbmcgYSBNMk0gZmllbGQuIFBsZWFzZSB1c2UgdGhlIHJlbGF0ZWQgUXVlcnlTZXQgbWV0aG9kcyBhZGQsIHJlbW92ZSBhbmQgY2xlYXIuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZXhwb3J0IHtcbiAgICBhdHRyRGVzY3JpcHRvcixcbiAgICBmb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3IsXG4gICAgZm9yd2FyZHNPbmVUb09uZURlc2NyaXB0b3IsXG4gICAgYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yLFxuICAgIGJhY2t3YXJkc01hbnlUb09uZURlc2NyaXB0b3IsXG4gICAgbWFueVRvTWFueURlc2NyaXB0b3IsXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/descriptors.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attrDescriptor\", function() { return attrDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forwardsManyToOneDescriptor\", function() { return forwardsManyToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forwardsOneToOneDescriptor\", function() { return forwardsOneToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"backwardsOneToOneDescriptor\", function() { return backwardsOneToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"backwardsManyToOneDescriptor\", function() { return backwardsManyToOneDescriptor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"manyToManyDescriptor\", function() { return manyToManyDescriptor; });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./src/utils.js\");\n\n/**\n * The functions in this file return custom JS property descriptors\n * that are supposed to be assigned to Model fields.\n *\n * Some include the logic to look up models using foreign keys and\n * to add or remove relationships between models.\n *\n * @module descriptors\n * @private\n */\n\n/**\n * Defines a basic non-key attribute.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n */\n\nfunction attrDescriptor(fieldName) {\n return {\n get() {\n return this._fields[fieldName];\n },\n\n set(value) {\n return this.set(fieldName, value);\n },\n\n enumerable: true,\n configurable: true\n };\n}\n/**\n * Forwards direction of a Foreign Key: returns one object.\n * Also works as {@link .forwardsOneToOneDescriptor|forwardsOneToOneDescriptor}.\n *\n * For `book.author` referencing an `Author` model instance,\n * `fieldName` would be `'author'` and `declaredToModelName` would be `'Author'`.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n * @param {string} declaredToModelName - the name of the model that the field references.\n */\n\n\nfunction forwardsManyToOneDescriptor(fieldName, declaredToModelName) {\n return {\n get() {\n const {\n session: {\n [declaredToModelName]: DeclaredToModel\n }\n } = this.getClass();\n const {\n [fieldName]: toId\n } = this._fields;\n return DeclaredToModel.withId(toId);\n },\n\n set(value) {\n this.update({\n [fieldName]: Object(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"])(value)\n });\n }\n\n };\n}\n/**\n * Dereferencing foreign keys in {@link module:fields.oneToOne|oneToOne}\n * relationships works the same way as in many-to-one relationships:\n * just look up the related model.\n *\n * For example, a human face tends to have a single nose.\n * So if we want to resolve `face.nose`, we need to\n * look up the `Nose` that has the primary key that `face` references.\n *\n * @see {@link module:descriptors~forwardsManyToOneDescriptor|forwardsManyToOneDescriptor}\n */\n\n\nfunction forwardsOneToOneDescriptor(...args) {\n return forwardsManyToOneDescriptor(...args);\n}\n/**\n * Here we resolve 1-to-1 relationships starting at the model on which the\n * field was not installed. This means we need to find the instance of the\n * other model whose {@link module:fields.oneToOne|oneToOne} FK field contains the current model's primary key.\n *\n * @param {string} declaredFieldName - the name of the field referencing the current model.\n * @param {string} declaredFromModelName - the name of the other model.\n */\n\n\nfunction backwardsOneToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel\n }\n } = this.getClass();\n return DeclaredFromModel.get({\n [declaredFieldName]: this.getId()\n });\n },\n\n set() {\n throw new Error(\"Can't mutate a reverse one-to-one relation.\");\n }\n\n };\n}\n/**\n * The backwards direction of a n-to-1 relationship (i.e. 1-to-n),\n * meaning this will return an a collection (`QuerySet`) of model instances.\n *\n * An example would be `author.books` referencing all instances of\n * the `Book` model that reference the author using `fk()`.\n */\n\n\nfunction backwardsManyToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel\n }\n } = this.getClass();\n return DeclaredFromModel.filter({\n [declaredFieldName]: this.getId()\n });\n },\n\n set() {\n throw new Error(\"Can't mutate a reverse many-to-one relation.\");\n }\n\n };\n}\n/**\n * This descriptor is assigned to both sides of a many-to-many relationship.\n * To indicate the backwards direction pass `true` for `reverse`.\n */\n\n\nfunction manyToManyDescriptor(declaredFromModelName, declaredToModelName, throughModelName, throughFields, reverse) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel,\n [declaredToModelName]: DeclaredToModel,\n [throughModelName]: ThroughModel\n }\n } = this.getClass();\n const ThisModel = reverse ? DeclaredToModel : DeclaredFromModel;\n const OtherModel = reverse ? DeclaredFromModel : DeclaredToModel;\n const thisReferencingField = reverse ? throughFields.to : throughFields.from;\n const otherReferencingField = reverse ? throughFields.from : throughFields.to;\n const thisId = this.getId();\n const throughQs = ThroughModel.filter({\n [thisReferencingField]: thisId\n });\n /**\n * all IDs of instances of the other model that are\n * referenced by any instance of the current model\n */\n\n const referencedOtherIds = new Set(throughQs.toRefArray().map(obj => obj[otherReferencingField]));\n /**\n * selects all instances of other model that are referenced\n * by any instance of the current model\n */\n\n const qs = OtherModel.filter(otherModelInstance => referencedOtherIds.has(otherModelInstance[OtherModel.idAttribute]));\n /**\n * Allows adding OtherModel instances to be referenced by the current instance.\n *\n * E.g. Book.first().authors.add(1, 2) would add the authors with IDs 1 and 2\n * to the first book's list of referenced authors.\n *\n * @return undefined\n */\n\n qs.add = function add(...entities) {\n const idsToAdd = new Set(entities.map(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"]));\n const existingQs = throughQs.filter(through => idsToAdd.has(through[otherReferencingField]));\n\n if (existingQs.exists()) {\n const existingIds = existingQs.toRefArray().map(through => through[otherReferencingField]);\n throw new Error(`Tried to add already existing ${OtherModel.modelName} id(s) ${existingIds} to the ${ThisModel.modelName} instance with id ${thisId}`);\n }\n\n idsToAdd.forEach(id => {\n ThroughModel.create({\n [otherReferencingField]: id,\n [thisReferencingField]: thisId\n });\n });\n };\n /**\n * Removes references to all OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.clear() would cause the first book's list\n * of referenced authors to become empty.\n *\n * @return undefined\n */\n\n\n qs.clear = function clear() {\n throughQs.delete();\n };\n /**\n * Removes references to all passed OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.remove(1, 2) would cause the authors with\n * IDs 1 and 2 to no longer be referenced by the first book.\n *\n * @return undefined\n */\n\n\n qs.remove = function remove(...entities) {\n const idsToRemove = new Set(entities.map(_utils__WEBPACK_IMPORTED_MODULE_0__[\"normalizeEntity\"]));\n const entitiesToDelete = throughQs.filter(through => idsToRemove.has(through[otherReferencingField]));\n\n if (entitiesToDelete.count() !== idsToRemove.size) {\n // Tried deleting non-existing entities.\n const entitiesToDeleteIds = entitiesToDelete.toRefArray().map(through => through[otherReferencingField]);\n const unexistingIds = [...idsToRemove].filter(id => !entitiesToDeleteIds.includes(id));\n throw new Error(`Tried to delete non-existing ${OtherModel.modelName} id(s) ${unexistingIds} from the ${ThisModel.modelName} instance with id ${thisId}`);\n }\n\n entitiesToDelete.delete();\n };\n\n return qs;\n },\n\n set() {\n throw new Error(\"Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.\");\n }\n\n };\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9kZXNjcmlwdG9ycy5qcz8zZDUxIl0sIm5hbWVzIjpbImF0dHJEZXNjcmlwdG9yIiwiZmllbGROYW1lIiwiZ2V0IiwiX2ZpZWxkcyIsInNldCIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImZvcndhcmRzTWFueVRvT25lRGVzY3JpcHRvciIsImRlY2xhcmVkVG9Nb2RlbE5hbWUiLCJzZXNzaW9uIiwiRGVjbGFyZWRUb01vZGVsIiwiZ2V0Q2xhc3MiLCJ0b0lkIiwid2l0aElkIiwidXBkYXRlIiwibm9ybWFsaXplRW50aXR5IiwiZm9yd2FyZHNPbmVUb09uZURlc2NyaXB0b3IiLCJhcmdzIiwiYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yIiwiZGVjbGFyZWRGaWVsZE5hbWUiLCJkZWNsYXJlZEZyb21Nb2RlbE5hbWUiLCJEZWNsYXJlZEZyb21Nb2RlbCIsImdldElkIiwiRXJyb3IiLCJiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yIiwiZmlsdGVyIiwibWFueVRvTWFueURlc2NyaXB0b3IiLCJ0aHJvdWdoTW9kZWxOYW1lIiwidGhyb3VnaEZpZWxkcyIsInJldmVyc2UiLCJUaHJvdWdoTW9kZWwiLCJUaGlzTW9kZWwiLCJPdGhlck1vZGVsIiwidGhpc1JlZmVyZW5jaW5nRmllbGQiLCJ0byIsImZyb20iLCJvdGhlclJlZmVyZW5jaW5nRmllbGQiLCJ0aGlzSWQiLCJ0aHJvdWdoUXMiLCJyZWZlcmVuY2VkT3RoZXJJZHMiLCJTZXQiLCJ0b1JlZkFycmF5IiwibWFwIiwib2JqIiwicXMiLCJvdGhlck1vZGVsSW5zdGFuY2UiLCJoYXMiLCJpZEF0dHJpYnV0ZSIsImFkZCIsImVudGl0aWVzIiwiaWRzVG9BZGQiLCJleGlzdGluZ1FzIiwidGhyb3VnaCIsImV4aXN0cyIsImV4aXN0aW5nSWRzIiwibW9kZWxOYW1lIiwiZm9yRWFjaCIsImlkIiwiY3JlYXRlIiwiY2xlYXIiLCJkZWxldGUiLCJyZW1vdmUiLCJpZHNUb1JlbW92ZSIsImVudGl0aWVzVG9EZWxldGUiLCJjb3VudCIsInNpemUiLCJlbnRpdGllc1RvRGVsZXRlSWRzIiwidW5leGlzdGluZ0lkcyIsImluY2x1ZGVzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxTQUFTQSxjQUFULENBQXdCQyxTQUF4QixFQUFtQztBQUMvQixTQUFPO0FBQ0hDLE9BQUcsR0FBRztBQUNGLGFBQU8sS0FBS0MsT0FBTCxDQUFhRixTQUFiLENBQVA7QUFDSCxLQUhFOztBQUtIRyxPQUFHLENBQUNDLEtBQUQsRUFBUTtBQUNQLGFBQU8sS0FBS0QsR0FBTCxDQUFTSCxTQUFULEVBQW9CSSxLQUFwQixDQUFQO0FBQ0gsS0FQRTs7QUFTSEMsY0FBVSxFQUFFLElBVFQ7QUFVSEMsZ0JBQVksRUFBRTtBQVZYLEdBQVA7QUFZSDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0MsMkJBQVQsQ0FBcUNQLFNBQXJDLEVBQWdEUSxtQkFBaEQsRUFBcUU7QUFDakUsU0FBTztBQUNIUCxPQUFHLEdBQUc7QUFDRixZQUFNO0FBQ0ZRLGVBQU8sRUFBRTtBQUFFLFdBQUNELG1CQUFELEdBQXVCRTtBQUF6QjtBQURQLFVBRUYsS0FBS0MsUUFBTCxFQUZKO0FBR0EsWUFBTTtBQUFFLFNBQUNYLFNBQUQsR0FBYVk7QUFBZixVQUF3QixLQUFLVixPQUFuQztBQUVBLGFBQU9RLGVBQWUsQ0FBQ0csTUFBaEIsQ0FBdUJELElBQXZCLENBQVA7QUFDSCxLQVJFOztBQVNIVCxPQUFHLENBQUNDLEtBQUQsRUFBUTtBQUNQLFdBQUtVLE1BQUwsQ0FBWTtBQUNSLFNBQUNkLFNBQUQsR0FBYWUsOERBQWUsQ0FBQ1gsS0FBRDtBQURwQixP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cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vcm1hbGl6ZUVudGl0eSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgcmV0dXJuIGN1c3RvbSBKUyBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICogdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYXNzaWduZWQgdG8gTW9kZWwgZmllbGRzLlxuICpcbiAqIFNvbWUgaW5jbHVkZSB0aGUgbG9naWMgdG8gbG9vayB1cCBtb2RlbHMgdXNpbmcgZm9yZWlnbiBrZXlzIGFuZFxuICogdG8gYWRkIG9yIHJlbW92ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gbW9kZWxzLlxuICpcbiAqIEBtb2R1bGUgZGVzY3JpcHRvcnNcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgYmFzaWMgbm9uLWtleSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZpZWxkTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGFzc2lnbmVkIHRvLlxuICovXG5mdW5jdGlvbiBhdHRyRGVzY3JpcHRvcihmaWVsZE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXQoZmllbGROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH07XG59XG5cbi8qKlxuICogRm9yd2FyZHMgZGlyZWN0aW9uIG9mIGEgRm9yZWlnbiBLZXk6IHJldHVybnMgb25lIG9iamVjdC5cbiAqIEFsc28gd29ya3MgYXMge0BsaW5rIC5mb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcnxmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcn0uXG4gKlxuICogRm9yIGBib29rLmF1dGhvcmAgcmVmZXJlbmNpbmcgYW4gYEF1dGhvcmAgbW9kZWwgaW5zdGFuY2UsXG4gKiBgZmllbGROYW1lYCB3b3VsZCBiZSBgJ2F1dGhvcidgIGFuZCBgZGVjbGFyZWRUb01vZGVsTmFtZWAgd291bGQgYmUgYCdBdXRob3InYC5cbiAqIEBwYXJhbSAge3N0cmluZ30gZmllbGROYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXNzaWduZWQgdG8uXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmVkVG9Nb2RlbE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgbW9kZWwgdGhhdCB0aGUgZmllbGQgcmVmZXJlbmNlcy5cbiAqL1xuZnVuY3Rpb24gZm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgZGVjbGFyZWRUb01vZGVsTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uOiB7IFtkZWNsYXJlZFRvTW9kZWxOYW1lXTogRGVjbGFyZWRUb01vZGVsIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICAgICAgY29uc3QgeyBbZmllbGROYW1lXTogdG9JZCB9ID0gdGhpcy5fZmllbGRzO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVjbGFyZWRUb01vZGVsLndpdGhJZCh0b0lkKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IG5vcm1hbGl6ZUVudGl0eSh2YWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vKipcbiAqIERlcmVmZXJlbmNpbmcgZm9yZWlnbiBrZXlzIGluIHtAbGluayBtb2R1bGU6ZmllbGRzLm9uZVRvT25lfG9uZVRvT25lfVxuICogcmVsYXRpb25zaGlwcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gbWFueS10by1vbmUgcmVsYXRpb25zaGlwczpcbiAqIGp1c3QgbG9vayB1cCB0aGUgcmVsYXRlZCBtb2RlbC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSBodW1hbiBmYWNlIHRlbmRzIHRvIGhhdmUgYSBzaW5nbGUgbm9zZS5cbiAqIFNvIGlmIHdlIHdhbnQgdG8gcmVzb2x2ZSBgZmFjZS5ub3NlYCwgd2UgbmVlZCB0b1xuICogbG9vayB1cCB0aGUgYE5vc2VgIHRoYXQgaGFzIHRoZSBwcmltYXJ5IGtleSB0aGF0IGBmYWNlYCByZWZlcmVuY2VzLlxuICpcbiAqIEBzZWUge0BsaW5rIG1vZHVsZTpkZXNjcmlwdG9yc35mb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3J8Zm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yfVxuICovXG5mdW5jdGlvbiBmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvciguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGZvcndhcmRzTWFueVRvT25lRGVzY3JpcHRvciguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBIZXJlIHdlIHJlc29sdmUgMS10by0xIHJlbGF0aW9uc2hpcHMgc3RhcnRpbmcgYXQgdGhlIG1vZGVsIG9uIHdoaWNoIHRoZVxuICogZmllbGQgd2FzIG5vdCBpbnN0YWxsZWQuIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBmaW5kIHRoZSBpbnN0YW5jZSBvZiB0aGVcbiAqIG90aGVyIG1vZGVsIHdob3NlIHtAbGluayBtb2R1bGU6ZmllbGRzLm9uZVRvT25lfG9uZVRvT25lfSBGSyBmaWVsZCBjb250YWlucyB0aGUgY3VycmVudCBtb2RlbCdzIHByaW1hcnkga2V5LlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZGVjbGFyZWRGaWVsZE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmllbGQgcmVmZXJlbmNpbmcgdGhlIGN1cnJlbnQgbW9kZWwuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmVkRnJvbU1vZGVsTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvdGhlciBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yKGRlY2xhcmVkRmllbGROYW1lLCBkZWNsYXJlZEZyb21Nb2RlbE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbjogeyBbZGVjbGFyZWRGcm9tTW9kZWxOYW1lXTogRGVjbGFyZWRGcm9tTW9kZWwgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmdldENsYXNzKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBEZWNsYXJlZEZyb21Nb2RlbC5nZXQoe1xuICAgICAgICAgICAgICAgIFtkZWNsYXJlZEZpZWxkTmFtZV06IHRoaXMuZ2V0SWQoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtdXRhdGUgYSByZXZlcnNlIG9uZS10by1vbmUgcmVsYXRpb24uXCIpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8qKlxuICogVGhlIGJhY2t3YXJkcyBkaXJlY3Rpb24gb2YgYSBuLXRvLTEgcmVsYXRpb25zaGlwIChpLmUuIDEtdG8tbiksXG4gKiBtZWFuaW5nIHRoaXMgd2lsbCByZXR1cm4gYW4gYSBjb2xsZWN0aW9uIChgUXVlcnlTZXRgKSBvZiBtb2RlbCBpbnN0YW5jZXMuXG4gKlxuICogQW4gZXhhbXBsZSB3b3VsZCBiZSBgYXV0aG9yLmJvb2tzYCByZWZlcmVuY2luZyBhbGwgaW5zdGFuY2VzIG9mXG4gKiB0aGUgYEJvb2tgIG1vZGVsIHRoYXQgcmVmZXJlbmNlIHRoZSBhdXRob3IgdXNpbmcgYGZrKClgLlxuICovXG5mdW5jdGlvbiBiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKFxuICAgIGRlY2xhcmVkRmllbGROYW1lLFxuICAgIGRlY2xhcmVkRnJvbU1vZGVsTmFtZVxuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNlc3Npb246IHsgW2RlY2xhcmVkRnJvbU1vZGVsTmFtZV06IERlY2xhcmVkRnJvbU1vZGVsIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5nZXRDbGFzcygpO1xuXG4gICAgICAgICAgICByZXR1cm4gRGVjbGFyZWRGcm9tTW9kZWwuZmlsdGVyKHtcbiAgICAgICAgICAgICAgICBbZGVjbGFyZWRGaWVsZE5hbWVdOiB0aGlzLmdldElkKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbXV0YXRlIGEgcmV2ZXJzZSBtYW55LXRvLW9uZSByZWxhdGlvbi5cIik7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGRlc2NyaXB0b3IgaXMgYXNzaWduZWQgdG8gYm90aCBzaWRlcyBvZiBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuXG4gKiBUbyBpbmRpY2F0ZSB0aGUgYmFja3dhcmRzIGRpcmVjdGlvbiBwYXNzIGB0cnVlYCBmb3IgYHJldmVyc2VgLlxuICovXG5mdW5jdGlvbiBtYW55VG9NYW55RGVzY3JpcHRvcihcbiAgICBkZWNsYXJlZEZyb21Nb2RlbE5hbWUsXG4gICAgZGVjbGFyZWRUb01vZGVsTmFtZSxcbiAgICB0aHJvdWdoTW9kZWxOYW1lLFxuICAgIHRocm91Z2hGaWVsZHMsXG4gICAgcmV2ZXJzZVxuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNlc3Npb246IHtcbiAgICAgICAgICAgICAgICAgICAgW2RlY2xhcmVkRnJvbU1vZGVsTmFtZV06IERlY2xhcmVkRnJvbU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBbZGVjbGFyZWRUb01vZGVsTmFtZV06IERlY2xhcmVkVG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgW3Rocm91Z2hNb2RlbE5hbWVdOiBUaHJvdWdoTW9kZWwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmdldENsYXNzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IFRoaXNNb2RlbCA9IHJldmVyc2UgPyBEZWNsYXJlZFRvTW9kZWwgOiBEZWNsYXJlZEZyb21Nb2RlbDtcbiAgICAgICAgICAgIGNvbnN0IE90aGVyTW9kZWwgPSByZXZlcnNlID8gRGVjbGFyZWRGcm9tTW9kZWwgOiBEZWNsYXJlZFRvTW9kZWw7XG5cbiAgICAgICAgICAgIGNvbnN0IHRoaXNSZWZlcmVuY2luZ0ZpZWxkID0gcmV2ZXJzZVxuICAgICAgICAgICAgICAgID8gdGhyb3VnaEZpZWxkcy50b1xuICAgICAgICAgICAgICAgIDogdGhyb3VnaEZpZWxkcy5mcm9tO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJSZWZlcmVuY2luZ0ZpZWxkID0gcmV2ZXJzZVxuICAgICAgICAgICAgICAgID8gdGhyb3VnaEZpZWxkcy5mcm9tXG4gICAgICAgICAgICAgICAgOiB0aHJvdWdoRmllbGRzLnRvO1xuXG4gICAgICAgICAgICBjb25zdCB0aGlzSWQgPSB0aGlzLmdldElkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRocm91Z2hRcyA9IFRocm91Z2hNb2RlbC5maWx0ZXIoe1xuICAgICAgICAgICAgICAgIFt0aGlzUmVmZXJlbmNpbmdGaWVsZF06IHRoaXNJZCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFsbCBJRHMgb2YgaW5zdGFuY2VzIG9mIHRoZSBvdGhlciBtb2RlbCB0aGF0IGFyZVxuICAgICAgICAgICAgICogcmVmZXJlbmNlZCBieSBhbnkgaW5zdGFuY2Ugb2YgdGhlIGN1cnJlbnQgbW9kZWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlZE90aGVySWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICB0aHJvdWdoUXMudG9SZWZBcnJheSgpLm1hcCgob2JqKSA9PiBvYmpbb3RoZXJSZWZlcmVuY2luZ0ZpZWxkXSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogc2VsZWN0cyBhbGwgaW5zdGFuY2VzIG9mIG90aGVyIG1vZGVsIHRoYXQgYXJlIHJlZmVyZW5jZWRcbiAgICAgICAgICAgICAqIGJ5IGFueSBpbnN0YW5jZSBvZiB0aGUgY3VycmVudCBtb2RlbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBxcyA9IE90aGVyTW9kZWwuZmlsdGVyKChvdGhlck1vZGVsSW5zdGFuY2UpID0+XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZE90aGVySWRzLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJNb2RlbEluc3RhbmNlW090aGVyTW9kZWwuaWRBdHRyaWJ1dGVdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBbGxvd3MgYWRkaW5nIE90aGVyTW9kZWwgaW5zdGFuY2VzIHRvIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgaW5zdGFuY2UuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogRS5nLiBCb29rLmZpcnN0KCkuYXV0aG9ycy5hZGQoMSwgMikgd291bGQgYWRkIHRoZSBhdXRob3JzIHdpdGggSURzIDEgYW5kIDJcbiAgICAgICAgICAgICAqIHRvIHRoZSBmaXJzdCBib29rJ3MgbGlzdCBvZiByZWZlcmVuY2VkIGF1dGhvcnMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcXMuYWRkID0gZnVuY3Rpb24gYWRkKC4uLmVudGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRzVG9BZGQgPSBuZXcgU2V0KGVudGl0aWVzLm1hcChub3JtYWxpemVFbnRpdHkpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUXMgPSB0aHJvdWdoUXMuZmlsdGVyKCh0aHJvdWdoKSA9PlxuICAgICAgICAgICAgICAgICAgICBpZHNUb0FkZC5oYXModGhyb3VnaFtvdGhlclJlZmVyZW5jaW5nRmllbGRdKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdRcy5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IGV4aXN0aW5nUXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JlZkFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHRocm91Z2gpID0+IHRocm91Z2hbb3RoZXJSZWZlcmVuY2luZ0ZpZWxkXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFRyaWVkIHRvIGFkZCBhbHJlYWR5IGV4aXN0aW5nICR7T3RoZXJNb2RlbC5tb2RlbE5hbWV9IGlkKHMpICR7ZXhpc3RpbmdJZHN9IHRvIHRoZSAke1RoaXNNb2RlbC5tb2RlbE5hbWV9IGluc3RhbmNlIHdpdGggaWQgJHt0aGlzSWR9YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlkc1RvQWRkLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIFRocm91Z2hNb2RlbC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgW290aGVyUmVmZXJlbmNpbmdGaWVsZF06IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNSZWZlcmVuY2luZ0ZpZWxkXTogdGhpc0lkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogUmVtb3ZlcyByZWZlcmVuY2VzIHRvIGFsbCBPdGhlck1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSBjdXJyZW50IG1vZGVsLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEUuZy4gQm9vay5maXJzdCgpLmF1dGhvcnMuY2xlYXIoKSB3b3VsZCBjYXVzZSB0aGUgZmlyc3QgYm9vaydzIGxpc3RcbiAgICAgICAgICAgICAqIG9mIHJlZmVyZW5jZWQgYXV0aG9ycyB0byBiZWNvbWUgZW1wdHkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcXMuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgICAgICAgICB0aHJvdWdoUXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJlbW92ZXMgcmVmZXJlbmNlcyB0byBhbGwgcGFzc2VkIE90aGVyTW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogRS5nLiBCb29rLmZpcnN0KCkuYXV0aG9ycy5yZW1vdmUoMSwgMikgd291bGQgY2F1c2UgdGhlIGF1dGhvcnMgd2l0aFxuICAgICAgICAgICAgICogSURzIDEgYW5kIDIgdG8gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGZpcnN0IGJvb2suXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcXMucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKC4uLmVudGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRzVG9SZW1vdmUgPSBuZXcgU2V0KGVudGl0aWVzLm1hcChub3JtYWxpemVFbnRpdHkpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0aWVzVG9EZWxldGUgPSB0aHJvdWdoUXMuZmlsdGVyKCh0aHJvdWdoKSA9PlxuICAgICAgICAgICAgICAgICAgICBpZHNUb1JlbW92ZS5oYXModGhyb3VnaFtvdGhlclJlZmVyZW5jaW5nRmllbGRdKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW50aXRpZXNUb0RlbGV0ZS5jb3VudCgpICE9PSBpZHNUb1JlbW92ZS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyaWVkIGRlbGV0aW5nIG5vbi1leGlzdGluZyBlbnRpdGllcy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXRpZXNUb0RlbGV0ZUlkcyA9IGVudGl0aWVzVG9EZWxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JlZkFycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHRocm91Z2gpID0+IHRocm91Z2hbb3RoZXJSZWZlcmVuY2luZ0ZpZWxkXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5leGlzdGluZ0lkcyA9IFsuLi5pZHNUb1JlbW92ZV0uZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGlkKSA9PiAhZW50aXRpZXNUb0RlbGV0ZUlkcy5pbmNsdWRlcyhpZClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgVHJpZWQgdG8gZGVsZXRlIG5vbi1leGlzdGluZyAke090aGVyTW9kZWwubW9kZWxOYW1lfSBpZChzKSAke3VuZXhpc3RpbmdJZHN9IGZyb20gdGhlICR7VGhpc01vZGVsLm1vZGVsTmFtZX0gaW5zdGFuY2Ugd2l0aCBpZCAke3RoaXNJZH1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZW50aXRpZXNUb0RlbGV0ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBxcztcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUcmllZCBzZXR0aW5nIGEgTTJNIGZpZWxkLiBQbGVhc2UgdXNlIHRoZSByZWxhdGVkIFF1ZXJ5U2V0IG1ldGhvZHMgYWRkLCByZW1vdmUgYW5kIGNsZWFyLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbmV4cG9ydCB7XG4gICAgYXR0ckRlc2NyaXB0b3IsXG4gICAgZm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yLFxuICAgIGZvcndhcmRzT25lVG9PbmVEZXNjcmlwdG9yLFxuICAgIGJhY2t3YXJkc09uZVRvT25lRGVzY3JpcHRvcixcbiAgICBiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yLFxuICAgIG1hbnlUb01hbnlEZXNjcmlwdG9yLFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/descriptors.js\n");
/***/ }),
@@ -4558,7 +4580,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Attribute\", function() { return Attribute; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Field__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet Attribute = /*#__PURE__*/function (_Field) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(Attribute, _Field);\n\n function Attribute(opts) {\n var _this;\n\n _this = _Field.call(this) || this;\n _this.opts = opts || {};\n\n if (_this.opts.hasOwnProperty(\"getDefault\")) {\n _this.getDefault = _this.opts.getDefault;\n }\n\n return _this;\n }\n\n var _proto = Attribute.prototype;\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"attrDescriptor\"])(fieldName);\n };\n\n return Attribute;\n}(_Field__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (Attribute);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvQXR0cmlidXRlLmpzPzJkNDMiXSwibmFtZXMiOlsiQXR0cmlidXRlIiwib3B0cyIsImhhc093blByb3BlcnR5IiwiZ2V0RGVmYXVsdCIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsImZpZWxkTmFtZSIsIm1vZGVsIiwiYXR0ckRlc2NyaXB0b3IiLCJGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFFQTs7OztBQUdPLElBQU1BLFNBQWI7QUFBQTs7QUFDSSxxQkFBWUMsSUFBWixFQUFrQjtBQUFBOztBQUNkO0FBQ0EsVUFBS0EsSUFBTCxHQUFZQSxJQUFJLElBQUksRUFBcEI7O0FBRUEsUUFBSSxNQUFLQSxJQUFMLENBQVVDLGNBQVYsQ0FBeUIsWUFBekIsQ0FBSixFQUE0QztBQUN4QyxZQUFLQyxVQUFMLEdBQWtCLE1BQUtGLElBQUwsQ0FBVUUsVUFBNUI7QUFDSDs7QUFOYTtBQU9qQjs7QUFSTDs7QUFBQSxTQVVJQyx3QkFWSixHQVVJLGtDQUF5QkMsU0FBekIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3ZDLFdBQU9DLG1FQUFjLENBQUNGLFNBQUQsQ0FBckI7QUFDSCxHQVpMOztBQUFBO0FBQUEsRUFBK0JHLDhDQUEvQjtBQWVlUix3RUFBZiIsImZpbGUiOiIuL3NyYy9maWVsZHMvQXR0cmlidXRlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZpZWxkIGZyb20gXCIuL0ZpZWxkXCI7XG5cbmltcG9ydCB7IGF0dHJEZXNjcmlwdG9yIH0gZnJvbSBcIi4uL2Rlc2NyaXB0b3JzXCI7XG5cbi8qKlxuICogQG1lbWJlcm9mIG1vZHVsZTpmaWVsZHNcbiAqL1xuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIEZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHMgfHwge307XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5oYXNPd25Qcm9wZXJ0eShcImdldERlZmF1bHRcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RGVmYXVsdCA9IHRoaXMub3B0cy5nZXREZWZhdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlRm9yd2FyZHNEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJEZXNjcmlwdG9yKGZpZWxkTmFtZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBdHRyaWJ1dGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/fields/Attribute.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Attribute\", function() { return Attribute; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Field__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet Attribute = /*#__PURE__*/function (_Field) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(Attribute, _Field);\n\n function Attribute(opts) {\n var _this;\n\n _this = _Field.call(this) || this;\n _this.opts = opts || {};\n\n if (_this.opts.hasOwnProperty(\"getDefault\")) {\n _this.getDefault = _this.opts.getDefault;\n }\n\n return _this;\n }\n\n var _proto = Attribute.prototype;\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"attrDescriptor\"])(fieldName);\n };\n\n return Attribute;\n}(_Field__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (Attribute);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvQXR0cmlidXRlLmpzPzJkNDMiXSwibmFtZXMiOlsiQXR0cmlidXRlIiwib3B0cyIsImhhc093blByb3BlcnR5IiwiZ2V0RGVmYXVsdCIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsImZpZWxkTmFtZSIsIm1vZGVsIiwiYXR0ckRlc2NyaXB0b3IiLCJGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBQ08sSUFBTUEsU0FBYjtBQUFBOztBQUNJLHFCQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQ2Q7QUFDQSxVQUFLQSxJQUFMLEdBQVlBLElBQUksSUFBSSxFQUFwQjs7QUFFQSxRQUFJLE1BQUtBLElBQUwsQ0FBVUMsY0FBVixDQUF5QixZQUF6QixDQUFKLEVBQTRDO0FBQ3hDLFlBQUtDLFVBQUwsR0FBa0IsTUFBS0YsSUFBTCxDQUFVRSxVQUE1QjtBQUNIOztBQU5hO0FBT2pCOztBQVJMOztBQUFBLFNBVUlDLHdCQVZKLEdBVUksa0NBQXlCQyxTQUF6QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDdkMsV0FBT0MsbUVBQWMsQ0FBQ0YsU0FBRCxDQUFyQjtBQUNILEdBWkw7O0FBQUE7QUFBQSxFQUErQkcsOENBQS9CO0FBZWVSLHdFQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9BdHRyaWJ1dGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmllbGQgZnJvbSBcIi4vRmllbGRcIjtcblxuaW1wb3J0IHsgYXR0ckRlc2NyaXB0b3IgfSBmcm9tIFwiLi4vZGVzY3JpcHRvcnNcIjtcblxuLyoqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlIGV4dGVuZHMgRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cyB8fCB7fTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLmhhc093blByb3BlcnR5KFwiZ2V0RGVmYXVsdFwiKSkge1xuICAgICAgICAgICAgdGhpcy5nZXREZWZhdWx0ID0gdGhpcy5vcHRzLmdldERlZmF1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCkge1xuICAgICAgICByZXR1cm4gYXR0ckRlc2NyaXB0b3IoZmllbGROYW1lKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0dHJpYnV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/Attribute.js\n");
/***/ }),
@@ -4570,7 +4592,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DefaultFieldInstaller\", function() { return DefaultFieldInstaller; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _FieldInstallerTemplate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FieldInstallerTemplate */ \"./src/fields/FieldInstallerTemplate.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n/**\n * Default implementation for the template method in FieldInstallerTemplate.\n * @private\n * @memberof module:fields\n */\n\nlet DefaultFieldInstaller = /*#__PURE__*/function (_FieldInstallerTempla) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(DefaultFieldInstaller, _FieldInstallerTempla);\n\n function DefaultFieldInstaller() {\n return _FieldInstallerTempla.apply(this, arguments) || this;\n }\n\n var _proto = DefaultFieldInstaller.prototype;\n\n _proto.installForwardsDescriptor = function installForwardsDescriptor() {\n Object.defineProperty(this.model.prototype, this.fieldName, this.field.createForwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n _proto.installForwardsVirtualField = function installForwardsVirtualField() {\n this.model.virtualFields[this.fieldName] = this.field.createForwardsVirtualField(this.fieldName, this.model, this.toModel, this.throughModel);\n };\n\n _proto.installBackwardsDescriptor = function installBackwardsDescriptor() {\n const backwardsDescriptor = Object.getOwnPropertyDescriptor(this.toModel.prototype, this.backwardsFieldName);\n\n if (backwardsDescriptor) {\n throw new Error(Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"reverseFieldErrorMessage\"])(this.model.modelName, this.fieldName, this.toModel.modelName, this.backwardsFieldName));\n } // install backwards descriptor\n\n\n Object.defineProperty(this.toModel.prototype, this.backwardsFieldName, this.field.createBackwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n _proto.installBackwardsVirtualField = function installBackwardsVirtualField() {\n this.toModel.virtualFields[this.backwardsFieldName] = this.field.createBackwardsVirtualField(this.fieldName, this.model, this.toModel, this.throughModel);\n };\n\n return DefaultFieldInstaller;\n}(_FieldInstallerTemplate__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (DefaultFieldInstaller);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRGVmYXVsdEZpZWxkSW5zdGFsbGVyLmpzPzQxOTYiXSwibmFtZXMiOlsiRGVmYXVsdEZpZWxkSW5zdGFsbGVyIiwiaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibW9kZWwiLCJwcm90b3R5cGUiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJpbnN0YWxsRm9yd2FyZHNWaXJ0dWFsRmllbGQiLCJ2aXJ0dWFsRmllbGRzIiwiY3JlYXRlRm9yd2FyZHNWaXJ0dWFsRmllbGQiLCJpbnN0YWxsQmFja3dhcmRzRGVzY3JpcHRvciIsImJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJiYWNrd2FyZHNGaWVsZE5hbWUiLCJFcnJvciIsInJldmVyc2VGaWVsZEVycm9yTWVzc2FnZSIsIm1vZGVsTmFtZSIsImNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsQmFja3dhcmRzVmlydHVhbEZpZWxkIiwiY3JlYXRlQmFja3dhcmRzVmlydHVhbEZpZWxkIiwiRmllbGRJbnN0YWxsZXJUZW1wbGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFFQTs7Ozs7O0FBS08sSUFBTUEscUJBQWI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUEsU0FDSUMseUJBREosR0FDSSxxQ0FBNEI7QUFDeEJDLFVBQU0sQ0FBQ0MsY0FBUCxDQUNJLEtBQUtDLEtBQUwsQ0FBV0MsU0FEZixFQUVJLEtBQUtDLFNBRlQsRUFHSSxLQUFLQyxLQUFMLENBQVdDLHdCQUFYLENBQ0ksS0FBS0YsU0FEVCxFQUVJLEtBQUtGLEtBRlQsRUFHSSxLQUFLSyxPQUhULEVBSUksS0FBS0MsWUFKVCxDQUhKO0FBVUgsR0FaTDs7QUFBQSxTQWNJQywyQkFkSixHQWNJLHVDQUE4QjtBQUMxQixTQUFLUCxLQUFMLENBQVdRLGFBQVgsQ0FDSSxLQUFLTixTQURULElBRUksS0FBS0MsS0FBTCxDQUFXTSwwQkFBWCxDQUNBLEtBQUtQLFNBREwsRUFFQSxLQUFLRixLQUZMLEVBR0EsS0FBS0ssT0FITCxFQUlBLEtBQUtDLFlBSkwsQ0FGSjtBQVFILEdBdkJMOztBQUFBLFNBeUJJSSwwQkF6QkosR0F5Qkksc0NBQTZCO0FBQ3pCLFVBQU1DLG1CQUFtQixHQUFHYixNQUFNLENBQUNjLHdCQUFQLENBQ3hCLEtBQUtQLE9BQUwsQ0FBYUosU0FEVyxFQUV4QixLQUFLWSxrQkFGbUIsQ0FBNUI7O0FBSUEsUUFBSUYsbUJBQUosRUFBeUI7QUFDckIsWUFBTSxJQUFJRyxLQUFKLENBQ0ZDLHVFQUF3QixDQUNwQixLQUFLZixLQUFMLENBQVdnQixTQURTLEVBRXBCLEtBQUtkLFNBRmUsRUFHcEIsS0FBS0csT0FBTCxDQUFhVyxTQUhPLEVBSXBCLEtBQUtILGtCQUplLENBRHRCLENBQU47QUFRSCxLQWR3QixDQWdCekI7OztBQUNBZixVQUFNLENBQUNDLGNBQVAsQ0FDSSxLQUFLTSxPQUFMLENBQWFKLFNBRGpCLEVBRUksS0FBS1ksa0JBRlQsRUFHSSxLQUFLVixLQUFMLENBQVdjLHlCQUFYLENBQ0ksS0FBS2YsU0FEVCxFQUVJLEtBQUtGLEtBRlQsRUFHSSxLQUFLSyxPQUhULEVBSUksS0FBS0MsWUFKVCxDQUhKO0FBVUgsR0FwREw7O0FBQUEsU0FzRElZLDRCQXRESixHQXNESSx3Q0FBK0I7QUFDM0IsU0FBS2IsT0FBTCxDQUFhRyxhQUFiLENBQ0ksS0FBS0ssa0JBRFQsSUFFSSxLQUFLVixLQUFMLENBQVdnQiwyQkFBWCxDQUNBLEtBQUtqQixTQURMLEVBRUEsS0FBS0YsS0FGTCxFQUdBLEtBQUtLLE9BSEwsRUFJQSxLQUFLQyxZQUpMLENBRko7QUFRSCxHQS9ETDs7QUFBQTtBQUFBLEVBQTJDYywrREFBM0M7QUFrRWV4QixvRkFBZiIsImZpbGUiOiIuL3NyYy9maWVsZHMvRGVmYXVsdEZpZWxkSW5zdGFsbGVyLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZpZWxkSW5zdGFsbGVyVGVtcGxhdGUgZnJvbSBcIi4vRmllbGRJbnN0YWxsZXJUZW1wbGF0ZVwiO1xuXG5pbXBvcnQgeyByZXZlcnNlRmllbGRFcnJvck1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgdGVtcGxhdGUgbWV0aG9kIGluIEZpZWxkSW5zdGFsbGVyVGVtcGxhdGUuXG4gKiBAcHJpdmF0ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpmaWVsZHNcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRGaWVsZEluc3RhbGxlciBleHRlbmRzIEZpZWxkSW5zdGFsbGVyVGVtcGxhdGUge1xuICAgIGluc3RhbGxGb3J3YXJkc0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgIHRoaXMubW9kZWwucHJvdG90eXBlLFxuICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICB0aGlzLmZpZWxkLmNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgICAgIHRoaXMudG9Nb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnRocm91Z2hNb2RlbFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGluc3RhbGxGb3J3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgdGhpcy5tb2RlbC52aXJ0dWFsRmllbGRzW1xuICAgICAgICAgICAgdGhpcy5maWVsZE5hbWVcbiAgICAgICAgXSA9IHRoaXMuZmllbGQuY3JlYXRlRm9yd2FyZHNWaXJ0dWFsRmllbGQoXG4gICAgICAgICAgICB0aGlzLmZpZWxkTmFtZSxcbiAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICB0aGlzLnRvTW9kZWwsXG4gICAgICAgICAgICB0aGlzLnRocm91Z2hNb2RlbFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGluc3RhbGxCYWNrd2FyZHNEZXNjcmlwdG9yKCkge1xuICAgICAgICBjb25zdCBiYWNrd2FyZHNEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbC5wcm90b3R5cGUsXG4gICAgICAgICAgICB0aGlzLmJhY2t3YXJkc0ZpZWxkTmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoYmFja3dhcmRzRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIHJldmVyc2VGaWVsZEVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvTW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2t3YXJkc0ZpZWxkTmFtZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbnN0YWxsIGJhY2t3YXJkcyBkZXNjcmlwdG9yXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbC5wcm90b3R5cGUsXG4gICAgICAgICAgICB0aGlzLmJhY2t3YXJkc0ZpZWxkTmFtZSxcbiAgICAgICAgICAgIHRoaXMuZmllbGQuY3JlYXRlQmFja3dhcmRzRGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgICAgIHRoaXMudG9Nb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnRocm91Z2hNb2RlbFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGluc3RhbGxCYWNrd2FyZHNWaXJ0dWFsRmllbGQoKSB7XG4gICAgICAgIHRoaXMudG9Nb2RlbC52aXJ0dWFsRmllbGRzW1xuICAgICAgICAgICAgdGhpcy5iYWNrd2FyZHNGaWVsZE5hbWVcbiAgICAgICAgXSA9IHRoaXMuZmllbGQuY3JlYXRlQmFja3dhcmRzVmlydHVhbEZpZWxkKFxuICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgdGhpcy50b01vZGVsLFxuICAgICAgICAgICAgdGhpcy50aHJvdWdoTW9kZWxcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlZmF1bHRGaWVsZEluc3RhbGxlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/DefaultFieldInstaller.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DefaultFieldInstaller\", function() { return DefaultFieldInstaller; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _FieldInstallerTemplate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FieldInstallerTemplate */ \"./src/fields/FieldInstallerTemplate.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n/**\n * Default implementation for the template method in FieldInstallerTemplate.\n * @private\n * @memberof module:fields\n */\n\nlet DefaultFieldInstaller = /*#__PURE__*/function (_FieldInstallerTempla) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(DefaultFieldInstaller, _FieldInstallerTempla);\n\n function DefaultFieldInstaller() {\n return _FieldInstallerTempla.apply(this, arguments) || this;\n }\n\n var _proto = DefaultFieldInstaller.prototype;\n\n _proto.installForwardsDescriptor = function installForwardsDescriptor() {\n Object.defineProperty(this.model.prototype, this.fieldName, this.field.createForwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n _proto.installForwardsVirtualField = function installForwardsVirtualField() {\n this.model.virtualFields[this.fieldName] = this.field.createForwardsVirtualField(this.fieldName, this.model, this.toModel, this.throughModel);\n };\n\n _proto.installBackwardsDescriptor = function installBackwardsDescriptor() {\n const backwardsDescriptor = Object.getOwnPropertyDescriptor(this.toModel.prototype, this.backwardsFieldName);\n\n if (backwardsDescriptor) {\n throw new Error(Object(_utils__WEBPACK_IMPORTED_MODULE_2__[\"reverseFieldErrorMessage\"])(this.model.modelName, this.fieldName, this.toModel.modelName, this.backwardsFieldName));\n } // install backwards descriptor\n\n\n Object.defineProperty(this.toModel.prototype, this.backwardsFieldName, this.field.createBackwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n _proto.installBackwardsVirtualField = function installBackwardsVirtualField() {\n this.toModel.virtualFields[this.backwardsFieldName] = this.field.createBackwardsVirtualField(this.fieldName, this.model, this.toModel, this.throughModel);\n };\n\n return DefaultFieldInstaller;\n}(_FieldInstallerTemplate__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (DefaultFieldInstaller);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRGVmYXVsdEZpZWxkSW5zdGFsbGVyLmpzPzQxOTYiXSwibmFtZXMiOlsiRGVmYXVsdEZpZWxkSW5zdGFsbGVyIiwiaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwibW9kZWwiLCJwcm90b3R5cGUiLCJmaWVsZE5hbWUiLCJmaWVsZCIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJpbnN0YWxsRm9yd2FyZHNWaXJ0dWFsRmllbGQiLCJ2aXJ0dWFsRmllbGRzIiwiY3JlYXRlRm9yd2FyZHNWaXJ0dWFsRmllbGQiLCJpbnN0YWxsQmFja3dhcmRzRGVzY3JpcHRvciIsImJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJiYWNrd2FyZHNGaWVsZE5hbWUiLCJFcnJvciIsInJldmVyc2VGaWVsZEVycm9yTWVzc2FnZSIsIm1vZGVsTmFtZSIsImNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsQmFja3dhcmRzVmlydHVhbEZpZWxkIiwiY3JlYXRlQmFja3dhcmRzVmlydHVhbEZpZWxkIiwiRmllbGRJbnN0YWxsZXJUZW1wbGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNPLElBQU1BLHFCQUFiO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBLFNBQ0lDLHlCQURKLEdBQ0kscUNBQTRCO0FBQ3hCQyxVQUFNLENBQUNDLGNBQVAsQ0FDSSxLQUFLQyxLQUFMLENBQVdDLFNBRGYsRUFFSSxLQUFLQyxTQUZULEVBR0ksS0FBS0MsS0FBTCxDQUFXQyx3QkFBWCxDQUNJLEtBQUtGLFNBRFQsRUFFSSxLQUFLRixLQUZULEVBR0ksS0FBS0ssT0FIVCxFQUlJLEtBQUtDLFlBSlQsQ0FISjtBQVVILEdBWkw7O0FBQUEsU0FjSUMsMkJBZEosR0FjSSx1Q0FBOEI7QUFDMUIsU0FBS1AsS0FBTCxDQUFXUSxhQUFYLENBQ0ksS0FBS04sU0FEVCxJQUVJLEtBQUtDLEtBQUwsQ0FBV00sMEJBQVgsQ0FDQSxLQUFLUCxTQURMLEVBRUEsS0FBS0YsS0FGTCxFQUdBLEtBQUtLLE9BSEwsRUFJQSxLQUFLQyxZQUpMLENBRko7QUFRSCxHQXZCTDs7QUFBQSxTQXlCSUksMEJBekJKLEdBeUJJLHNDQUE2QjtBQUN6QixVQUFNQyxtQkFBbUIsR0FBR2IsTUFBTSxDQUFDYyx3QkFBUCxDQUN4QixLQUFLUCxPQUFMLENBQWFKLFNBRFcsRUFFeEIsS0FBS1ksa0JBRm1CLENBQTVCOztBQUlBLFFBQUlGLG1CQUFKLEVBQXlCO0FBQ3JCLFlBQU0sSUFBSUcsS0FBSixDQUNGQyx1RUFBd0IsQ0FDcEIsS0FBS2YsS0FBTCxDQUFXZ0IsU0FEUyxFQUVwQixLQUFLZCxTQUZlLEVBR3BCLEtBQUtHLE9BQUwsQ0FBYVcsU0FITyxFQUlwQixLQUFLSCxrQkFKZSxDQUR0QixDQUFOO0FBUUgsS0Fkd0IsQ0FnQnpCOzs7QUFDQWYsVUFBTSxDQUFDQyxjQUFQLENBQ0ksS0FBS00sT0FBTCxDQUFhSixTQURqQixFQUVJLEtBQUtZLGtCQUZULEVBR0ksS0FBS1YsS0FBTCxDQUFXYyx5QkFBWCxDQUNJLEtBQUtmLFNBRFQsRUFFSSxLQUFLRixLQUZULEVBR0ksS0FBS0ssT0FIVCxFQUlJLEtBQUtDLFlBSlQsQ0FISjtBQVVILEdBcERMOztBQUFBLFNBc0RJWSw0QkF0REosR0FzREksd0NBQStCO0FBQzNCLFNBQUtiLE9BQUwsQ0FBYUcsYUFBYixDQUNJLEtBQUtLLGtCQURULElBRUksS0FBS1YsS0FBTCxDQUFXZ0IsMkJBQVgsQ0FDQSxLQUFLakIsU0FETCxFQUVBLEtBQUtGLEtBRkwsRUFHQSxLQUFLSyxPQUhMLEVBSUEsS0FBS0MsWUFKTCxDQUZKO0FBUUgsR0EvREw7O0FBQUE7QUFBQSxFQUEyQ2MsK0RBQTNDO0FBa0VleEIsb0ZBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL0RlZmF1bHRGaWVsZEluc3RhbGxlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGaWVsZEluc3RhbGxlclRlbXBsYXRlIGZyb20gXCIuL0ZpZWxkSW5zdGFsbGVyVGVtcGxhdGVcIjtcblxuaW1wb3J0IHsgcmV2ZXJzZUZpZWxkRXJyb3JNZXNzYWdlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qKlxuICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHRlbXBsYXRlIG1ldGhvZCBpbiBGaWVsZEluc3RhbGxlclRlbXBsYXRlLlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmllbGRzXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmllbGRJbnN0YWxsZXIgZXh0ZW5kcyBGaWVsZEluc3RhbGxlclRlbXBsYXRlIHtcbiAgICBpbnN0YWxsRm9yd2FyZHNEZXNjcmlwdG9yKCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnByb3RvdHlwZSxcbiAgICAgICAgICAgIHRoaXMuZmllbGROYW1lLFxuICAgICAgICAgICAgdGhpcy5maWVsZC5jcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnRvTW9kZWwsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJvdWdoTW9kZWxcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnN0YWxsRm9yd2FyZHNWaXJ0dWFsRmllbGQoKSB7XG4gICAgICAgIHRoaXMubW9kZWwudmlydHVhbEZpZWxkc1tcbiAgICAgICAgICAgIHRoaXMuZmllbGROYW1lXG4gICAgICAgIF0gPSB0aGlzLmZpZWxkLmNyZWF0ZUZvcndhcmRzVmlydHVhbEZpZWxkKFxuICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgdGhpcy50b01vZGVsLFxuICAgICAgICAgICAgdGhpcy50aHJvdWdoTW9kZWxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnN0YWxsQmFja3dhcmRzRGVzY3JpcHRvcigpIHtcbiAgICAgICAgY29uc3QgYmFja3dhcmRzRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICB0aGlzLnRvTW9kZWwucHJvdG90eXBlLFxuICAgICAgICAgICAgdGhpcy5iYWNrd2FyZHNGaWVsZE5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGJhY2t3YXJkc0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICByZXZlcnNlRmllbGRFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b01vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrd2FyZHNGaWVsZE5hbWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5zdGFsbCBiYWNrd2FyZHMgZGVzY3JpcHRvclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICB0aGlzLnRvTW9kZWwucHJvdG90eXBlLFxuICAgICAgICAgICAgdGhpcy5iYWNrd2FyZHNGaWVsZE5hbWUsXG4gICAgICAgICAgICB0aGlzLmZpZWxkLmNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnRvTW9kZWwsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJvdWdoTW9kZWxcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbnN0YWxsQmFja3dhcmRzVmlydHVhbEZpZWxkKCkge1xuICAgICAgICB0aGlzLnRvTW9kZWwudmlydHVhbEZpZWxkc1tcbiAgICAgICAgICAgIHRoaXMuYmFja3dhcmRzRmllbGROYW1lXG4gICAgICAgIF0gPSB0aGlzLmZpZWxkLmNyZWF0ZUJhY2t3YXJkc1ZpcnR1YWxGaWVsZChcbiAgICAgICAgICAgIHRoaXMuZmllbGROYW1lLFxuICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbCxcbiAgICAgICAgICAgIHRoaXMudGhyb3VnaE1vZGVsXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0RmllbGRJbnN0YWxsZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/fields/DefaultFieldInstaller.js\n");
/***/ }),
@@ -4582,7 +4604,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Field\", function() { return Field; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultFieldInstaller */ \"./src/fields/DefaultFieldInstaller.js\");\n\n\n/**\n * @private\n * @memberof module:fields\n */\n\nlet Field = /*#__PURE__*/function () {\n function Field() {}\n\n var _proto = Field.prototype;\n\n _proto.getClass = function getClass() {\n return this.constructor;\n };\n\n _proto.references = function references(model) {\n return false;\n };\n\n _proto.getThroughModelName = function getThroughModelName(fieldName, model) {\n return null;\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Field, [{\n key: \"installerClass\",\n get: function () {\n return _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n }\n }, {\n key: \"installsForwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"index\",\n get: function () {\n return false;\n }\n }]);\n\n return Field;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Field);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRmllbGQuanM/OTMwNSJdLCJuYW1lcyI6WyJGaWVsZCIsImdldENsYXNzIiwiY29uc3RydWN0b3IiLCJyZWZlcmVuY2VzIiwibW9kZWwiLCJnZXRUaHJvdWdoTW9kZWxOYW1lIiwiZmllbGROYW1lIiwiRGVmYXVsdEZpZWxkSW5zdGFsbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUVBOzs7OztBQUlPLElBQU1BLEtBQWI7QUFBQTs7QUFBQTs7QUFBQSxTQUtJQyxRQUxKLEdBS0ksb0JBQVc7QUFDUCxXQUFPLEtBQUtDLFdBQVo7QUFDSCxHQVBMOztBQUFBLFNBU0lDLFVBVEosR0FTSSxvQkFBV0MsS0FBWCxFQUFrQjtBQUNkLFdBQU8sS0FBUDtBQUNILEdBWEw7O0FBQUEsU0FhSUMsbUJBYkosR0FhSSw2QkFBb0JDLFNBQXBCLEVBQStCRixLQUEvQixFQUFzQztBQUNsQyxXQUFPLElBQVA7QUFDSCxHQWZMOztBQUFBO0FBQUE7QUFBQSxxQkFDeUI7QUFDakIsYUFBT0csOERBQVA7QUFDSDtBQUhMO0FBQUE7QUFBQSxxQkFpQnVDO0FBQy9CLGFBQU8sS0FBUDtBQUNIO0FBbkJMO0FBQUE7QUFBQSxxQkFxQnNDO0FBQzlCLGFBQU8sS0FBUDtBQUNIO0FBdkJMO0FBQUE7QUFBQSxxQkF5QndDO0FBQ2hDLGFBQU8sS0FBUDtBQUNIO0FBM0JMO0FBQUE7QUFBQSxxQkE2QmdCO0FBQ1IsYUFBTyxLQUFQO0FBQ0g7QUEvQkw7O0FBQUE7QUFBQTtBQWtDZVAsb0VBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL0ZpZWxkLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERlZmF1bHRGaWVsZEluc3RhbGxlciBmcm9tIFwiLi9EZWZhdWx0RmllbGRJbnN0YWxsZXJcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpmaWVsZHNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpZWxkIHtcbiAgICBnZXQgaW5zdGFsbGVyQ2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0RmllbGRJbnN0YWxsZXI7XG4gICAgfVxuXG4gICAgZ2V0Q2xhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIH1cblxuICAgIHJlZmVyZW5jZXMobW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldFRocm91Z2hNb2RlbE5hbWUoZmllbGROYW1lLCBtb2RlbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgaW5zdGFsbHNGb3J3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsc0JhY2t3YXJkc0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5zdGFsbHNCYWNrd2FyZHNWaXJ0dWFsRmllbGQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpZWxkO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/Field.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Field\", function() { return Field; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultFieldInstaller */ \"./src/fields/DefaultFieldInstaller.js\");\n\n\n/**\n * @private\n * @memberof module:fields\n */\n\nlet Field = /*#__PURE__*/function () {\n function Field() {}\n\n var _proto = Field.prototype;\n\n _proto.getClass = function getClass() {\n return this.constructor;\n };\n\n _proto.references = function references(model) {\n return false;\n };\n\n _proto.getThroughModelName = function getThroughModelName(fieldName, model) {\n return null;\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(Field, [{\n key: \"installerClass\",\n get: function () {\n return _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n }\n }, {\n key: \"installsForwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return false;\n }\n }, {\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return false;\n }\n }, {\n key: \"index\",\n get: function () {\n return false;\n }\n }]);\n\n return Field;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Field);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRmllbGQuanM/OTMwNSJdLCJuYW1lcyI6WyJGaWVsZCIsImdldENsYXNzIiwiY29uc3RydWN0b3IiLCJyZWZlcmVuY2VzIiwibW9kZWwiLCJnZXRUaHJvdWdoTW9kZWxOYW1lIiwiZmllbGROYW1lIiwiRGVmYXVsdEZpZWxkSW5zdGFsbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNPLElBQU1BLEtBQWI7QUFBQTs7QUFBQTs7QUFBQSxTQUtJQyxRQUxKLEdBS0ksb0JBQVc7QUFDUCxXQUFPLEtBQUtDLFdBQVo7QUFDSCxHQVBMOztBQUFBLFNBU0lDLFVBVEosR0FTSSxvQkFBV0MsS0FBWCxFQUFrQjtBQUNkLFdBQU8sS0FBUDtBQUNILEdBWEw7O0FBQUEsU0FhSUMsbUJBYkosR0FhSSw2QkFBb0JDLFNBQXBCLEVBQStCRixLQUEvQixFQUFzQztBQUNsQyxXQUFPLElBQVA7QUFDSCxHQWZMOztBQUFBO0FBQUE7QUFBQSxTQUNJLFlBQXFCO0FBQ2pCLGFBQU9HLDhEQUFQO0FBQ0g7QUFITDtBQUFBO0FBQUEsU0FpQkksWUFBbUM7QUFDL0IsYUFBTyxLQUFQO0FBQ0g7QUFuQkw7QUFBQTtBQUFBLFNBcUJJLFlBQWtDO0FBQzlCLGFBQU8sS0FBUDtBQUNIO0FBdkJMO0FBQUE7QUFBQSxTQXlCSSxZQUFvQztBQUNoQyxhQUFPLEtBQVA7QUFDSDtBQTNCTDtBQUFBO0FBQUEsU0E2QkksWUFBWTtBQUNSLGFBQU8sS0FBUDtBQUNIO0FBL0JMOztBQUFBO0FBQUE7QUFrQ2VQLG9FQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9GaWVsZC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEZWZhdWx0RmllbGRJbnN0YWxsZXIgZnJvbSBcIi4vRGVmYXVsdEZpZWxkSW5zdGFsbGVyXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmllbGRzXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWVsZCB7XG4gICAgZ2V0IGluc3RhbGxlckNsYXNzKCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdEZpZWxkSW5zdGFsbGVyO1xuICAgIH1cblxuICAgIGdldENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICByZWZlcmVuY2VzKG1vZGVsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRUaHJvdWdoTW9kZWxOYW1lKGZpZWxkTmFtZSwgbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGluc3RhbGxzRm9yd2FyZHNWaXJ0dWFsRmllbGQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGluc3RhbGxzQmFja3dhcmRzVmlydHVhbEZpZWxkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWVsZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/Field.js\n");
/***/ }),
@@ -4594,7 +4616,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FieldInstallerTemplate\", function() { return FieldInstallerTemplate; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/**\n * Defines algorithm for installing a field onto a model and related models.\n * Conforms to the template method behavioral design pattern.\n * @private\n * @memberof module:fields\n */\nlet FieldInstallerTemplate = /*#__PURE__*/function () {\n function FieldInstallerTemplate(opts) {\n this.field = opts.field;\n this.fieldName = opts.fieldName;\n this.model = opts.model;\n this.orm = opts.orm;\n /**\n * the field itself has no knowledge of the model\n * it is being installed upon; we need to inform it\n * that it is a self-referencing field for the field\n * to be able to make better informed decisions\n */\n\n if (this.field.references(this.model)) {\n this.field.toModelName = \"this\";\n }\n }\n\n var _proto = FieldInstallerTemplate.prototype;\n\n _proto.run = function run() {\n this.installForwardsDescriptor();\n\n if (this.field.installsForwardsVirtualField) {\n this.installForwardsVirtualField();\n }\n /**\n * Install a backwards field on a model as a consequence\n * of having installed the forwards field on another model.\n */\n\n\n if (this.field.installsBackwardsDescriptor) {\n this.installBackwardsDescriptor();\n }\n\n if (this.field.installsBackwardsVirtualField) {\n this.installBackwardsVirtualField();\n }\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(FieldInstallerTemplate, [{\n key: \"toModel\",\n get: function () {\n if (typeof this._toModel === \"undefined\") {\n const {\n toModelName\n } = this.field;\n\n if (!toModelName) {\n this._toModel = null;\n } else if (toModelName === \"this\") {\n this._toModel = this.model;\n } else {\n this._toModel = this.orm.get(toModelName);\n }\n }\n\n return this._toModel;\n }\n }, {\n key: \"throughModel\",\n get: function () {\n if (typeof this._throughModel === \"undefined\") {\n const throughModelName = this.field.getThroughModelName(this.fieldName, this.model);\n\n if (!throughModelName) {\n this._throughModel = null;\n } else {\n this._throughModel = this.orm.get(throughModelName);\n }\n }\n\n return this._throughModel;\n }\n }, {\n key: \"backwardsFieldName\",\n get: function () {\n return this.field.getBackwardsFieldName(this.model);\n }\n }]);\n\n return FieldInstallerTemplate;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (FieldInstallerTemplate);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRmllbGRJbnN0YWxsZXJUZW1wbGF0ZS5qcz9jZGFiIl0sIm5hbWVzIjpbIkZpZWxkSW5zdGFsbGVyVGVtcGxhdGUiLCJvcHRzIiwiZmllbGQiLCJmaWVsZE5hbWUiLCJtb2RlbCIsIm9ybSIsInJlZmVyZW5jZXMiLCJ0b01vZGVsTmFtZSIsInJ1biIsImluc3RhbGxGb3J3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsc0ZvcndhcmRzVmlydHVhbEZpZWxkIiwiaW5zdGFsbEZvcndhcmRzVmlydHVhbEZpZWxkIiwiaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yIiwiaW5zdGFsbEJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsc0JhY2t3YXJkc1ZpcnR1YWxGaWVsZCIsImluc3RhbGxCYWNrd2FyZHNWaXJ0dWFsRmllbGQiLCJfdG9Nb2RlbCIsImdldCIsIl90aHJvdWdoTW9kZWwiLCJ0aHJvdWdoTW9kZWxOYW1lIiwiZ2V0VGhyb3VnaE1vZGVsTmFtZSIsImdldEJhY2t3YXJkc0ZpZWxkTmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7OztBQU1PLElBQU1BLHNCQUFiO0FBQ0ksa0NBQVlDLElBQVosRUFBa0I7QUFDZCxTQUFLQyxLQUFMLEdBQWFELElBQUksQ0FBQ0MsS0FBbEI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCRixJQUFJLENBQUNFLFNBQXRCO0FBQ0EsU0FBS0MsS0FBTCxHQUFhSCxJQUFJLENBQUNHLEtBQWxCO0FBQ0EsU0FBS0MsR0FBTCxHQUFXSixJQUFJLENBQUNJLEdBQWhCO0FBQ0E7Ozs7Ozs7QUFNQSxRQUFJLEtBQUtILEtBQUwsQ0FBV0ksVUFBWCxDQUFzQixLQUFLRixLQUEzQixDQUFKLEVBQXVDO0FBQ25DLFdBQUtGLEtBQUwsQ0FBV0ssV0FBWCxHQUF5QixNQUF6QjtBQUNIO0FBQ0o7O0FBZkw7O0FBQUEsU0FrRElDLEdBbERKLEdBa0RJLGVBQU07QUFDRixTQUFLQyx5QkFBTDs7QUFDQSxRQUFJLEtBQUtQLEtBQUwsQ0FBV1EsNEJBQWYsRUFBNkM7QUFDekMsV0FBS0MsMkJBQUw7QUFDSDtBQUNEOzs7Ozs7QUFJQSxRQUFJLEtBQUtULEtBQUwsQ0FBV1UsMkJBQWYsRUFBNEM7QUFDeEMsV0FBS0MsMEJBQUw7QUFDSDs7QUFDRCxRQUFJLEtBQUtYLEtBQUwsQ0FBV1ksNkJBQWYsRUFBOEM7QUFDMUMsV0FBS0MsNEJBQUw7QUFDSDtBQUNKLEdBakVMOztBQUFBO0FBQUE7QUFBQSxxQkFpQmtCO0FBQ1YsVUFBSSxPQUFPLEtBQUtDLFFBQVosS0FBeUIsV0FBN0IsRUFBMEM7QUFDdEMsY0FBTTtBQUFFVDtBQUFGLFlBQWtCLEtBQUtMLEtBQTdCOztBQUNBLFlBQUksQ0FBQ0ssV0FBTCxFQUFrQjtBQUNkLGVBQUtTLFFBQUwsR0FBZ0IsSUFBaEI7QUFDSCxTQUZELE1BRU8sSUFBSVQsV0FBVyxLQUFLLE1BQXBCLEVBQTRCO0FBQy9CLGVBQUtTLFFBQUwsR0FBZ0IsS0FBS1osS0FBckI7QUFDSCxTQUZNLE1BRUE7QUFDSCxlQUFLWSxRQUFMLEdBQWdCLEtBQUtYLEdBQUwsQ0FBU1ksR0FBVCxDQUFhVixXQUFiLENBQWhCO0FBQ0g7QUFDSjs7QUFDRCxhQUFPLEtBQUtTLFFBQVo7QUFDSDtBQTdCTDtBQUFBO0FBQUEscUJBK0J1QjtBQUNmLFVBQUksT0FBTyxLQUFLRSxhQUFaLEtBQThCLFdBQWxDLEVBQStDO0FBQzNDLGNBQU1DLGdCQUFnQixHQUFHLEtBQUtqQixLQUFMLENBQVdrQixtQkFBWCxDQUNyQixLQUFLakIsU0FEZ0IsRUFFckIsS0FBS0MsS0FGZ0IsQ0FBekI7O0FBSUEsWUFBSSxDQUFDZSxnQkFBTCxFQUF1QjtBQUNuQixlQUFLRCxhQUFMLEdBQXFCLElBQXJCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZUFBS0EsYUFBTCxHQUFxQixLQUFLYixHQUFMLENBQVNZLEdBQVQsQ0FBYUUsZ0JBQWIsQ0FBckI7QUFDSDtBQUNKOztBQUNELGFBQU8sS0FBS0QsYUFBWjtBQUNIO0FBNUNMO0FBQUE7QUFBQSxxQkE4QzZCO0FBQ3JCLGFBQU8sS0FBS2hCLEtBQUwsQ0FBV21CLHFCQUFYLENBQWlDLEtBQUtqQixLQUF0QyxDQUFQO0FBQ0g7QUFoREw7O0FBQUE7QUFBQTtBQW9FZUoscUZBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL0ZpZWxkSW5zdGFsbGVyVGVtcGxhdGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmluZXMgYWxnb3JpdGhtIGZvciBpbnN0YWxsaW5nIGEgZmllbGQgb250byBhIG1vZGVsIGFuZCByZWxhdGVkIG1vZGVscy5cbiAqIENvbmZvcm1zIHRvIHRoZSB0ZW1wbGF0ZSBtZXRob2QgYmVoYXZpb3JhbCBkZXNpZ24gcGF0dGVybi5cbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgRmllbGRJbnN0YWxsZXJUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB0aGlzLmZpZWxkID0gb3B0cy5maWVsZDtcbiAgICAgICAgdGhpcy5maWVsZE5hbWUgPSBvcHRzLmZpZWxkTmFtZTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG9wdHMubW9kZWw7XG4gICAgICAgIHRoaXMub3JtID0gb3B0cy5vcm07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgZmllbGQgaXRzZWxmIGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIG1vZGVsXG4gICAgICAgICAqIGl0IGlzIGJlaW5nIGluc3RhbGxlZCB1cG9uOyB3ZSBuZWVkIHRvIGluZm9ybSBpdFxuICAgICAgICAgKiB0aGF0IGl0IGlzIGEgc2VsZi1yZWZlcmVuY2luZyBmaWVsZCBmb3IgdGhlIGZpZWxkXG4gICAgICAgICAqIHRvIGJlIGFibGUgdG8gbWFrZSBiZXR0ZXIgaW5mb3JtZWQgZGVjaXNpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5maWVsZC5yZWZlcmVuY2VzKHRoaXMubW9kZWwpKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLnRvTW9kZWxOYW1lID0gXCJ0aGlzXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgdG9Nb2RlbCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90b01vZGVsID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRvTW9kZWxOYW1lIH0gPSB0aGlzLmZpZWxkO1xuICAgICAgICAgICAgaWYgKCF0b01vZGVsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RvTW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b01vZGVsTmFtZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90b01vZGVsID0gdGhpcy5tb2RlbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9Nb2RlbCA9IHRoaXMub3JtLmdldCh0b01vZGVsTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvTW9kZWw7XG4gICAgfVxuXG4gICAgZ2V0IHRocm91Z2hNb2RlbCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90aHJvdWdoTW9kZWwgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRocm91Z2hNb2RlbE5hbWUgPSB0aGlzLmZpZWxkLmdldFRocm91Z2hNb2RlbE5hbWUoXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGhyb3VnaE1vZGVsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm91Z2hNb2RlbCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm91Z2hNb2RlbCA9IHRoaXMub3JtLmdldCh0aHJvdWdoTW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3VnaE1vZGVsO1xuICAgIH1cblxuICAgIGdldCBiYWNrd2FyZHNGaWVsZE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmdldEJhY2t3YXJkc0ZpZWxkTmFtZSh0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBydW4oKSB7XG4gICAgICAgIHRoaXMuaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvcigpO1xuICAgICAgICBpZiAodGhpcy5maWVsZC5pbnN0YWxsc0ZvcndhcmRzVmlydHVhbEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbGxGb3J3YXJkc1ZpcnR1YWxGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnN0YWxsIGEgYmFja3dhcmRzIGZpZWxkIG9uIGEgbW9kZWwgYXMgYSBjb25zZXF1ZW5jZVxuICAgICAgICAgKiBvZiBoYXZpbmcgaW5zdGFsbGVkIHRoZSBmb3J3YXJkcyBmaWVsZCBvbiBhbm90aGVyIG1vZGVsLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZmllbGQuaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbGxCYWNrd2FyZHNEZXNjcmlwdG9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmllbGQuaW5zdGFsbHNCYWNrd2FyZHNWaXJ0dWFsRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbEJhY2t3YXJkc1ZpcnR1YWxGaWVsZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWVsZEluc3RhbGxlclRlbXBsYXRlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/FieldInstallerTemplate.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FieldInstallerTemplate\", function() { return FieldInstallerTemplate; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/**\n * Defines algorithm for installing a field onto a model and related models.\n * Conforms to the template method behavioral design pattern.\n * @private\n * @memberof module:fields\n */\nlet FieldInstallerTemplate = /*#__PURE__*/function () {\n function FieldInstallerTemplate(opts) {\n this.field = opts.field;\n this.fieldName = opts.fieldName;\n this.model = opts.model;\n this.orm = opts.orm;\n /**\n * the field itself has no knowledge of the model\n * it is being installed upon; we need to inform it\n * that it is a self-referencing field for the field\n * to be able to make better informed decisions\n */\n\n if (this.field.references(this.model)) {\n this.field.toModelName = \"this\";\n }\n }\n\n var _proto = FieldInstallerTemplate.prototype;\n\n _proto.run = function run() {\n this.installForwardsDescriptor();\n\n if (this.field.installsForwardsVirtualField) {\n this.installForwardsVirtualField();\n }\n /**\n * Install a backwards field on a model as a consequence\n * of having installed the forwards field on another model.\n */\n\n\n if (this.field.installsBackwardsDescriptor) {\n this.installBackwardsDescriptor();\n }\n\n if (this.field.installsBackwardsVirtualField) {\n this.installBackwardsVirtualField();\n }\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(FieldInstallerTemplate, [{\n key: \"toModel\",\n get: function () {\n if (typeof this._toModel === \"undefined\") {\n const {\n toModelName\n } = this.field;\n\n if (!toModelName) {\n this._toModel = null;\n } else if (toModelName === \"this\") {\n this._toModel = this.model;\n } else {\n this._toModel = this.orm.get(toModelName);\n }\n }\n\n return this._toModel;\n }\n }, {\n key: \"throughModel\",\n get: function () {\n if (typeof this._throughModel === \"undefined\") {\n const throughModelName = this.field.getThroughModelName(this.fieldName, this.model);\n\n if (!throughModelName) {\n this._throughModel = null;\n } else {\n this._throughModel = this.orm.get(throughModelName);\n }\n }\n\n return this._throughModel;\n }\n }, {\n key: \"backwardsFieldName\",\n get: function () {\n return this.field.getBackwardsFieldName(this.model);\n }\n }]);\n\n return FieldInstallerTemplate;\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (FieldInstallerTemplate);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRmllbGRJbnN0YWxsZXJUZW1wbGF0ZS5qcz9jZGFiIl0sIm5hbWVzIjpbIkZpZWxkSW5zdGFsbGVyVGVtcGxhdGUiLCJvcHRzIiwiZmllbGQiLCJmaWVsZE5hbWUiLCJtb2RlbCIsIm9ybSIsInJlZmVyZW5jZXMiLCJ0b01vZGVsTmFtZSIsInJ1biIsImluc3RhbGxGb3J3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsc0ZvcndhcmRzVmlydHVhbEZpZWxkIiwiaW5zdGFsbEZvcndhcmRzVmlydHVhbEZpZWxkIiwiaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yIiwiaW5zdGFsbEJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJpbnN0YWxsc0JhY2t3YXJkc1ZpcnR1YWxGaWVsZCIsImluc3RhbGxCYWNrd2FyZHNWaXJ0dWFsRmllbGQiLCJfdG9Nb2RlbCIsImdldCIsIl90aHJvdWdoTW9kZWwiLCJ0aHJvdWdoTW9kZWxOYW1lIiwiZ2V0VGhyb3VnaE1vZGVsTmFtZSIsImdldEJhY2t3YXJkc0ZpZWxkTmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBTUEsc0JBQWI7QUFDSSxrQ0FBWUMsSUFBWixFQUFrQjtBQUNkLFNBQUtDLEtBQUwsR0FBYUQsSUFBSSxDQUFDQyxLQUFsQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUJGLElBQUksQ0FBQ0UsU0FBdEI7QUFDQSxTQUFLQyxLQUFMLEdBQWFILElBQUksQ0FBQ0csS0FBbEI7QUFDQSxTQUFLQyxHQUFMLEdBQVdKLElBQUksQ0FBQ0ksR0FBaEI7QUFDQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ1EsUUFBSSxLQUFLSCxLQUFMLENBQVdJLFVBQVgsQ0FBc0IsS0FBS0YsS0FBM0IsQ0FBSixFQUF1QztBQUNuQyxXQUFLRixLQUFMLENBQVdLLFdBQVgsR0FBeUIsTUFBekI7QUFDSDtBQUNKOztBQWZMOztBQUFBLFNBa0RJQyxHQWxESixHQWtESSxlQUFNO0FBQ0YsU0FBS0MseUJBQUw7O0FBQ0EsUUFBSSxLQUFLUCxLQUFMLENBQVdRLDRCQUFmLEVBQTZDO0FBQ3pDLFdBQUtDLDJCQUFMO0FBQ0g7QUFDRDtBQUNSO0FBQ0E7QUFDQTs7O0FBQ1EsUUFBSSxLQUFLVCxLQUFMLENBQVdVLDJCQUFmLEVBQTRDO0FBQ3hDLFdBQUtDLDBCQUFMO0FBQ0g7O0FBQ0QsUUFBSSxLQUFLWCxLQUFMLENBQVdZLDZCQUFmLEVBQThDO0FBQzFDLFdBQUtDLDRCQUFMO0FBQ0g7QUFDSixHQWpFTDs7QUFBQTtBQUFBO0FBQUEsU0FpQkksWUFBYztBQUNWLFVBQUksT0FBTyxLQUFLQyxRQUFaLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3RDLGNBQU07QUFBRVQ7QUFBRixZQUFrQixLQUFLTCxLQUE3Qjs7QUFDQSxZQUFJLENBQUNLLFdBQUwsRUFBa0I7QUFDZCxlQUFLUyxRQUFMLEdBQWdCLElBQWhCO0FBQ0gsU0FGRCxNQUVPLElBQUlULFdBQVcsS0FBSyxNQUFwQixFQUE0QjtBQUMvQixlQUFLUyxRQUFMLEdBQWdCLEtBQUtaLEtBQXJCO0FBQ0gsU0FGTSxNQUVBO0FBQ0gsZUFBS1ksUUFBTCxHQUFnQixLQUFLWCxHQUFMLENBQVNZLEdBQVQsQ0FBYVYsV0FBYixDQUFoQjtBQUNIO0FBQ0o7O0FBQ0QsYUFBTyxLQUFLUyxRQUFaO0FBQ0g7QUE3Qkw7QUFBQTtBQUFBLFNBK0JJLFlBQW1CO0FBQ2YsVUFBSSxPQUFPLEtBQUtFLGFBQVosS0FBOEIsV0FBbEMsRUFBK0M7QUFDM0MsY0FBTUMsZ0JBQWdCLEdBQUcsS0FBS2pCLEtBQUwsQ0FBV2tCLG1CQUFYLENBQ3JCLEtBQUtqQixTQURnQixFQUVyQixLQUFLQyxLQUZnQixDQUF6Qjs7QUFJQSxZQUFJLENBQUNlLGdCQUFMLEVBQXVCO0FBQ25CLGVBQUtELGFBQUwsR0FBcUIsSUFBckI7QUFDSCxTQUZELE1BRU87QUFDSCxlQUFLQSxhQUFMLEdBQXFCLEtBQUtiLEdBQUwsQ0FBU1ksR0FBVCxDQUFhRSxnQkFBYixDQUFyQjtBQUNIO0FBQ0o7O0FBQ0QsYUFBTyxLQUFLRCxhQUFaO0FBQ0g7QUE1Q0w7QUFBQTtBQUFBLFNBOENJLFlBQXlCO0FBQ3JCLGFBQU8sS0FBS2hCLEtBQUwsQ0FBV21CLHFCQUFYLENBQWlDLEtBQUtqQixLQUF0QyxDQUFQO0FBQ0g7QUFoREw7O0FBQUE7QUFBQTtBQW9FZUoscUZBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL0ZpZWxkSW5zdGFsbGVyVGVtcGxhdGUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmluZXMgYWxnb3JpdGhtIGZvciBpbnN0YWxsaW5nIGEgZmllbGQgb250byBhIG1vZGVsIGFuZCByZWxhdGVkIG1vZGVscy5cbiAqIENvbmZvcm1zIHRvIHRoZSB0ZW1wbGF0ZSBtZXRob2QgYmVoYXZpb3JhbCBkZXNpZ24gcGF0dGVybi5cbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgRmllbGRJbnN0YWxsZXJUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB0aGlzLmZpZWxkID0gb3B0cy5maWVsZDtcbiAgICAgICAgdGhpcy5maWVsZE5hbWUgPSBvcHRzLmZpZWxkTmFtZTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG9wdHMubW9kZWw7XG4gICAgICAgIHRoaXMub3JtID0gb3B0cy5vcm07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgZmllbGQgaXRzZWxmIGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIG1vZGVsXG4gICAgICAgICAqIGl0IGlzIGJlaW5nIGluc3RhbGxlZCB1cG9uOyB3ZSBuZWVkIHRvIGluZm9ybSBpdFxuICAgICAgICAgKiB0aGF0IGl0IGlzIGEgc2VsZi1yZWZlcmVuY2luZyBmaWVsZCBmb3IgdGhlIGZpZWxkXG4gICAgICAgICAqIHRvIGJlIGFibGUgdG8gbWFrZSBiZXR0ZXIgaW5mb3JtZWQgZGVjaXNpb25zXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5maWVsZC5yZWZlcmVuY2VzKHRoaXMubW9kZWwpKSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkLnRvTW9kZWxOYW1lID0gXCJ0aGlzXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgdG9Nb2RlbCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90b01vZGVsID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRvTW9kZWxOYW1lIH0gPSB0aGlzLmZpZWxkO1xuICAgICAgICAgICAgaWYgKCF0b01vZGVsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RvTW9kZWwgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b01vZGVsTmFtZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90b01vZGVsID0gdGhpcy5tb2RlbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG9Nb2RlbCA9IHRoaXMub3JtLmdldCh0b01vZGVsTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvTW9kZWw7XG4gICAgfVxuXG4gICAgZ2V0IHRocm91Z2hNb2RlbCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90aHJvdWdoTW9kZWwgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRocm91Z2hNb2RlbE5hbWUgPSB0aGlzLmZpZWxkLmdldFRocm91Z2hNb2RlbE5hbWUoXG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGhyb3VnaE1vZGVsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm91Z2hNb2RlbCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm91Z2hNb2RlbCA9IHRoaXMub3JtLmdldCh0aHJvdWdoTW9kZWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3VnaE1vZGVsO1xuICAgIH1cblxuICAgIGdldCBiYWNrd2FyZHNGaWVsZE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkLmdldEJhY2t3YXJkc0ZpZWxkTmFtZSh0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBydW4oKSB7XG4gICAgICAgIHRoaXMuaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvcigpO1xuICAgICAgICBpZiAodGhpcy5maWVsZC5pbnN0YWxsc0ZvcndhcmRzVmlydHVhbEZpZWxkKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbGxGb3J3YXJkc1ZpcnR1YWxGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnN0YWxsIGEgYmFja3dhcmRzIGZpZWxkIG9uIGEgbW9kZWwgYXMgYSBjb25zZXF1ZW5jZVxuICAgICAgICAgKiBvZiBoYXZpbmcgaW5zdGFsbGVkIHRoZSBmb3J3YXJkcyBmaWVsZCBvbiBhbm90aGVyIG1vZGVsLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZmllbGQuaW5zdGFsbHNCYWNrd2FyZHNEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbGxCYWNrd2FyZHNEZXNjcmlwdG9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmllbGQuaW5zdGFsbHNCYWNrd2FyZHNWaXJ0dWFsRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbEJhY2t3YXJkc1ZpcnR1YWxGaWVsZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWVsZEluc3RhbGxlclRlbXBsYXRlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/FieldInstallerTemplate.js\n");
/***/ }),
@@ -4606,7 +4628,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ForeignKey\", function() { return ForeignKey; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet ForeignKey = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ForeignKey, _RelationalField);\n\n function ForeignKey() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = ForeignKey.prototype;\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"forwardsManyToOneDescriptor\"])(fieldName, toModel.modelName);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"backwardsManyToOneDescriptor\"])(fieldName, model.modelName);\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ForeignKey, [{\n key: \"index\",\n get: function () {\n return true;\n }\n }]);\n\n return ForeignKey;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ForeignKey);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRm9yZWlnbktleS5qcz9lMjVlIl0sIm5hbWVzIjpbIkZvcmVpZ25LZXkiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJmaWVsZE5hbWUiLCJtb2RlbCIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJmb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3IiLCJtb2RlbE5hbWUiLCJjcmVhdGVCYWNrd2FyZHNEZXNjcmlwdG9yIiwiYmFja3dhcmRzTWFueVRvT25lRGVzY3JpcHRvciIsIlJlbGF0aW9uYWxGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFLQTs7OztBQUdPLElBQU1BLFVBQWI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUEsU0FDSUMsd0JBREosR0FDSSxrQ0FBeUJDLFNBQXpCLEVBQW9DQyxLQUFwQyxFQUEyQ0MsT0FBM0MsRUFBb0RDLFlBQXBELEVBQWtFO0FBQzlELFdBQU9DLGdGQUEyQixDQUFDSixTQUFELEVBQVlFLE9BQU8sQ0FBQ0csU0FBcEIsQ0FBbEM7QUFDSCxHQUhMOztBQUFBLFNBS0lDLHlCQUxKLEdBS0ksbUNBQTBCTixTQUExQixFQUFxQ0MsS0FBckMsRUFBNENDLE9BQTVDLEVBQXFEQyxZQUFyRCxFQUFtRTtBQUMvRCxXQUFPSSxpRkFBNEIsQ0FBQ1AsU0FBRCxFQUFZQyxLQUFLLENBQUNJLFNBQWxCLENBQW5DO0FBQ0gsR0FQTDs7QUFBQTtBQUFBO0FBQUEscUJBU2dCO0FBQ1IsYUFBTyxJQUFQO0FBQ0g7QUFYTDs7QUFBQTtBQUFBLEVBQWdDRyx3REFBaEM7QUFjZVYseUVBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL0ZvcmVpZ25LZXkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVsYXRpb25hbEZpZWxkIGZyb20gXCIuL1JlbGF0aW9uYWxGaWVsZFwiO1xuXG5pbXBvcnQge1xuICAgIGZvcndhcmRzTWFueVRvT25lRGVzY3JpcHRvcixcbiAgICBiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yLFxufSBmcm9tIFwiLi4vZGVzY3JpcHRvcnNcIjtcblxuLyoqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgRm9yZWlnbktleSBleHRlbmRzIFJlbGF0aW9uYWxGaWVsZCB7XG4gICAgY3JlYXRlRm9yd2FyZHNEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICByZXR1cm4gZm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgdG9Nb2RlbC5tb2RlbE5hbWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBiYWNrd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICBnZXQgaW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9yZWlnbktleTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/ForeignKey.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ForeignKey\", function() { return ForeignKey; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet ForeignKey = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ForeignKey, _RelationalField);\n\n function ForeignKey() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = ForeignKey.prototype;\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"forwardsManyToOneDescriptor\"])(fieldName, toModel.modelName);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"backwardsManyToOneDescriptor\"])(fieldName, model.modelName);\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ForeignKey, [{\n key: \"index\",\n get: function () {\n return true;\n }\n }]);\n\n return ForeignKey;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ForeignKey);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvRm9yZWlnbktleS5qcz9lMjVlIl0sIm5hbWVzIjpbIkZvcmVpZ25LZXkiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJmaWVsZE5hbWUiLCJtb2RlbCIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJmb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3IiLCJtb2RlbE5hbWUiLCJjcmVhdGVCYWNrd2FyZHNEZXNjcmlwdG9yIiwiYmFja3dhcmRzTWFueVRvT25lRGVzY3JpcHRvciIsIlJlbGF0aW9uYWxGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7O0FBQ08sSUFBTUEsVUFBYjtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQSxTQUNJQyx3QkFESixHQUNJLGtDQUF5QkMsU0FBekIsRUFBb0NDLEtBQXBDLEVBQTJDQyxPQUEzQyxFQUFvREMsWUFBcEQsRUFBa0U7QUFDOUQsV0FBT0MsZ0ZBQTJCLENBQUNKLFNBQUQsRUFBWUUsT0FBTyxDQUFDRyxTQUFwQixDQUFsQztBQUNILEdBSEw7O0FBQUEsU0FLSUMseUJBTEosR0FLSSxtQ0FBMEJOLFNBQTFCLEVBQXFDQyxLQUFyQyxFQUE0Q0MsT0FBNUMsRUFBcURDLFlBQXJELEVBQW1FO0FBQy9ELFdBQU9JLGlGQUE0QixDQUFDUCxTQUFELEVBQVlDLEtBQUssQ0FBQ0ksU0FBbEIsQ0FBbkM7QUFDSCxHQVBMOztBQUFBO0FBQUE7QUFBQSxTQVNJLFlBQVk7QUFDUixhQUFPLElBQVA7QUFDSDtBQVhMOztBQUFBO0FBQUEsRUFBZ0NHLHdEQUFoQztBQWNlVix5RUFBZiIsImZpbGUiOiIuL3NyYy9maWVsZHMvRm9yZWlnbktleS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWxhdGlvbmFsRmllbGQgZnJvbSBcIi4vUmVsYXRpb25hbEZpZWxkXCI7XG5cbmltcG9ydCB7XG4gICAgZm9yd2FyZHNNYW55VG9PbmVEZXNjcmlwdG9yLFxuICAgIGJhY2t3YXJkc01hbnlUb09uZURlc2NyaXB0b3IsXG59IGZyb20gXCIuLi9kZXNjcmlwdG9yc1wiO1xuXG4vKipcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmllbGRzXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3JlaWduS2V5IGV4dGVuZHMgUmVsYXRpb25hbEZpZWxkIHtcbiAgICBjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBmb3J3YXJkc01hbnlUb09uZURlc2NyaXB0b3IoZmllbGROYW1lLCB0b01vZGVsLm1vZGVsTmFtZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQmFja3dhcmRzRGVzY3JpcHRvcihmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIGJhY2t3YXJkc01hbnlUb09uZURlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbC5tb2RlbE5hbWUpO1xuICAgIH1cblxuICAgIGdldCBpbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGb3JlaWduS2V5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/ForeignKey.js\n");
/***/ }),
@@ -4618,7 +4640,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ManyToMany\", function() { return ManyToMany; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet ManyToMany = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ManyToMany, _RelationalField);\n\n function ManyToMany() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = ManyToMany.prototype;\n\n _proto.getDefault = function getDefault() {\n return [];\n };\n\n _proto.getThroughModelName = function getThroughModelName(fieldName, model) {\n return this.through || Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mName\"])(model.modelName, fieldName);\n };\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"manyToManyDescriptor\"])(model.modelName, toModel.modelName, throughModel.modelName, this.getThroughFields(fieldName, model, toModel, throughModel), false);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"manyToManyDescriptor\"])(model.modelName, toModel.modelName, throughModel.modelName, this.getThroughFields(fieldName, model, toModel, throughModel), true);\n };\n\n _proto.createBackwardsVirtualField = function createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: model.modelName,\n relatedName: fieldName,\n through: throughModel.modelName,\n throughFields: this.getThroughFields(fieldName, model, toModel, throughModel)\n });\n };\n\n _proto.createForwardsVirtualField = function createForwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: toModel.modelName,\n relatedName: fieldName,\n through: this.through,\n throughFields: this.getThroughFields(fieldName, model, toModel, throughModel),\n as: this.as\n });\n };\n\n _proto.getThroughFields = function getThroughFields(fieldName, model, toModel, throughModel) {\n if (this.throughFields) {\n const [fieldAName, fieldBName] = this.throughFields;\n const fieldA = throughModel.fields[fieldAName];\n return {\n to: fieldA.references(toModel) ? fieldAName : fieldBName,\n from: fieldA.references(toModel) ? fieldBName : fieldAName\n };\n }\n\n if (model.modelName === toModel.modelName) {\n /**\n * we have no way of determining the relationship's\n * direction here, so we need to assume that the user\n * did not use a custom through model\n * see ORM#registerManyToManyModelsFor\n */\n return {\n to: Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mToFieldName\"])(toModel.modelName),\n from: Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mFromFieldName\"])(model.modelName)\n };\n }\n /**\n * determine which field references which model\n * and infer the directions from that\n */\n\n\n const throughModelFieldReferencing = otherModel => Object.keys(throughModel.fields).find(someFieldName => throughModel.fields[someFieldName].references(otherModel));\n\n return {\n to: throughModelFieldReferencing(toModel),\n from: throughModelFieldReferencing(model)\n };\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ManyToMany, [{\n key: \"installsForwardsVirtualField\",\n get: function () {\n return true;\n }\n }]);\n\n return ManyToMany;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ManyToMany);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvTWFueVRvTWFueS5qcz9mMmNkIl0sIm5hbWVzIjpbIk1hbnlUb01hbnkiLCJnZXREZWZhdWx0IiwiZ2V0VGhyb3VnaE1vZGVsTmFtZSIsImZpZWxkTmFtZSIsIm1vZGVsIiwidGhyb3VnaCIsIm0ybU5hbWUiLCJtb2RlbE5hbWUiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJ0b01vZGVsIiwidGhyb3VnaE1vZGVsIiwibWFueVRvTWFueURlc2NyaXB0b3IiLCJnZXRUaHJvdWdoRmllbGRzIiwiY3JlYXRlQmFja3dhcmRzRGVzY3JpcHRvciIsImNyZWF0ZUJhY2t3YXJkc1ZpcnR1YWxGaWVsZCIsIlRoaXNGaWVsZCIsImdldENsYXNzIiwidG8iLCJyZWxhdGVkTmFtZSIsInRocm91Z2hGaWVsZHMiLCJjcmVhdGVGb3J3YXJkc1ZpcnR1YWxGaWVsZCIsImFzIiwiZmllbGRBTmFtZSIsImZpZWxkQk5hbWUiLCJmaWVsZEEiLCJmaWVsZHMiLCJyZWZlcmVuY2VzIiwiZnJvbSIsIm0ybVRvRmllbGROYW1lIiwibTJtRnJvbUZpZWxkTmFtZSIsInRocm91Z2hNb2RlbEZpZWxkUmVmZXJlbmNpbmciLCJvdGhlck1vZGVsIiwiT2JqZWN0Iiwia2V5cyIsImZpbmQiLCJzb21lRmllbGROYW1lIiwiUmVsYXRpb25hbEZpZWxkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFFQTtBQUVBOzs7O0FBR08sSUFBTUEsVUFBYjtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQSxTQUNJQyxVQURKLEdBQ0ksc0JBQWE7QUFDVCxXQUFPLEVBQVA7QUFDSCxHQUhMOztBQUFBLFNBS0lDLG1CQUxKLEdBS0ksNkJBQW9CQyxTQUFwQixFQUErQkMsS0FBL0IsRUFBc0M7QUFDbEMsV0FBTyxLQUFLQyxPQUFMLElBQWdCQyxzREFBTyxDQUFDRixLQUFLLENBQUNHLFNBQVAsRUFBa0JKLFNBQWxCLENBQTlCO0FBQ0gsR0FQTDs7QUFBQSxTQVNJSyx3QkFUSixHQVNJLGtDQUF5QkwsU0FBekIsRUFBb0NDLEtBQXBDLEVBQTJDSyxPQUEzQyxFQUFvREMsWUFBcEQsRUFBa0U7QUFDOUQsV0FBT0MseUVBQW9CLENBQ3ZCUCxLQUFLLENBQUNHLFNBRGlCLEVBRXZCRSxPQUFPLENBQUNGLFNBRmUsRUFHdkJHLFlBQVksQ0FBQ0gsU0FIVSxFQUl2QixLQUFLSyxnQkFBTCxDQUFzQlQsU0FBdEIsRUFBaUNDLEtBQWpDLEVBQXdDSyxPQUF4QyxFQUFpREMsWUFBakQsQ0FKdUIsRUFLdkIsS0FMdUIsQ0FBM0I7QUFPSCxHQWpCTDs7QUFBQSxTQW1CSUcseUJBbkJKLEdBbUJJLG1DQUEwQlYsU0FBMUIsRUFBcUNDLEtBQXJDLEVBQTRDSyxPQUE1QyxFQUFxREMsWUFBckQsRUFBbUU7QUFDL0QsV0FBT0MseUVBQW9CLENBQ3ZCUCxLQUFLLENBQUNHLFNBRGlCLEVBRXZCRSxPQUFPLENBQUNGLFNBRmUsRUFHdkJHLFlBQVksQ0FBQ0gsU0FIVSxFQUl2QixLQUFLSyxnQkFBTCxDQUFzQlQsU0FBdEIsRUFBaUNDLEtBQWpDLEVBQXdDSyxPQUF4QyxFQUFpREMsWUFBakQsQ0FKdUIsRUFLdkIsSUFMdUIsQ0FBM0I7QUFPSCxHQTNCTDs7QUFBQSxTQTZCSUksMkJBN0JKLEdBNkJJLHFDQUE0QlgsU0FBNUIsRUFBdUNDLEtBQXZDLEVBQThDSyxPQUE5QyxFQUF1REMsWUFBdkQsRUFBcUU7QUFDakUsVUFBTUssU0FBUyxHQUFHLEtBQUtDLFFBQUwsRUFBbEI7QUFDQSxXQUFPLElBQUlELFNBQUosQ0FBYztBQUNqQkUsUUFBRSxFQUFFYixLQUFLLENBQUNHLFNBRE87QUFFakJXLGlCQUFXLEVBQUVmLFNBRkk7QUFHakJFLGFBQU8sRUFBRUssWUFBWSxDQUFDSCxTQUhMO0FBSWpCWSxtQkFBYSxFQUFFLEtBQUtQLGdCQUFMLENBQ1hULFNBRFcsRUFFWEMsS0FGVyxFQUdYSyxPQUhXLEVBSVhDLFlBSlc7QUFKRSxLQUFkLENBQVA7QUFXSCxHQTFDTDs7QUFBQSxTQTRDSVUsMEJBNUNKLEdBNENJLG9DQUEyQmpCLFNBQTNCLEVBQXNDQyxLQUF0QyxFQUE2Q0ssT0FBN0MsRUFBc0RDLFlBQXRELEVBQW9FO0FBQ2hFLFVBQU1LLFNBQVMsR0FBRyxLQUFLQyxRQUFMLEVBQWxCO0FBQ0EsV0FBTyxJQUFJRCxTQUFKLENBQWM7QUFDakJFLFFBQUUsRUFBRVIsT0FBTyxDQUFDRixTQURLO0FBRWpCVyxpQkFBVyxFQUFFZixTQUZJO0FBR2pCRSxhQUFPLEVBQUUsS0FBS0EsT0FIRztBQUlqQmMsbUJBQWEsRUFBRSxLQUFLUCxnQkFBTCxDQUNYVCxTQURXLEVBRVhDLEtBRlcsRUFHWEssT0FIVyxFQUlYQyxZQUpXLENBSkU7QUFVakJXLFFBQUUsRUFBRSxLQUFLQTtBQVZRLEtBQWQsQ0FBUDtBQVlILEdBMURMOztBQUFBLFNBZ0VJVCxnQkFoRUosR0FnRUksMEJBQWlCVCxTQUFqQixFQUE0QkMsS0FBNUIsRUFBbUNLLE9BQW5DLEVBQTRDQyxZQUE1QyxFQUEwRDtBQUN0RCxRQUFJLEtBQUtTLGFBQVQsRUFBd0I7QUFDcEIsWUFBTSxDQUFDRyxVQUFELEVBQWFDLFVBQWIsSUFBMkIsS0FBS0osYUFBdEM7QUFDQSxZQUFNSyxNQUFNLEdBQUdkLFlBQVksQ0FBQ2UsTUFBYixDQUFvQkgsVUFBcEIsQ0FBZjtBQUNBLGFBQU87QUFDSEwsVUFBRSxFQUFFTyxNQUFNLENBQUNFLFVBQVAsQ0FBa0JqQixPQUFsQixJQUE2QmEsVUFBN0IsR0FBMENDLFVBRDNDO0FBRUhJLFlBQUksRUFBRUgsTUFBTSxDQUFDRSxVQUFQLENBQWtCakIsT0FBbEIsSUFBNkJjLFVBQTdCLEdBQTBDRDtBQUY3QyxPQUFQO0FBSUg7O0FBRUQsUUFBSWxCLEtBQUssQ0FBQ0csU0FBTixLQUFvQkUsT0FBTyxDQUFDRixTQUFoQyxFQUEyQztBQUN2Qzs7Ozs7O0FBTUEsYUFBTztBQUNIVSxVQUFFLEVBQUVXLDZEQUFjLENBQUNuQixPQUFPLENBQUNGLFNBQVQsQ0FEZjtBQUVIb0IsWUFBSSxFQUFFRSwrREFBZ0IsQ0FBQ3pCLEtBQUssQ0FBQ0csU0FBUDtBQUZuQixPQUFQO0FBSUg7QUFFRDs7Ozs7O0FBSUEsVUFBTXVCLDRCQUE0QixHQUFHQyxVQUFVLElBQzNDQyxNQUFNLENBQUNDLElBQVAsQ0FBWXZCLFlBQVksQ0FBQ2UsTUFBekIsRUFBaUNTLElBQWpDLENBQXNDQyxhQUFhLElBQy9DekIsWUFBWSxDQUFDZSxNQUFiLENBQW9CVSxhQUFwQixFQUFtQ1QsVUFBbkMsQ0FBOENLLFVBQTlDLENBREosQ0FESjs7QUFLQSxXQUFPO0FBQ0hkLFFBQUUsRUFBRWEsNEJBQTRCLENBQUNyQixPQUFELENBRDdCO0FBRUhrQixVQUFJLEVBQUVHLDRCQUE0QixDQUFDMUIsS0FBRDtBQUYvQixLQUFQO0FBSUgsR0FwR0w7O0FBQUE7QUFBQTtBQUFBLHFCQTREdUM7QUFDL0IsYUFBTyxJQUFQO0FBQ0g7QUE5REw7O0FBQUE7QUFBQSxFQUFnQ2dDLHdEQUFoQztBQXVHZXBDLHlFQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9NYW55VG9NYW55LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlbGF0aW9uYWxGaWVsZCBmcm9tIFwiLi9SZWxhdGlvbmFsRmllbGRcIjtcblxuaW1wb3J0IHsgbWFueVRvTWFueURlc2NyaXB0b3IgfSBmcm9tIFwiLi4vZGVzY3JpcHRvcnNcIjtcblxuaW1wb3J0IHsgbTJtTmFtZSwgbTJtVG9GaWVsZE5hbWUsIG0ybUZyb21GaWVsZE5hbWUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgTWFueVRvTWFueSBleHRlbmRzIFJlbGF0aW9uYWxGaWVsZCB7XG4gICAgZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGdldFRocm91Z2hNb2RlbE5hbWUoZmllbGROYW1lLCBtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJvdWdoIHx8IG0ybU5hbWUobW9kZWwubW9kZWxOYW1lLCBmaWVsZE5hbWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvcihmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIG1hbnlUb01hbnlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgbW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgdG9Nb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICB0aHJvdWdoTW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgdGhpcy5nZXRUaHJvdWdoRmllbGRzKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBtYW55VG9NYW55RGVzY3JpcHRvcihcbiAgICAgICAgICAgIG1vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHRvTW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgdGhyb3VnaE1vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHRoaXMuZ2V0VGhyb3VnaEZpZWxkcyhmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNyZWF0ZUJhY2t3YXJkc1ZpcnR1YWxGaWVsZChmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgY29uc3QgVGhpc0ZpZWxkID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXNGaWVsZCh7XG4gICAgICAgICAgICB0bzogbW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgcmVsYXRlZE5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHRocm91Z2g6IHRocm91Z2hNb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICB0aHJvdWdoRmllbGRzOiB0aGlzLmdldFRocm91Z2hGaWVsZHMoXG4gICAgICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIHRvTW9kZWwsXG4gICAgICAgICAgICAgICAgdGhyb3VnaE1vZGVsXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVGb3J3YXJkc1ZpcnR1YWxGaWVsZChmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgY29uc3QgVGhpc0ZpZWxkID0gdGhpcy5nZXRDbGFzcygpO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXNGaWVsZCh7XG4gICAgICAgICAgICB0bzogdG9Nb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICByZWxhdGVkTmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgdGhyb3VnaDogdGhpcy50aHJvdWdoLFxuICAgICAgICAgICAgdGhyb3VnaEZpZWxkczogdGhpcy5nZXRUaHJvdWdoRmllbGRzKFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICB0b01vZGVsLFxuICAgICAgICAgICAgICAgIHRocm91Z2hNb2RlbFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGFzOiB0aGlzLmFzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgaW5zdGFsbHNGb3J3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0VGhyb3VnaEZpZWxkcyhmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3VnaEZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgW2ZpZWxkQU5hbWUsIGZpZWxkQk5hbWVdID0gdGhpcy50aHJvdWdoRmllbGRzO1xuICAgICAgICAgICAgY29uc3QgZmllbGRBID0gdGhyb3VnaE1vZGVsLmZpZWxkc1tmaWVsZEFOYW1lXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG86IGZpZWxkQS5yZWZlcmVuY2VzKHRvTW9kZWwpID8gZmllbGRBTmFtZSA6IGZpZWxkQk5hbWUsXG4gICAgICAgICAgICAgICAgZnJvbTogZmllbGRBLnJlZmVyZW5jZXModG9Nb2RlbCkgPyBmaWVsZEJOYW1lIDogZmllbGRBTmFtZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWwubW9kZWxOYW1lID09PSB0b01vZGVsLm1vZGVsTmFtZSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB3ZSBoYXZlIG5vIHdheSBvZiBkZXRlcm1pbmluZyB0aGUgcmVsYXRpb25zaGlwJ3NcbiAgICAgICAgICAgICAqIGRpcmVjdGlvbiBoZXJlLCBzbyB3ZSBuZWVkIHRvIGFzc3VtZSB0aGF0IHRoZSB1c2VyXG4gICAgICAgICAgICAgKiBkaWQgbm90IHVzZSBhIGN1c3RvbSB0aHJvdWdoIG1vZGVsXG4gICAgICAgICAgICAgKiBzZWUgT1JNI3JlZ2lzdGVyTWFueVRvTWFueU1vZGVsc0ZvclxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvOiBtMm1Ub0ZpZWxkTmFtZSh0b01vZGVsLm1vZGVsTmFtZSksXG4gICAgICAgICAgICAgICAgZnJvbTogbTJtRnJvbUZpZWxkTmFtZShtb2RlbC5tb2RlbE5hbWUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkZXRlcm1pbmUgd2hpY2ggZmllbGQgcmVmZXJlbmNlcyB3aGljaCBtb2RlbFxuICAgICAgICAgKiBhbmQgaW5mZXIgdGhlIGRpcmVjdGlvbnMgZnJvbSB0aGF0XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCB0aHJvdWdoTW9kZWxGaWVsZFJlZmVyZW5jaW5nID0gb3RoZXJNb2RlbCA9PlxuICAgICAgICAgICAgT2JqZWN0LmtleXModGhyb3VnaE1vZGVsLmZpZWxkcykuZmluZChzb21lRmllbGROYW1lID0+XG4gICAgICAgICAgICAgICAgdGhyb3VnaE1vZGVsLmZpZWxkc1tzb21lRmllbGROYW1lXS5yZWZlcmVuY2VzKG90aGVyTW9kZWwpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0bzogdGhyb3VnaE1vZGVsRmllbGRSZWZlcmVuY2luZyh0b01vZGVsKSxcbiAgICAgICAgICAgIGZyb206IHRocm91Z2hNb2RlbEZpZWxkUmVmZXJlbmNpbmcobW9kZWwpLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFueVRvTWFueTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/ManyToMany.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ManyToMany\", function() { return ManyToMany; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet ManyToMany = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ManyToMany, _RelationalField);\n\n function ManyToMany() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = ManyToMany.prototype;\n\n _proto.getDefault = function getDefault() {\n return [];\n };\n\n _proto.getThroughModelName = function getThroughModelName(fieldName, model) {\n return this.through || Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mName\"])(model.modelName, fieldName);\n };\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"manyToManyDescriptor\"])(model.modelName, toModel.modelName, throughModel.modelName, this.getThroughFields(fieldName, model, toModel, throughModel), false);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_3__[\"manyToManyDescriptor\"])(model.modelName, toModel.modelName, throughModel.modelName, this.getThroughFields(fieldName, model, toModel, throughModel), true);\n };\n\n _proto.createBackwardsVirtualField = function createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: model.modelName,\n relatedName: fieldName,\n through: throughModel.modelName,\n throughFields: this.getThroughFields(fieldName, model, toModel, throughModel)\n });\n };\n\n _proto.createForwardsVirtualField = function createForwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: toModel.modelName,\n relatedName: fieldName,\n through: this.through,\n throughFields: this.getThroughFields(fieldName, model, toModel, throughModel),\n as: this.as\n });\n };\n\n _proto.getThroughFields = function getThroughFields(fieldName, model, toModel, throughModel) {\n if (this.throughFields) {\n const [fieldAName, fieldBName] = this.throughFields;\n const fieldA = throughModel.fields[fieldAName];\n return {\n to: fieldA.references(toModel) ? fieldAName : fieldBName,\n from: fieldA.references(toModel) ? fieldBName : fieldAName\n };\n }\n\n if (model.modelName === toModel.modelName) {\n /**\n * we have no way of determining the relationship's\n * direction here, so we need to assume that the user\n * did not use a custom through model\n * see ORM#registerManyToManyModelsFor\n */\n return {\n to: Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mToFieldName\"])(toModel.modelName),\n from: Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"m2mFromFieldName\"])(model.modelName)\n };\n }\n /**\n * determine which field references which model\n * and infer the directions from that\n */\n\n\n const throughModelFieldReferencing = otherModel => Object.keys(throughModel.fields).find(someFieldName => throughModel.fields[someFieldName].references(otherModel));\n\n return {\n to: throughModelFieldReferencing(toModel),\n from: throughModelFieldReferencing(model)\n };\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ManyToMany, [{\n key: \"installsForwardsVirtualField\",\n get: function () {\n return true;\n }\n }]);\n\n return ManyToMany;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (ManyToMany);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvTWFueVRvTWFueS5qcz9mMmNkIl0sIm5hbWVzIjpbIk1hbnlUb01hbnkiLCJnZXREZWZhdWx0IiwiZ2V0VGhyb3VnaE1vZGVsTmFtZSIsImZpZWxkTmFtZSIsIm1vZGVsIiwidGhyb3VnaCIsIm0ybU5hbWUiLCJtb2RlbE5hbWUiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJ0b01vZGVsIiwidGhyb3VnaE1vZGVsIiwibWFueVRvTWFueURlc2NyaXB0b3IiLCJnZXRUaHJvdWdoRmllbGRzIiwiY3JlYXRlQmFja3dhcmRzRGVzY3JpcHRvciIsImNyZWF0ZUJhY2t3YXJkc1ZpcnR1YWxGaWVsZCIsIlRoaXNGaWVsZCIsImdldENsYXNzIiwidG8iLCJyZWxhdGVkTmFtZSIsInRocm91Z2hGaWVsZHMiLCJjcmVhdGVGb3J3YXJkc1ZpcnR1YWxGaWVsZCIsImFzIiwiZmllbGRBTmFtZSIsImZpZWxkQk5hbWUiLCJmaWVsZEEiLCJmaWVsZHMiLCJyZWZlcmVuY2VzIiwiZnJvbSIsIm0ybVRvRmllbGROYW1lIiwibTJtRnJvbUZpZWxkTmFtZSIsInRocm91Z2hNb2RlbEZpZWxkUmVmZXJlbmNpbmciLCJvdGhlck1vZGVsIiwiT2JqZWN0Iiwia2V5cyIsImZpbmQiLCJzb21lRmllbGROYW1lIiwiUmVsYXRpb25hbEZpZWxkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFDTyxJQUFNQSxVQUFiO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBLFNBQ0lDLFVBREosR0FDSSxzQkFBYTtBQUNULFdBQU8sRUFBUDtBQUNILEdBSEw7O0FBQUEsU0FLSUMsbUJBTEosR0FLSSw2QkFBb0JDLFNBQXBCLEVBQStCQyxLQUEvQixFQUFzQztBQUNsQyxXQUFPLEtBQUtDLE9BQUwsSUFBZ0JDLHNEQUFPLENBQUNGLEtBQUssQ0FBQ0csU0FBUCxFQUFr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bkIsT0FBTyxDQUFDRixTQUFULENBRGY7QUFFSG9CLFlBQUksRUFBRUUsK0RBQWdCLENBQUN6QixLQUFLLENBQUNHLFNBQVA7QUFGbkIsT0FBUDtBQUlIO0FBRUQ7QUFDUjtBQUNBO0FBQ0E7OztBQUNRLFVBQU11Qiw0QkFBNEIsR0FBSUMsVUFBRCxJQUNqQ0MsTUFBTSxDQUFDQyxJQUFQLENBQVl2QixZQUFZLENBQUNlLE1BQXpCLEVBQWlDUyxJQUFqQyxDQUF1Q0MsYUFBRCxJQUNsQ3pCLFlBQVksQ0FBQ2UsTUFBYixDQUFvQlUsYUFBcEIsRUFBbUNULFVBQW5DLENBQThDSyxVQUE5QyxDQURKLENBREo7O0FBS0EsV0FBTztBQUNIZCxRQUFFLEVBQUVhLDRCQUE0QixDQUFDckIsT0FBRCxDQUQ3QjtBQUVIa0IsVUFBSSxFQUFFRyw0QkFBNEIsQ0FBQzFCLEtBQUQ7QUFGL0IsS0FBUDtBQUlILEdBcEdMOztBQUFBO0FBQUE7QUFBQSxTQTRESSxZQUFtQztBQUMvQixhQUFPLElBQVA7QUFDSDtBQTlETDs7QUFBQTtBQUFBLEVBQWdDZ0Msd0RBQWhDO0FBdUdlcEMseUVBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL01hbnlUb01hbnkuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVsYXRpb25hbEZpZWxkIGZyb20gXCIuL1JlbGF0aW9uYWxGaWVsZFwiO1xuXG5pbXBvcnQgeyBtYW55VG9NYW55RGVzY3JpcHRvciB9IGZyb20gXCIuLi9kZXNjcmlwdG9yc1wiO1xuXG5pbXBvcnQgeyBtMm1OYW1lLCBtMm1Ub0ZpZWxkTmFtZSwgbTJtRnJvbUZpZWxkTmFtZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmllbGRzXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW55VG9NYW55IGV4dGVuZHMgUmVsYXRpb25hbEZpZWxkIHtcbiAgICBnZXREZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZ2V0VGhyb3VnaE1vZGVsTmFtZShmaWVsZE5hbWUsIG1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocm91Z2ggfHwgbTJtTmFtZShtb2RlbC5tb2RlbE5hbWUsIGZpZWxkTmFtZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlRm9yd2FyZHNEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICByZXR1cm4gbWFueVRvTWFueURlc2NyaXB0b3IoXG4gICAgICAgICAgICBtb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICB0b01vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHRocm91Z2hNb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICB0aGlzLmdldFRocm91Z2hGaWVsZHMoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY3JlYXRlQmFja3dhcmRzRGVzY3JpcHRvcihmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIG1hbnlUb01hbnlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgbW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgdG9Nb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICB0aHJvdWdoTW9kZWwubW9kZWxOYW1lLFxuICAgICAgICAgICAgdGhpcy5nZXRUaHJvdWdoRmllbGRzKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCksXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY3JlYXRlQmFja3dhcmRzVmlydHVhbEZpZWxkKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICBjb25zdCBUaGlzRmllbGQgPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGhpc0ZpZWxkKHtcbiAgICAgICAgICAgIHRvOiBtb2RlbC5tb2RlbE5hbWUsXG4gICAgICAgICAgICByZWxhdGVkTmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgdGhyb3VnaDogdGhyb3VnaE1vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHRocm91Z2hGaWVsZHM6IHRoaXMuZ2V0VGhyb3VnaEZpZWxkcyhcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgdG9Nb2RlbCxcbiAgICAgICAgICAgICAgICB0aHJvdWdoTW9kZWxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZUZvcndhcmRzVmlydHVhbEZpZWxkKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICBjb25zdCBUaGlzRmllbGQgPSB0aGlzLmdldENsYXNzKCk7XG4gICAgICAgIHJldHVybiBuZXcgVGhpc0ZpZWxkKHtcbiAgICAgICAgICAgIHRvOiB0b01vZGVsLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlbGF0ZWROYW1lOiBmaWVsZE5hbWUsXG4gICAgICAgICAgICB0aHJvdWdoOiB0aGlzLnRocm91Z2gsXG4gICAgICAgICAgICB0aHJvdWdoRmllbGRzOiB0aGlzLmdldFRocm91Z2hGaWVsZHMoXG4gICAgICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIHRvTW9kZWwsXG4gICAgICAgICAgICAgICAgdGhyb3VnaE1vZGVsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYXM6IHRoaXMuYXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsc0ZvcndhcmRzVmlydHVhbEZpZWxkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRUaHJvdWdoRmllbGRzKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvdWdoRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBbZmllbGRBTmFtZSwgZmllbGRCTmFtZV0gPSB0aGlzLnRocm91Z2hGaWVsZHM7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEEgPSB0aHJvdWdoTW9kZWwuZmllbGRzW2ZpZWxkQU5hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0bzogZmllbGRBLnJlZmVyZW5jZXModG9Nb2RlbCkgPyBmaWVsZEFOYW1lIDogZmllbGRCTmFtZSxcbiAgICAgICAgICAgICAgICBmcm9tOiBmaWVsZEEucmVmZXJlbmNlcyh0b01vZGVsKSA/IGZpZWxkQk5hbWUgOiBmaWVsZEFOYW1lLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RlbC5tb2RlbE5hbWUgPT09IHRvTW9kZWwubW9kZWxOYW1lKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHdlIGhhdmUgbm8gd2F5IG9mIGRldGVybWluaW5nIHRoZSByZWxhdGlvbnNoaXAnc1xuICAgICAgICAgICAgICogZGlyZWN0aW9uIGhlcmUsIHNvIHdlIG5lZWQgdG8gYXNzdW1lIHRoYXQgdGhlIHVzZXJcbiAgICAgICAgICAgICAqIGRpZCBub3QgdXNlIGEgY3VzdG9tIHRocm91Z2ggbW9kZWxcbiAgICAgICAgICAgICAqIHNlZSBPUk0jcmVnaXN0ZXJNYW55VG9NYW55TW9kZWxzRm9yXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG86IG0ybVRvRmllbGROYW1lKHRvTW9kZWwubW9kZWxOYW1lKSxcbiAgICAgICAgICAgICAgICBmcm9tOiBtMm1Gcm9tRmllbGROYW1lKG1vZGVsLm1vZGVsTmFtZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRldGVybWluZSB3aGljaCBmaWVsZCByZWZlcmVuY2VzIHdoaWNoIG1vZGVsXG4gICAgICAgICAqIGFuZCBpbmZlciB0aGUgZGlyZWN0aW9ucyBmcm9tIHRoYXRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHRocm91Z2hNb2RlbEZpZWxkUmVmZXJlbmNpbmcgPSAob3RoZXJNb2RlbCkgPT5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRocm91Z2hNb2RlbC5maWVsZHMpLmZpbmQoKHNvbWVGaWVsZE5hbWUpID0+XG4gICAgICAgICAgICAgICAgdGhyb3VnaE1vZGVsLmZpZWxkc1tzb21lRmllbGROYW1lXS5yZWZlcmVuY2VzKG90aGVyTW9kZWwpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0bzogdGhyb3VnaE1vZGVsRmllbGRSZWZlcmVuY2luZyh0b01vZGVsKSxcbiAgICAgICAgICAgIGZyb206IHRocm91Z2hNb2RlbEZpZWxkUmVmZXJlbmNpbmcobW9kZWwpLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFueVRvTWFueTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/ManyToMany.js\n");
/***/ }),
@@ -4630,7 +4652,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OneToOne\", function() { return OneToOne; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet OneToOne = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(OneToOne, _RelationalField);\n\n function OneToOne() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = OneToOne.prototype;\n\n _proto.getBackwardsFieldName = function getBackwardsFieldName(model) {\n return this.relatedName || model.modelName.toLowerCase();\n };\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"forwardsOneToOneDescriptor\"])(fieldName, toModel.modelName);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"backwardsOneToOneDescriptor\"])(fieldName, model.modelName);\n };\n\n return OneToOne;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (OneToOne);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvT25lVG9PbmUuanM/YzllZSJdLCJuYW1lcyI6WyJPbmVUb09uZSIsImdldEJhY2t3YXJkc0ZpZWxkTmFtZSIsIm1vZGVsIiwicmVsYXRlZE5hbWUiLCJtb2RlbE5hbWUiLCJ0b0xvd2VyQ2FzZSIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsImZpZWxkTmFtZSIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvciIsImNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJiYWNrd2FyZHNPbmVUb09uZURlc2NyaXB0b3IiLCJSZWxhdGlvbmFsRmllbGQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVBO0FBS0E7Ozs7QUFHTyxJQUFNQSxRQUFiO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBLFNBQ0lDLHFCQURKLEdBQ0ksK0JBQXNCQyxLQUF0QixFQUE2QjtBQUN6QixXQUFPLEtBQUtDLFdBQUwsSUFBb0JELEtBQUssQ0FBQ0UsU0FBTixDQUFnQkMsV0FBaEIsRUFBM0I7QUFDSCxHQUhMOztBQUFBLFNBS0lDLHdCQUxKLEdBS0ksa0NBQXlCQyxTQUF6QixFQUFvQ0wsS0FBcEMsRUFBMkNNLE9BQTNDLEVBQW9EQyxZQUFwRCxFQUFrRTtBQUM5RCxXQUFPQywrRUFBMEIsQ0FBQ0gsU0FBRCxFQUFZQyxPQUFPLENBQUNKLFNBQXBCLENBQWpDO0FBQ0gsR0FQTDs7QUFBQSxTQVNJTyx5QkFUSixHQVNJLG1DQUEwQkosU0FBMUIsRUFBcUNMLEtBQXJDLEVBQTRDTSxPQUE1QyxFQUFxREMsWUFBckQsRUFBbUU7QUFDL0QsV0FBT0csZ0ZBQTJCLENBQUNMLFNBQUQsRUFBWUwsS0FBSyxDQUFDRSxTQUFsQixDQUFsQztBQUNILEdBWEw7O0FBQUE7QUFBQSxFQUE4QlMsd0RBQTlCO0FBY2ViLHVFQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9PbmVUb09uZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWxhdGlvbmFsRmllbGQgZnJvbSBcIi4vUmVsYXRpb25hbEZpZWxkXCI7XG5cbmltcG9ydCB7XG4gICAgZm9yd2FyZHNPbmVUb09uZURlc2NyaXB0b3IsXG4gICAgYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yLFxufSBmcm9tIFwiLi4vZGVzY3JpcHRvcnNcIjtcblxuLyoqXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgT25lVG9PbmUgZXh0ZW5kcyBSZWxhdGlvbmFsRmllbGQge1xuICAgIGdldEJhY2t3YXJkc0ZpZWxkTmFtZShtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkTmFtZSB8fCBtb2RlbC5tb2RlbE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcihmaWVsZE5hbWUsIHRvTW9kZWwubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCYWNrd2FyZHNEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwsIHRvTW9kZWwsIHRocm91Z2hNb2RlbCkge1xuICAgICAgICByZXR1cm4gYmFja3dhcmRzT25lVG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgbW9kZWwubW9kZWxOYW1lKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9uZVRvT25lO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/OneToOne.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OneToOne\", function() { return OneToOne; });\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _RelationalField__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _descriptors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../descriptors */ \"./src/descriptors.js\");\n\n\n\n/**\n * @memberof module:fields\n */\n\nlet OneToOne = /*#__PURE__*/function (_RelationalField) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0___default()(OneToOne, _RelationalField);\n\n function OneToOne() {\n return _RelationalField.apply(this, arguments) || this;\n }\n\n var _proto = OneToOne.prototype;\n\n _proto.getBackwardsFieldName = function getBackwardsFieldName(model) {\n return this.relatedName || model.modelName.toLowerCase();\n };\n\n _proto.createForwardsDescriptor = function createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"forwardsOneToOneDescriptor\"])(fieldName, toModel.modelName);\n };\n\n _proto.createBackwardsDescriptor = function createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return Object(_descriptors__WEBPACK_IMPORTED_MODULE_2__[\"backwardsOneToOneDescriptor\"])(fieldName, model.modelName);\n };\n\n return OneToOne;\n}(_RelationalField__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (OneToOne);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvT25lVG9PbmUuanM/YzllZSJdLCJuYW1lcyI6WyJPbmVUb09uZSIsImdldEJhY2t3YXJkc0ZpZWxkTmFtZSIsIm1vZGVsIiwicmVsYXRlZE5hbWUiLCJtb2RlbE5hbWUiLCJ0b0xvd2VyQ2FzZSIsImNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvciIsImZpZWxkTmFtZSIsInRvTW9kZWwiLCJ0aHJvdWdoTW9kZWwiLCJmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvciIsImNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IiLCJiYWNrd2FyZHNPbmVUb09uZURlc2NyaXB0b3IiLCJSZWxhdGlvbmFsRmllbGQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVBO0FBS0E7QUFDQTtBQUNBOztBQUNPLElBQU1BLFFBQWI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUEsU0FDSUMscUJBREosR0FDSSwrQkFBc0JDLEtBQXRCLEVBQTZCO0FBQ3pCLFdBQU8sS0FBS0MsV0FBTCxJQUFvQkQsS0FBSyxDQUFDRSxTQUFOLENBQWdCQyxXQUFoQixFQUEzQjtBQUNILEdBSEw7O0FBQUEsU0FLSUMsd0JBTEosR0FLSSxrQ0FBeUJDLFNBQXpCLEVBQW9DTCxLQUFwQyxFQUEyQ00sT0FBM0MsRUFBb0RDLFlBQXBELEVBQWtFO0FBQzlELFdBQU9DLCtFQUEwQixDQUFDSCxTQUFELEVBQVlDLE9BQU8sQ0FBQ0osU0FBcEIsQ0FBakM7QUFDSCxHQVBMOztBQUFBLFNBU0lPLHlCQVRKLEdBU0ksbUNBQTBCSixTQUExQixFQUFxQ0wsS0FBckMsRUFBNENNLE9BQTVDLEVBQXFEQyxZQUFyRCxFQUFtRTtBQUMvRCxXQUFPRyxnRkFBMkIsQ0FBQ0wsU0FBRCxFQUFZTCxLQUFLLENBQUNFLFNBQWxCLENBQWxDO0FBQ0gsR0FYTDs7QUFBQTtBQUFBLEVBQThCUyx3REFBOUI7QUFjZWIsdUVBQWYiLCJmaWxlIjoiLi9zcmMvZmllbGRzL09uZVRvT25lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlbGF0aW9uYWxGaWVsZCBmcm9tIFwiLi9SZWxhdGlvbmFsRmllbGRcIjtcblxuaW1wb3J0IHtcbiAgICBmb3J3YXJkc09uZVRvT25lRGVzY3JpcHRvcixcbiAgICBiYWNrd2FyZHNPbmVUb09uZURlc2NyaXB0b3IsXG59IGZyb20gXCIuLi9kZXNjcmlwdG9yc1wiO1xuXG4vKipcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZmllbGRzXG4gKi9cbmV4cG9ydCBjbGFzcyBPbmVUb09uZSBleHRlbmRzIFJlbGF0aW9uYWxGaWVsZCB7XG4gICAgZ2V0QmFja3dhcmRzRmllbGROYW1lKG1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWROYW1lIHx8IG1vZGVsLm1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvcihmaWVsZE5hbWUsIG1vZGVsLCB0b01vZGVsLCB0aHJvdWdoTW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIGZvcndhcmRzT25lVG9PbmVEZXNjcmlwdG9yKGZpZWxkTmFtZSwgdG9Nb2RlbC5tb2RlbE5hbWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUJhY2t3YXJkc0Rlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIHJldHVybiBiYWNrd2FyZHNPbmVUb09uZURlc2NyaXB0b3IoZmllbGROYW1lLCBtb2RlbC5tb2RlbE5hbWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT25lVG9PbmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/fields/OneToOne.js\n");
/***/ }),
@@ -4642,7 +4664,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RelationalField\", function() { return RelationalField; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Field__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultFieldInstaller */ \"./src/fields/DefaultFieldInstaller.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n/* eslint-disable max-classes-per-file */\n\n\n\n/**\n * @private\n * @memberof module:fields\n */\n\nlet RelationalField = /*#__PURE__*/function (_Field) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(RelationalField, _Field);\n\n function RelationalField(...args) {\n var _this;\n\n _this = _Field.call(this) || this;\n\n if (args.length === 1 && typeof args[0] === \"object\") {\n const opts = args[0];\n _this.toModelName = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(opts.to);\n _this.relatedName = opts.relatedName;\n _this.through = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(opts.through);\n _this.throughFields = opts.throughFields;\n _this.as = opts.as;\n } else {\n [_this.toModelName, _this.relatedName] = [Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(args[0]), args[1]];\n }\n\n return _this;\n }\n\n var _proto = RelationalField.prototype;\n\n _proto.getBackwardsFieldName = function getBackwardsFieldName(model) {\n return this.relatedName || Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"reverseFieldName\"])(model.modelName);\n };\n\n _proto.createBackwardsVirtualField = function createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField(model.modelName, fieldName);\n };\n\n _proto.references = function references(model) {\n return this.toModelName === model.modelName;\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(RelationalField, [{\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return true;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return true;\n }\n }, {\n key: \"installerClass\",\n get: function () {\n return /*#__PURE__*/function (_DefaultFieldInstalle) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(AliasedForwardsDescriptorInstaller, _DefaultFieldInstalle);\n\n function AliasedForwardsDescriptorInstaller() {\n return _DefaultFieldInstalle.apply(this, arguments) || this;\n }\n\n var _proto2 = AliasedForwardsDescriptorInstaller.prototype;\n\n _proto2.installForwardsDescriptor = function installForwardsDescriptor() {\n Object.defineProperty(this.model.prototype, this.field.as || this.fieldName, // use supplied name if possible\n this.field.createForwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n return AliasedForwardsDescriptorInstaller;\n }(_DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n }\n }]);\n\n return RelationalField;\n}(_Field__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (RelationalField);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvUmVsYXRpb25hbEZpZWxkLmpzPzQzMDQiXSwibmFtZXMiOlsiUmVsYXRpb25hbEZpZWxkIiwiYXJncyIsImxlbmd0aCIsIm9wdHMiLCJ0b01vZGVsTmFtZSIsIm5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlIiwidG8iLCJyZWxhdGVkTmFtZSIsInRocm91Z2giLCJ0aHJvdWdoRmllbGRzIiwiYXMiLCJnZXRCYWNrd2FyZHNGaWVsZE5hbWUiLCJtb2RlbCIsInJldmVyc2VGaWVsZE5hbWUiLCJtb2RlbE5hbWUiLCJjcmVhdGVCYWNrd2FyZHNWaXJ0dWFsRmllbGQiLCJmaWVsZE5hbWUiLCJ0b01vZGVsIiwidGhyb3VnaE1vZGVsIiwiVGhpc0ZpZWxkIiwiZ2V0Q2xhc3MiLCJyZWZlcmVuY2VzIiwiaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwicHJvdG90eXBlIiwiZmllbGQiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJEZWZhdWx0RmllbGRJbnN0YWxsZXIiLCJGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7QUFJTyxJQUFNQSxlQUFiO0FBQUE7O0FBQ0ksMkJBQVksR0FBR0MsSUFBZixFQUFxQjtBQUFBOztBQUNqQjs7QUFDQSxRQUFJQSxJQUFJLENBQUNDLE1BQUwsS0FBZ0IsQ0FBaEIsSUFBcUIsT0FBT0QsSUFBSSxDQUFDLENBQUQsQ0FBWCxLQUFtQixRQUE1QyxFQUFzRDtBQUNsRCxZQUFNRSxJQUFJLEdBQUdGLElBQUksQ0FBQyxDQUFELENBQWpCO0FBQ0EsWUFBS0csV0FBTCxHQUFtQkMsc0VBQXVCLENBQUNGLElBQUksQ0FBQ0csRUFBTixDQUExQztBQUNBLFlBQUtDLFdBQUwsR0FBbUJKLElBQUksQ0FBQ0ksV0FBeEI7QUFDQSxZQUFLQyxPQUFMLEdBQWVILHNFQUF1QixDQUFDRixJQUFJLENBQUNLLE9BQU4sQ0FBdEM7QUFDQSxZQUFLQyxhQUFMLEdBQXFCTixJQUFJLENBQUNNLGFBQTFCO0FBQ0EsWUFBS0MsRUFBTCxHQUFVUCxJQUFJLENBQUNPLEVBQWY7QUFDSCxLQVBELE1BT087QUFDSCxPQUFDLE1BQUtOLFdBQU4sRUFBbUIsTUFBS0csV0FBeEIsSUFBdUMsQ0FDbkNGLHNFQUF1QixDQUFDSixJQUFJLENBQUMsQ0FBRCxDQUFMLENBRFksRUFFbkNBLElBQUksQ0FBQyxDQUFELENBRitCLENBQXZDO0FBSUg7O0FBZGdCO0FBZXBCOztBQWhCTDs7QUFBQSxTQWtCSVUscUJBbEJKLEdBa0JJLCtCQUFzQkMsS0FBdEIsRUFBNkI7QUFDekIsV0FBTyxLQUFLTCxXQUFMLElBQW9CTSwrREFBZ0IsQ0FBQ0QsS0FBSyxDQUFDRSxTQUFQLENBQTNDO0FBQ0gsR0FwQkw7O0FBQUEsU0FzQklDLDJCQXRCSixHQXNCSSxxQ0FBNEJDLFNBQTVCLEVBQXVDSixLQUF2QyxFQUE4Q0ssT0FBOUMsRUFBdURDLFlBQXZELEVBQXFFO0FBQ2pFLFVBQU1DLFNBQVMsR0FBRyxLQUFLQyxRQUFMLEVBQWxCO0FBQ0EsV0FBTyxJQUFJRCxTQUFKLENBQWNQLEtBQUssQ0FBQ0UsU0FBcEIsRUFBK0JFLFNBQS9CLENBQVA7QUFDSCxHQXpCTDs7QUFBQSxTQW1DSUssVUFuQ0osR0FtQ0ksb0JBQVdULEtBQVgsRUFBa0I7QUFDZCxXQUFPLEtBQUtSLFdBQUwsS0FBcUJRLEtBQUssQ0FBQ0UsU0FBbEM7QUFDSCxHQXJDTDs7QUFBQTtBQUFBO0FBQUEscUJBMkJ3QztBQUNoQyxhQUFPLElBQVA7QUFDSDtBQTdCTDtBQUFBO0FBQUEscUJBK0JzQztBQUM5QixhQUFPLElBQVA7QUFDSDtBQWpDTDtBQUFBO0FBQUEscUJBdUN5QjtBQUNqQjtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQSxnQkFDSVEseUJBREosR0FDSSxxQ0FBNEI7QUFDeEJDLGdCQUFNLENBQUNDLGNBQVAsQ0FDSSxLQUFLWixLQUFMLENBQVdhLFNBRGYsRUFFSSxLQUFLQyxLQUFMLENBQVdoQixFQUFYLElBQWlCLEtBQUtNLFNBRjFCLEVBRXFDO0FBQ2pDLGVBQUtVLEtBQUwsQ0FBV0Msd0JBQVgsQ0FDSSxLQUFLWCxTQURULEVBRUksS0FBS0osS0FGVCxFQUdJLEtBQUtLLE9BSFQsRUFJSSxLQUFLQyxZQUpULENBSEo7QUFVSCxTQVpMOztBQUFBO0FBQUEsUUFBd0RVLDhEQUF4RDtBQWNIO0FBdERMOztBQUFBO0FBQUEsRUFBcUNDLDhDQUFyQztBQXlEZTdCLDhFQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9SZWxhdGlvbmFsRmllbGQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuL0ZpZWxkXCI7XG5pbXBvcnQgRGVmYXVsdEZpZWxkSW5zdGFsbGVyIGZyb20gXCIuL0RlZmF1bHRGaWVsZEluc3RhbGxlclwiO1xuXG5pbXBvcnQgeyByZXZlcnNlRmllbGROYW1lLCBub3JtYWxpemVNb2RlbFJlZmVyZW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgUmVsYXRpb25hbEZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gYXJnc1swXTtcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbE5hbWUgPSBub3JtYWxpemVNb2RlbFJlZmVyZW5jZShvcHRzLnRvKTtcbiAgICAgICAgICAgIHRoaXMucmVsYXRlZE5hbWUgPSBvcHRzLnJlbGF0ZWROYW1lO1xuICAgICAgICAgICAgdGhpcy50aHJvdWdoID0gbm9ybWFsaXplTW9kZWxSZWZlcmVuY2Uob3B0cy50aHJvdWdoKTtcbiAgICAgICAgICAgIHRoaXMudGhyb3VnaEZpZWxkcyA9IG9wdHMudGhyb3VnaEZpZWxkcztcbiAgICAgICAgICAgIHRoaXMuYXMgPSBvcHRzLmFzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgW3RoaXMudG9Nb2RlbE5hbWUsIHRoaXMucmVsYXRlZE5hbWVdID0gW1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlKGFyZ3NbMF0pLFxuICAgICAgICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QmFja3dhcmRzRmllbGROYW1lKG1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWROYW1lIHx8IHJldmVyc2VGaWVsZE5hbWUobW9kZWwubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCYWNrd2FyZHNWaXJ0dWFsRmllbGQoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIGNvbnN0IFRoaXNGaWVsZCA9IHRoaXMuZ2V0Q2xhc3MoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzRmllbGQobW9kZWwubW9kZWxOYW1lLCBmaWVsZE5hbWUpO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsc0JhY2t3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IGluc3RhbGxzQmFja3dhcmRzRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVmZXJlbmNlcyhtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b01vZGVsTmFtZSA9PT0gbW9kZWwubW9kZWxOYW1lO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsZXJDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIEFsaWFzZWRGb3J3YXJkc0Rlc2NyaXB0b3JJbnN0YWxsZXIgZXh0ZW5kcyBEZWZhdWx0RmllbGRJbnN0YWxsZXIge1xuICAgICAgICAgICAgaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvcigpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLmFzIHx8IHRoaXMuZmllbGROYW1lLCAvLyB1c2Ugc3VwcGxpZWQgbmFtZSBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLmNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3VnaE1vZGVsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVsYXRpb25hbEZpZWxkO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/RelationalField.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RelationalField\", function() { return RelationalField; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Field__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Field */ \"./src/fields/Field.js\");\n/* harmony import */ var _DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./DefaultFieldInstaller */ \"./src/fields/DefaultFieldInstaller.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n\n\n\n/* eslint-disable max-classes-per-file */\n\n\n\n/**\n * @private\n * @memberof module:fields\n */\n\nlet RelationalField = /*#__PURE__*/function (_Field) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(RelationalField, _Field);\n\n function RelationalField(...args) {\n var _this;\n\n _this = _Field.call(this) || this;\n\n if (args.length === 1 && typeof args[0] === \"object\") {\n const opts = args[0];\n _this.toModelName = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(opts.to);\n _this.relatedName = opts.relatedName;\n _this.through = Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(opts.through);\n _this.throughFields = opts.throughFields;\n _this.as = opts.as;\n } else {\n [_this.toModelName, _this.relatedName] = [Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"normalizeModelReference\"])(args[0]), args[1]];\n }\n\n return _this;\n }\n\n var _proto = RelationalField.prototype;\n\n _proto.getBackwardsFieldName = function getBackwardsFieldName(model) {\n return this.relatedName || Object(_utils__WEBPACK_IMPORTED_MODULE_4__[\"reverseFieldName\"])(model.modelName);\n };\n\n _proto.createBackwardsVirtualField = function createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField(model.modelName, fieldName);\n };\n\n _proto.references = function references(model) {\n return this.toModelName === model.modelName;\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(RelationalField, [{\n key: \"installsBackwardsVirtualField\",\n get: function () {\n return true;\n }\n }, {\n key: \"installsBackwardsDescriptor\",\n get: function () {\n return true;\n }\n }, {\n key: \"installerClass\",\n get: function () {\n return /*#__PURE__*/function (_DefaultFieldInstalle) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(AliasedForwardsDescriptorInstaller, _DefaultFieldInstalle);\n\n function AliasedForwardsDescriptorInstaller() {\n return _DefaultFieldInstalle.apply(this, arguments) || this;\n }\n\n var _proto2 = AliasedForwardsDescriptorInstaller.prototype;\n\n _proto2.installForwardsDescriptor = function installForwardsDescriptor() {\n Object.defineProperty(this.model.prototype, this.field.as || this.fieldName, // use supplied name if possible\n this.field.createForwardsDescriptor(this.fieldName, this.model, this.toModel, this.throughModel));\n };\n\n return AliasedForwardsDescriptorInstaller;\n }(_DefaultFieldInstaller__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n }\n }]);\n\n return RelationalField;\n}(_Field__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (RelationalField);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvUmVsYXRpb25hbEZpZWxkLmpzPzQzMDQiXSwibmFtZXMiOlsiUmVsYXRpb25hbEZpZWxkIiwiYXJncyIsImxlbmd0aCIsIm9wdHMiLCJ0b01vZGVsTmFtZSIsIm5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlIiwidG8iLCJyZWxhdGVkTmFtZSIsInRocm91Z2giLCJ0aHJvdWdoRmllbGRzIiwiYXMiLCJnZXRCYWNrd2FyZHNGaWVsZE5hbWUiLCJtb2RlbCIsInJldmVyc2VGaWVsZE5hbWUiLCJtb2RlbE5hbWUiLCJjcmVhdGVCYWNrd2FyZHNWaXJ0dWFsRmllbGQiLCJmaWVsZE5hbWUiLCJ0b01vZGVsIiwidGhyb3VnaE1vZGVsIiwiVGhpc0ZpZWxkIiwiZ2V0Q2xhc3MiLCJyZWZlcmVuY2VzIiwiaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwicHJvdG90eXBlIiwiZmllbGQiLCJjcmVhdGVGb3J3YXJkc0Rlc2NyaXB0b3IiLCJEZWZhdWx0RmllbGRJbnN0YWxsZXIiLCJGaWVsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDTyxJQUFNQSxlQUFiO0FBQUE7O0FBQ0ksMkJBQVksR0FBR0MsSUFBZixFQUFxQjtBQUFBOztBQUNqQjs7QUFDQSxRQUFJQSxJQUFJLENBQUNDLE1BQUwsS0FBZ0IsQ0FBaEIsSUFBcUIsT0FBT0QsSUFBSSxDQUFDLENBQUQsQ0FBWCxLQUFtQixRQUE1QyxFQUFzRDtBQUNsRCxZQUFNRSxJQUFJLEdBQUdGLElBQUksQ0FBQyxDQUFELENBQWpCO0FBQ0EsWUFBS0csV0FBTCxHQUFtQkMsc0VBQXVCLENBQUNGLElBQUksQ0FBQ0csRUFBTixDQUExQztBQUNBLFlBQUtDLFdBQUwsR0FBbUJKLElBQUksQ0FBQ0ksV0FBeEI7QUFDQSxZQUFLQyxPQUFMLEdBQWVILHNFQUF1QixDQUFDRixJQUFJLENBQUNLLE9BQU4sQ0FBdEM7QUFDQSxZQUFLQyxhQUFMLEdBQXFCTixJQUFJLENBQUNNLGFBQTFCO0FBQ0EsWUFBS0MsRUFBTCxHQUFVUCxJQUFJLENBQUNPLEVBQWY7QUFDSCxLQVBELE1BT087QUFDSCxPQUFDLE1BQUtOLFdBQU4sRUFBbUIsTUFBS0csV0FBeEIsSUFBdUMsQ0FDbkNGLHNFQUF1QixDQUFDSixJQUFJLENBQUMsQ0FBRCxDQUFMLENBRFksRUFFbkNBLElBQUksQ0FBQyxDQUFELENBRitCLENBQXZDO0FBSUg7O0FBZGdCO0FBZXBCOztBQWhCTDs7QUFBQSxTQWtCSVUscUJBbEJKLEdBa0JJLCtCQUFzQkMsS0FBdEIsRUFBNkI7QUFDekIsV0FBTyxLQUFLTCxXQUFMLElBQW9CTSwrREFBZ0IsQ0FBQ0QsS0FBSyxDQUFDRSxTQUFQLENBQTNDO0FBQ0gsR0FwQkw7O0FBQUEsU0FzQklDLDJCQXRCSixHQXNCSSxxQ0FBNEJDLFNBQTVCLEVBQXVDSixLQUF2QyxFQUE4Q0ssT0FBOUMsRUFBdURDLFlBQXZELEVBQXFFO0FBQ2pFLFVBQU1DLFNBQVMsR0FBRyxLQUFLQyxRQUFMLEVBQWxCO0FBQ0EsV0FBTyxJQUFJRCxTQUFKLENBQWNQLEtBQUssQ0FBQ0UsU0FBcEIsRUFBK0JFLFNBQS9CLENBQVA7QUFDSCxHQXpCTDs7QUFBQSxTQW1DSUssVUFuQ0osR0FtQ0ksb0JBQVdULEtBQVgsRUFBa0I7QUFDZCxXQUFPLEtBQUtSLFdBQUwsS0FBcUJRLEtBQUssQ0FBQ0UsU0FBbEM7QUFDSCxHQXJDTDs7QUFBQTtBQUFBO0FBQUEsU0EyQkksWUFBb0M7QUFDaEMsYUFBTyxJQUFQO0FBQ0g7QUE3Qkw7QUFBQTtBQUFBLFNBK0JJLFlBQWtDO0FBQzlCLGFBQU8sSUFBUDtBQUNIO0FBakNMO0FBQUE7QUFBQSxTQXVDSSxZQUFxQjtBQUNqQjtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQSxnQkFDSVEseUJBREosR0FDSSxxQ0FBNEI7QUFDeEJDLGdCQUFNLENBQUNDLGNBQVAsQ0FDSSxLQUFLWixLQUFMLENBQVdhLFNBRGYsRUFFSSxLQUFLQyxLQUFMLENBQVdoQixFQUFYLElBQWlCLEtBQUtNLFNBRjFCLEVBRXFDO0FBQ2pDLGVBQUtVLEtBQUwsQ0FBV0Msd0JBQVgsQ0FDSSxLQUFLWCxTQURULEVBRUksS0FBS0osS0FGVCxFQUdJLEtBQUtLLE9BSFQsRUFJSSxLQUFLQyxZQUpULENBSEo7QUFVSCxTQVpMOztBQUFBO0FBQUEsUUFBd0RVLDhEQUF4RDtBQWNIO0FBdERMOztBQUFBO0FBQUEsRUFBcUNDLDhDQUFyQztBQXlEZTdCLDhFQUFmIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9SZWxhdGlvbmFsRmllbGQuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuL0ZpZWxkXCI7XG5pbXBvcnQgRGVmYXVsdEZpZWxkSW5zdGFsbGVyIGZyb20gXCIuL0RlZmF1bHRGaWVsZEluc3RhbGxlclwiO1xuXG5pbXBvcnQgeyByZXZlcnNlRmllbGROYW1lLCBub3JtYWxpemVNb2RlbFJlZmVyZW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmZpZWxkc1xuICovXG5leHBvcnQgY2xhc3MgUmVsYXRpb25hbEZpZWxkIGV4dGVuZHMgRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gYXJnc1swXTtcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbE5hbWUgPSBub3JtYWxpemVNb2RlbFJlZmVyZW5jZShvcHRzLnRvKTtcbiAgICAgICAgICAgIHRoaXMucmVsYXRlZE5hbWUgPSBvcHRzLnJlbGF0ZWROYW1lO1xuICAgICAgICAgICAgdGhpcy50aHJvdWdoID0gbm9ybWFsaXplTW9kZWxSZWZlcmVuY2Uob3B0cy50aHJvdWdoKTtcbiAgICAgICAgICAgIHRoaXMudGhyb3VnaEZpZWxkcyA9IG9wdHMudGhyb3VnaEZpZWxkcztcbiAgICAgICAgICAgIHRoaXMuYXMgPSBvcHRzLmFzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgW3RoaXMudG9Nb2RlbE5hbWUsIHRoaXMucmVsYXRlZE5hbWVdID0gW1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlKGFyZ3NbMF0pLFxuICAgICAgICAgICAgICAgIGFyZ3NbMV0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QmFja3dhcmRzRmllbGROYW1lKG1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWROYW1lIHx8IHJldmVyc2VGaWVsZE5hbWUobW9kZWwubW9kZWxOYW1lKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCYWNrd2FyZHNWaXJ0dWFsRmllbGQoZmllbGROYW1lLCBtb2RlbCwgdG9Nb2RlbCwgdGhyb3VnaE1vZGVsKSB7XG4gICAgICAgIGNvbnN0IFRoaXNGaWVsZCA9IHRoaXMuZ2V0Q2xhc3MoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzRmllbGQobW9kZWwubW9kZWxOYW1lLCBmaWVsZE5hbWUpO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsc0JhY2t3YXJkc1ZpcnR1YWxGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IGluc3RhbGxzQmFja3dhcmRzRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVmZXJlbmNlcyhtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b01vZGVsTmFtZSA9PT0gbW9kZWwubW9kZWxOYW1lO1xuICAgIH1cblxuICAgIGdldCBpbnN0YWxsZXJDbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIEFsaWFzZWRGb3J3YXJkc0Rlc2NyaXB0b3JJbnN0YWxsZXIgZXh0ZW5kcyBEZWZhdWx0RmllbGRJbnN0YWxsZXIge1xuICAgICAgICAgICAgaW5zdGFsbEZvcndhcmRzRGVzY3JpcHRvcigpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLmFzIHx8IHRoaXMuZmllbGROYW1lLCAvLyB1c2Ugc3VwcGxpZWQgbmFtZSBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLmNyZWF0ZUZvcndhcmRzRGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3VnaE1vZGVsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVsYXRpb25hbEZpZWxkO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/RelationalField.js\n");
/***/ }),
@@ -4654,7 +4676,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fk\", function() { return fk; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attr\", function() { return attr; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"many\", function() { return many; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"oneToOne\", function() { return oneToOne; });\n/* harmony import */ var _Attribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Attribute */ \"./src/fields/Attribute.js\");\n/* harmony import */ var _ForeignKey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _ManyToMany__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _OneToOne__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./OneToOne */ \"./src/fields/OneToOne.js\");\n\n\n\n\n/**\n * Contains the logic for how fields on {@link Model}s work\n * and which descriptors must be installed.\n *\n * If your goal is to define fields on a Model class,\n * please use the more convenient methods {@link attr},\n * {@link fk}, {@link many} and {@link oneToOne}.\n *\n * @module fields\n */\n\n/**\n * Defines a value attribute on the model.\n * Though not required, it is recommended to define this for each non-foreign key you wish to use.\n * Getters and setters need to be defined on each Model\n * instantiation for undeclared data fields, which is slower.\n * You can use the optional `getDefault` parameter to fill in unpassed values\n * to {@link Model.create}, such as for generating ID's with UUID:\n *\n * ```javascript\n * import getUUID from 'your-uuid-package-of-choice';\n *\n * fields = {\n * id: attr({ getDefault: () => getUUID() }),\n * title: attr(),\n * }\n * ```\n *\n * @param {Object} [opts]\n * @param {Function} [opts.getDefault] - If you give a function here, its return\n * value from calling with zero arguments will\n * be used as the value when creating a new Model\n * instance with {@link Model#create} if the field\n * value is not passed.\n * @return {Attribute}\n */\n\nfunction attr(opts) {\n return new _Attribute__WEBPACK_IMPORTED_MODULE_0__[\"default\"](opts);\n}\n/**\n * Defines a foreign key on a model, which points\n * to a single entity on another model.\n *\n * You can pass arguments as either a single object,\n * or two arguments.\n *\n * If you pass two arguments, the first one is the name\n * of the Model the foreign key is pointing to, and\n * the second one is an optional related name, which will\n * be used to access the Model the foreign key\n * is being defined from, from the target Model.\n *\n * If the related name is not passed, it will be set as\n * `${toModelName}Set`.\n *\n * If you pass an object to `fk`, it has to be in the form\n *\n * ```javascript\n * fields = {\n * author: fk({ to: 'Author', relatedName: 'books' })\n * }\n * ```\n *\n * Which is equal to\n *\n * ```javascript\n * fields = {\n * author: fk('Author', 'books'),\n * }\n * ```\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access\n * a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ForeignKey}\n */\n\n\nfunction fk(...args) {\n return new _ForeignKey__WEBPACK_IMPORTED_MODULE_1__[\"default\"](...args);\n}\n/**\n * Defines a many-to-many relationship between\n * this (source) and another (target) model.\n *\n * The relationship is modeled with an extra model called the through model.\n * The through model has foreign keys to both the source and target models.\n *\n * You can define your own through model if you want to associate more information\n * to the relationship. A custom through model must have at least two foreign keys,\n * one pointing to the source Model, and one pointing to the target Model.\n *\n * Like `fk`, this function accepts one or two string arguments specifying the other\n * Model and the related name, or a single object argument that allows you to pass\n * a custom through model.\n *\n * If you have more than one foreign key pointing to a source or target Model in the\n * through Model, you must pass the option `throughFields`, which is an array of two\n * strings, where the strings are the field names that identify the foreign keys to\n * be used for the many-to-many relationship. Redux-ORM will figure out which field name\n * points to which model by checking the \"through model\" definition.\n *\n * ```javascript\n * class Authorship extends Model {}\n * Authorship.modelName = 'Authorship';\n * Authorship.fields = {\n * author: fk('Author', 'authorships'),\n * book: fk('Book', 'authorships'),\n * };\n *\n * class Author extends Model {}\n * Author.modelName = 'Author';\n * Author.fields = {\n * books: many({\n * to: 'Book',\n * relatedName: 'authors',\n * through: 'Authorship',\n *\n * // here this is optional: Redux-ORM can figure\n * // out the through fields itself since the two\n * // foreign key fields point to different Models\n * throughFields: ['author', 'book'],\n * })\n * };\n *\n * class Book extends Model {}\n * Book.modelName = 'Book';\n * ```\n *\n * You should only define the many-to-many relationship on one side. In the\n * above case of Authors to Books through Authorships, the relationship is\n * defined only on the Author model.\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string|Class<Model>} [options.through] - The through Model class or its `modelName`\n * attribute. It must declare at least one\n * foreign key to both source and target models.\n * If not supplied, Redux-ORM will generate one.\n * @param {string[]} [options.throughFields] - Must be supplied only when a custom through\n * Model has more than one foreign key pointing to\n * either the source or target mode. In this case\n * Redux-ORM can't figure out the correct fields for\n * you, you must provide them. The supplied array should\n * have two elements that are the field names for the\n * through fields you want to declare the many-to-many\n * relationship with. The order doesn't matter;\n * Redux-ORM will figure out which field points to\n * the source Model and which to the target Model.\n * @param {string} [options.relatedName] - The attribute used to access a QuerySet for all\n * source models that reference the respective target\n * Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ManyToMany}\n */\n\n\nfunction many(...args) {\n return new _ManyToMany__WEBPACK_IMPORTED_MODULE_2__[\"default\"](...args);\n}\n/**\n * Defines a one-to-one relationship. In database terms, this is a foreign key with the\n * added restriction that only one entity can point to single target entity.\n *\n * The arguments are the same as with `fk`. If `relatedName` is not supplied,\n * the source model name in lowercase will be used. Note that with the one-to-one\n * relationship, the `relatedName` should be in singular, not plural.\n *\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance.\n * @param {string} [relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance\n * @return {OneToOne}\n */\n\n\nfunction oneToOne(...args) {\n return new _OneToOne__WEBPACK_IMPORTED_MODULE_3__[\"default\"](...args);\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvaW5kZXguanM/M2Y2ZiJdLCJuYW1lcyI6WyJhdHRyIiwib3B0cyIsIkF0dHJpYnV0ZSIsImZrIiwiYXJncyIsIkZvcmVpZ25LZXkiLCJtYW55IiwiTWFueVRvTWFueSIsIm9uZVRvT25lIiwiT25lVG9PbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBV0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVNBLElBQVQsQ0FBY0MsSUFBZCxFQUFvQjtBQUNoQixTQUFPLElBQUlDLGtEQUFKLENBQWNELElBQWQsQ0FBUDtBQUNIO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFNBQVNFLEVBQVQsQ0FBWSxHQUFHQyxJQUFmLEVBQXFCO0FBQ2pCLFNBQU8sSUFBSUMsbURBQUosQ0FBZSxHQUFHRCxJQUFsQixDQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0ZBLFNBQVNFLElBQVQsQ0FBYyxHQUFHRixJQUFqQixFQUF1QjtBQUNuQixTQUFPLElBQUlHLG1EQUFKLENBQWUsR0FBR0gsSUFBbEIsQ0FBUDtBQUNIO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxTQUFTSSxRQUFULENBQWtCLEdBQUdKLElBQXJCLEVBQTJCO0FBQ3ZCLFNBQU8sSUFBSUssaURBQUosQ0FBYSxHQUFHTCxJQUFoQixDQUFQO0FBQ0giLCJmaWxlIjoiLi9zcmMvZmllbGRzL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF0dHJpYnV0ZSBmcm9tIFwiLi9BdHRyaWJ1dGVcIjtcbmltcG9ydCBGb3JlaWduS2V5IGZyb20gXCIuL0ZvcmVpZ25LZXlcIjtcbmltcG9ydCBNYW55VG9NYW55IGZyb20gXCIuL01hbnlUb01hbnlcIjtcbmltcG9ydCBPbmVUb09uZSBmcm9tIFwiLi9PbmVUb09uZVwiO1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgaG93IGZpZWxkcyBvbiB7QGxpbmsgTW9kZWx9cyB3b3JrXG4gKiBhbmQgd2hpY2ggZGVzY3JpcHRvcnMgbXVzdCBiZSBpbnN0YWxsZWQuXG4gKlxuICogSWYgeW91ciBnb2FsIGlzIHRvIGRlZmluZSBmaWVsZHMgb24gYSBNb2RlbCBjbGFzcyxcbiAqIHBsZWFzZSB1c2UgdGhlIG1vcmUgY29udmVuaWVudCBtZXRob2RzIHtAbGluayBhdHRyfSxcbiAqIHtAbGluayBma30sIHtAbGluayBtYW55fSBhbmQge0BsaW5rIG9uZVRvT25lfS5cbiAqXG4gKiBAbW9kdWxlIGZpZWxkc1xuICovXG5cbi8qKlxuICogRGVmaW5lcyBhIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgbW9kZWwuXG4gKiBUaG91Z2ggbm90IHJlcXVpcmVkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWZpbmUgdGhpcyBmb3IgZWFjaCBub24tZm9yZWlnbiBrZXkgeW91IHdpc2ggdG8gdXNlLlxuICogR2V0dGVycyBhbmQgc2V0dGVycyBuZWVkIHRvIGJlIGRlZmluZWQgb24gZWFjaCBNb2RlbFxuICogaW5zdGFudGlhdGlvbiBmb3IgdW5kZWNsYXJlZCBkYXRhIGZpZWxkcywgd2hpY2ggaXMgc2xvd2VyLlxuICogWW91IGNhbiB1c2UgdGhlIG9wdGlvbmFsIGBnZXREZWZhdWx0YCBwYXJhbWV0ZXIgdG8gZmlsbCBpbiB1bnBhc3NlZCB2YWx1ZXNcbiAqIHRvIHtAbGluayBNb2RlbC5jcmVhdGV9LCBzdWNoIGFzIGZvciBnZW5lcmF0aW5nIElEJ3Mgd2l0aCBVVUlEOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGltcG9ydCBnZXRVVUlEIGZyb20gJ3lvdXItdXVpZC1wYWNrYWdlLW9mLWNob2ljZSc7XG4gKlxuICogZmllbGRzID0ge1xuICogICBpZDogYXR0cih7IGdldERlZmF1bHQ6ICgpID0+IGdldFVVSUQoKSB9KSxcbiAqICAgdGl0bGU6IGF0dHIoKSxcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5nZXREZWZhdWx0XSAtIElmIHlvdSBnaXZlIGEgZnVuY3Rpb24gaGVyZSwgaXRzIHJldHVyblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmcm9tIGNhbGxpbmcgd2l0aCB6ZXJvIGFyZ3VtZW50cyB3aWxsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgdGhlIHZhbHVlIHdoZW4gY3JlYXRpbmcgYSBuZXcgTW9kZWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugd2l0aCB7QGxpbmsgTW9kZWwjY3JlYXRlfSBpZiB0aGUgZmllbGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge0F0dHJpYnV0ZX1cbiAqL1xuZnVuY3Rpb24gYXR0cihvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUob3B0cyk7XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIGZvcmVpZ24ga2V5IG9uIGEgbW9kZWwsIHdoaWNoIHBvaW50c1xuICogdG8gYSBzaW5nbGUgZW50aXR5IG9uIGFub3RoZXIgbW9kZWwuXG4gKlxuICogWW91IGNhbiBwYXNzIGFyZ3VtZW50cyBhcyBlaXRoZXIgYSBzaW5nbGUgb2JqZWN0LFxuICogb3IgdHdvIGFyZ3VtZW50cy5cbiAqXG4gKiBJZiB5b3UgcGFzcyB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3Qgb25lIGlzIHRoZSBuYW1lXG4gKiBvZiB0aGUgTW9kZWwgdGhlIGZvcmVpZ24ga2V5IGlzIHBvaW50aW5nIHRvLCBhbmRcbiAqIHRoZSBzZWNvbmQgb25lIGlzIGFuIG9wdGlvbmFsIHJlbGF0ZWQgbmFtZSwgd2hpY2ggd2lsbFxuICogYmUgdXNlZCB0byBhY2Nlc3MgdGhlIE1vZGVsIHRoZSBmb3JlaWduIGtleVxuICogaXMgYmVpbmcgZGVmaW5lZCBmcm9tLCBmcm9tIHRoZSB0YXJnZXQgTW9kZWwuXG4gKlxuICogSWYgdGhlIHJlbGF0ZWQgbmFtZSBpcyBub3QgcGFzc2VkLCBpdCB3aWxsIGJlIHNldCBhc1xuICogYCR7dG9Nb2RlbE5hbWV9U2V0YC5cbiAqXG4gKiBJZiB5b3UgcGFzcyBhbiBvYmplY3QgdG8gYGZrYCwgaXQgaGFzIHRvIGJlIGluIHRoZSBmb3JtXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZmllbGRzID0ge1xuICogICBhdXRob3I6IGZrKHsgdG86ICdBdXRob3InLCByZWxhdGVkTmFtZTogJ2Jvb2tzJyB9KVxuICogfVxuICogYGBgXG4gKlxuICogV2hpY2ggaXMgZXF1YWwgdG9cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmaWVsZHMgPSB7XG4gKiAgIGF1dGhvcjogZmsoJ0F1dGhvcicsICdib29rcycpLFxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8Q2xhc3M8TW9kZWw+fE9iamVjdH0gb3B0aW9ucyAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3MsIGl0cyBgbW9kZWxOYW1lYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBvciBhbiBvcHRpb25zIG9iamVjdCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgZWl0aGVyIGFzIHRoZSBgdG9gIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPn0gb3B0aW9ucy50byAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3Mgb3IgaXRzIGBtb2RlbE5hbWVgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hc10gLSBOYW1lIGZvciB0aGUgbmV3IGFjY2Vzc29yIGRlZmluZWQgZm9yIHRoaXMgZmllbGQuIElmIHlvdSBkb24ndFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB0aGlzLCB0aGUga2V5IHRoYXQgdGhpcyBmaWVsZCBpcyBkZWZpbmVkIHVuZGVyIHdpbGwgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZGVuLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJlbGF0ZWROYW1lXSAtIFRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjY2Vzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUXVlcnlTZXQgZm9yIGFsbCBzb3VyY2UgbW9kZWxzIHRoYXQgcmVmZXJlbmNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BlY3RpdmUgdGFyZ2V0IE1vZGVsJ3MgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbGF0ZWROYW1lXSAtIElmIHlvdSBkaWRuJ3QgcGFzcyBhbiBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyBhIFF1ZXJ5U2V0IGZvciBhbGwgc291cmNlIG1vZGVscyB0aGF0IHJlZmVyZW5jZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcGVjdGl2ZSB0YXJnZXQgTW9kZWwncyBpbnN0YW5jZS5cbiAqIEByZXR1cm4ge0ZvcmVpZ25LZXl9XG4gKi9cbmZ1bmN0aW9uIGZrKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXkoLi4uYXJncyk7XG59XG5cbi8qKlxuICogRGVmaW5lcyBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlblxuICogdGhpcyAoc291cmNlKSBhbmQgYW5vdGhlciAodGFyZ2V0KSBtb2RlbC5cbiAqXG4gKiBUaGUgcmVsYXRpb25zaGlwIGlzIG1vZGVsZWQgd2l0aCBhbiBleHRyYSBtb2RlbCBjYWxsZWQgdGhlIHRocm91Z2ggbW9kZWwuXG4gKiBUaGUgdGhyb3VnaCBtb2RlbCBoYXMgZm9yZWlnbiBrZXlzIHRvIGJvdGggdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG1vZGVscy5cbiAqXG4gKiBZb3UgY2FuIGRlZmluZSB5b3VyIG93biB0aHJvdWdoIG1vZGVsIGlmIHlvdSB3YW50IHRvIGFzc29jaWF0ZSBtb3JlIGluZm9ybWF0aW9uXG4gKiB0byB0aGUgcmVsYXRpb25zaGlwLiBBIGN1c3RvbSB0aHJvdWdoIG1vZGVsIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZm9yZWlnbiBrZXlzLFxuICogb25lIHBvaW50aW5nIHRvIHRoZSBzb3VyY2UgTW9kZWwsIGFuZCBvbmUgcG9pbnRpbmcgdG8gdGhlIHRhcmdldCBNb2RlbC5cbiAqXG4gKiBMaWtlIGBma2AsIHRoaXMgZnVuY3Rpb24gYWNjZXB0cyBvbmUgb3IgdHdvIHN0cmluZyBhcmd1bWVudHMgc3BlY2lmeWluZyB0aGUgb3RoZXJcbiAqIE1vZGVsIGFuZCB0aGUgcmVsYXRlZCBuYW1lLCBvciBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQgdGhhdCBhbGxvd3MgeW91IHRvIHBhc3NcbiAqIGEgY3VzdG9tIHRocm91Z2ggbW9kZWwuXG4gKlxuICogSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBmb3JlaWduIGtleSBwb2ludGluZyB0byBhIHNvdXJjZSBvciB0YXJnZXQgTW9kZWwgaW4gdGhlXG4gKiB0aHJvdWdoIE1vZGVsLCB5b3UgbXVzdCBwYXNzIHRoZSBvcHRpb24gYHRocm91Z2hGaWVsZHNgLCB3aGljaCBpcyBhbiBhcnJheSBvZiB0d29cbiAqIHN0cmluZ3MsIHdoZXJlIHRoZSBzdHJpbmdzIGFyZSB0aGUgZmllbGQgbmFtZXMgdGhhdCBpZGVudGlmeSB0aGUgZm9yZWlnbiBrZXlzIHRvXG4gKiBiZSB1c2VkIGZvciB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcC4gUmVkdXgtT1JNIHdpbGwgZmlndXJlIG91dCB3aGljaCBmaWVsZCBuYW1lXG4gKiBwb2ludHMgdG8gd2hpY2ggbW9kZWwgYnkgY2hlY2tpbmcgdGhlIFwidGhyb3VnaCBtb2RlbFwiIGRlZmluaXRpb24uXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogY2xhc3MgQXV0aG9yc2hpcCBleHRlbmRzIE1vZGVsIHt9XG4gKiBBdXRob3JzaGlwLm1vZGVsTmFtZSA9ICdBdXRob3JzaGlwJztcbiAqIEF1dGhvcnNoaXAuZmllbGRzID0ge1xuICogICBhdXRob3I6IGZrKCdBdXRob3InLCAnYXV0aG9yc2hpcHMnKSxcbiAqICAgYm9vazogZmsoJ0Jvb2snLCAnYXV0aG9yc2hpcHMnKSxcbiAqIH07XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgTW9kZWwge31cbiAqIEF1dGhvci5tb2RlbE5hbWUgPSAnQXV0aG9yJztcbiAqIEF1dGhvci5maWVsZHMgPSB7XG4gKiAgIGJvb2tzOiBtYW55KHtcbiAqICAgICB0bzogJ0Jvb2snLFxuICogICAgIHJlbGF0ZWROYW1lOiAnYXV0aG9ycycsXG4gKiAgICAgdGhyb3VnaDogJ0F1dGhvcnNoaXAnLFxuICpcbiAqICAgICAvLyBoZXJlIHRoaXMgaXMgb3B0aW9uYWw6IFJlZHV4LU9STSBjYW4gZmlndXJlXG4gKiAgICAgLy8gb3V0IHRoZSB0aHJvdWdoIGZpZWxkcyBpdHNlbGYgc2luY2UgdGhlIHR3b1xuICogICAgIC8vIGZvcmVpZ24ga2V5IGZpZWxkcyBwb2ludCB0byBkaWZmZXJlbnQgTW9kZWxzXG4gKiAgICAgdGhyb3VnaEZpZWxkczogWydhdXRob3InLCAnYm9vayddLFxuICogICB9KVxuICogfTtcbiAqXG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgTW9kZWwge31cbiAqIEJvb2subW9kZWxOYW1lID0gJ0Jvb2snO1xuICogYGBgXG4gKlxuICogWW91IHNob3VsZCBvbmx5IGRlZmluZSB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCBvbiBvbmUgc2lkZS4gSW4gdGhlXG4gKiBhYm92ZSBjYXNlIG9mIEF1dGhvcnMgdG8gQm9va3MgdGhyb3VnaCBBdXRob3JzaGlwcywgdGhlIHJlbGF0aW9uc2hpcCBpc1xuICogZGVmaW5lZCBvbmx5IG9uIHRoZSBBdXRob3IgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8Q2xhc3M8TW9kZWw+fE9iamVjdH0gb3B0aW9ucyAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3MsIGl0cyBgbW9kZWxOYW1lYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBvciBhbiBvcHRpb25zIG9iamVjdCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgZWl0aGVyIGFzIHRoZSBgdG9gIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPn0gb3B0aW9ucy50byAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3Mgb3IgaXRzIGBtb2RlbE5hbWVgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hc10gLSBOYW1lIGZvciB0aGUgbmV3IGFjY2Vzc29yIGRlZmluZWQgZm9yIHRoaXMgZmllbGQuIElmIHlvdSBkb24ndFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB0aGlzLCB0aGUga2V5IHRoYXQgdGhpcyBmaWVsZCBpcyBkZWZpbmVkIHVuZGVyIHdpbGwgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZGVuLlxuICogQHBhcmFtIHtzdHJpbmd8Q2xhc3M8TW9kZWw+fSBbb3B0aW9ucy50aHJvdWdoXSAtIFRoZSB0aHJvdWdoIE1vZGVsIGNsYXNzIG9yIGl0cyBgbW9kZWxOYW1lYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS4gSXQgbXVzdCBkZWNsYXJlIGF0IGxlYXN0IG9uZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ24ga2V5IHRvIGJvdGggc291cmNlIGFuZCB0YXJnZXQgbW9kZWxzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vdCBzdXBwbGllZCwgUmVkdXgtT1JNIHdpbGwgZ2VuZXJhdGUgb25lLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMudGhyb3VnaEZpZWxkc10gLSBNdXN0IGJlIHN1cHBsaWVkIG9ubHkgd2hlbiBhIGN1c3RvbSB0aHJvdWdoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsIGhhcyBtb3JlIHRoYW4gb25lIGZvcmVpZ24ga2V5IHBvaW50aW5nIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0aGUgc291cmNlIG9yIHRhcmdldCBtb2RlLiBJbiB0aGlzIGNhc2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdXgtT1JNIGNhbid0IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgZmllbGRzIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UsIHlvdSBtdXN0IHByb3ZpZGUgdGhlbS4gVGhlIHN1cHBsaWVkIGFycmF5IHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHR3byBlbGVtZW50cyB0aGF0IGFyZSB0aGUgZmllbGQgbmFtZXMgZm9yIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGZpZWxkcyB5b3Ugd2FudCB0byBkZWNsYXJlIHRoZSBtYW55LXRvLW1hbnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwIHdpdGguIFRoZSBvcmRlciBkb2Vzbid0IG1hdHRlcjtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdXgtT1JNIHdpbGwgZmlndXJlIG91dCB3aGljaCBmaWVsZCBwb2ludHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBNb2RlbCBhbmQgd2hpY2ggdG8gdGhlIHRhcmdldCBNb2RlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZWxhdGVkTmFtZV0gLSBUaGUgYXR0cmlidXRlIHVzZWQgdG8gYWNjZXNzIGEgUXVlcnlTZXQgZm9yIGFsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBtb2RlbHMgdGhhdCByZWZlcmVuY2UgdGhlIHJlc3BlY3RpdmUgdGFyZ2V0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwncyBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVsYXRlZE5hbWVdIC0gSWYgeW91IGRpZG4ndCBwYXNzIGFuIG9iamVjdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHByb3BlcnR5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIGEgUXVlcnlTZXQgZm9yIGFsbCBzb3VyY2UgbW9kZWxzIHRoYXQgcmVmZXJlbmNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNwZWN0aXZlIHRhcmdldCBNb2RlbCdzIGluc3RhbmNlLlxuICogQHJldHVybiB7TWFueVRvTWFueX1cbiAqL1xuZnVuY3Rpb24gbWFueSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBNYW55VG9NYW55KC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcC4gSW4gZGF0YWJhc2UgdGVybXMsIHRoaXMgaXMgYSBmb3JlaWduIGtleSB3aXRoIHRoZVxuICogYWRkZWQgcmVzdHJpY3Rpb24gdGhhdCBvbmx5IG9uZSBlbnRpdHkgY2FuIHBvaW50IHRvIHNpbmdsZSB0YXJnZXQgZW50aXR5LlxuICpcbiAqIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdpdGggYGZrYC4gSWYgYHJlbGF0ZWROYW1lYCBpcyBub3Qgc3VwcGxpZWQsXG4gKiB0aGUgc291cmNlIG1vZGVsIG5hbWUgaW4gbG93ZXJjYXNlIHdpbGwgYmUgdXNlZC4gTm90ZSB0aGF0IHdpdGggdGhlIG9uZS10by1vbmVcbiAqIHJlbGF0aW9uc2hpcCwgdGhlIGByZWxhdGVkTmFtZWAgc2hvdWxkIGJlIGluIHNpbmd1bGFyLCBub3QgcGx1cmFsLlxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xDbGFzczxNb2RlbD58T2JqZWN0fSBvcHRpb25zIC0gVGhlIHRhcmdldCBNb2RlbCBjbGFzcywgaXRzIGBtb2RlbE5hbWVgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIG9yIGFuIG9wdGlvbnMgb2JqZWN0IHRoYXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBlaXRoZXIgYXMgdGhlIGB0b2Aga2V5LlxuICogQHBhcmFtIHtzdHJpbmd8Q2xhc3M8TW9kZWw+fSBvcHRpb25zLnRvIC0gVGhlIHRhcmdldCBNb2RlbCBjbGFzcyBvciBpdHMgYG1vZGVsTmFtZWAgYXR0cmlidXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFzXSAtIE5hbWUgZm9yIHRoZSBuZXcgYWNjZXNzb3IgZGVmaW5lZCBmb3IgdGhpcyBmaWVsZC4gSWYgeW91IGRvbid0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IHRoaXMsIHRoZSBrZXkgdGhhdCB0aGlzIGZpZWxkIGlzIGRlZmluZWQgdW5kZXIgd2lsbCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRkZW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucmVsYXRlZE5hbWVdIC0gVGhlIHByb3BlcnR5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzb3VyY2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZSByZWZlcmVuY2luZyB0aGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtyZWxhdGVkTmFtZV0gLSBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHNvdXJjZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZSByZWZlcmVuY2luZyB0aGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtPbmVUb09uZX1cbiAqL1xuZnVuY3Rpb24gb25lVG9PbmUoLi4uYXJncykge1xuICAgIHJldHVybiBuZXcgT25lVG9PbmUoLi4uYXJncyk7XG59XG5cbmV4cG9ydCB7IGZrLCBhdHRyLCBtYW55LCBvbmVUb09uZSB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/fields/index.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fk\", function() { return fk; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attr\", function() { return attr; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"many\", function() { return many; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"oneToOne\", function() { return oneToOne; });\n/* harmony import */ var _Attribute__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Attribute */ \"./src/fields/Attribute.js\");\n/* harmony import */ var _ForeignKey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _ManyToMany__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _OneToOne__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./OneToOne */ \"./src/fields/OneToOne.js\");\n\n\n\n\n/**\n * Contains the logic for how fields on {@link Model}s work\n * and which descriptors must be installed.\n *\n * If your goal is to define fields on a Model class,\n * please use the more convenient methods {@link attr},\n * {@link fk}, {@link many} and {@link oneToOne}.\n *\n * @module fields\n */\n\n/**\n * Defines a value attribute on the model.\n * Though not required, it is recommended to define this for each non-foreign key you wish to use.\n * Getters and setters need to be defined on each Model\n * instantiation for undeclared data fields, which is slower.\n * You can use the optional `getDefault` parameter to fill in unpassed values\n * to {@link Model.create}, such as for generating ID's with UUID:\n *\n * ```javascript\n * import getUUID from 'your-uuid-package-of-choice';\n *\n * fields = {\n * id: attr({ getDefault: () => getUUID() }),\n * title: attr(),\n * }\n * ```\n *\n * @param {Object} [opts]\n * @param {Function} [opts.getDefault] - If you give a function here, its return\n * value from calling with zero arguments will\n * be used as the value when creating a new Model\n * instance with {@link Model#create} if the field\n * value is not passed.\n * @return {Attribute}\n */\n\nfunction attr(opts) {\n return new _Attribute__WEBPACK_IMPORTED_MODULE_0__[\"default\"](opts);\n}\n/**\n * Defines a foreign key on a model, which points\n * to a single entity on another model.\n *\n * You can pass arguments as either a single object,\n * or two arguments.\n *\n * If you pass two arguments, the first one is the name\n * of the Model the foreign key is pointing to, and\n * the second one is an optional related name, which will\n * be used to access the Model the foreign key\n * is being defined from, from the target Model.\n *\n * If the related name is not passed, it will be set as\n * `${toModelName}Set`.\n *\n * If you pass an object to `fk`, it has to be in the form\n *\n * ```javascript\n * fields = {\n * author: fk({ to: 'Author', relatedName: 'books' })\n * }\n * ```\n *\n * Which is equal to\n *\n * ```javascript\n * fields = {\n * author: fk('Author', 'books'),\n * }\n * ```\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access\n * a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ForeignKey}\n */\n\n\nfunction fk(...args) {\n return new _ForeignKey__WEBPACK_IMPORTED_MODULE_1__[\"default\"](...args);\n}\n/**\n * Defines a many-to-many relationship between\n * this (source) and another (target) model.\n *\n * The relationship is modeled with an extra model called the through model.\n * The through model has foreign keys to both the source and target models.\n *\n * You can define your own through model if you want to associate more information\n * to the relationship. A custom through model must have at least two foreign keys,\n * one pointing to the source Model, and one pointing to the target Model.\n *\n * Like `fk`, this function accepts one or two string arguments specifying the other\n * Model and the related name, or a single object argument that allows you to pass\n * a custom through model.\n *\n * If you have more than one foreign key pointing to a source or target Model in the\n * through Model, you must pass the option `throughFields`, which is an array of two\n * strings, where the strings are the field names that identify the foreign keys to\n * be used for the many-to-many relationship. Redux-ORM will figure out which field name\n * points to which model by checking the \"through model\" definition.\n *\n * ```javascript\n * class Authorship extends Model {}\n * Authorship.modelName = 'Authorship';\n * Authorship.fields = {\n * author: fk('Author', 'authorships'),\n * book: fk('Book', 'authorships'),\n * };\n *\n * class Author extends Model {}\n * Author.modelName = 'Author';\n * Author.fields = {\n * books: many({\n * to: 'Book',\n * relatedName: 'authors',\n * through: 'Authorship',\n *\n * // here this is optional: Redux-ORM can figure\n * // out the through fields itself since the two\n * // foreign key fields point to different Models\n * throughFields: ['author', 'book'],\n * })\n * };\n *\n * class Book extends Model {}\n * Book.modelName = 'Book';\n * ```\n *\n * You should only define the many-to-many relationship on one side. In the\n * above case of Authors to Books through Authorships, the relationship is\n * defined only on the Author model.\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string|Class<Model>} [options.through] - The through Model class or its `modelName`\n * attribute. It must declare at least one\n * foreign key to both source and target models.\n * If not supplied, Redux-ORM will generate one.\n * @param {string[]} [options.throughFields] - Must be supplied only when a custom through\n * Model has more than one foreign key pointing to\n * either the source or target mode. In this case\n * Redux-ORM can't figure out the correct fields for\n * you, you must provide them. The supplied array should\n * have two elements that are the field names for the\n * through fields you want to declare the many-to-many\n * relationship with. The order doesn't matter;\n * Redux-ORM will figure out which field points to\n * the source Model and which to the target Model.\n * @param {string} [options.relatedName] - The attribute used to access a QuerySet for all\n * source models that reference the respective target\n * Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ManyToMany}\n */\n\n\nfunction many(...args) {\n return new _ManyToMany__WEBPACK_IMPORTED_MODULE_2__[\"default\"](...args);\n}\n/**\n * Defines a one-to-one relationship. In database terms, this is a foreign key with the\n * added restriction that only one entity can point to single target entity.\n *\n * The arguments are the same as with `fk`. If `relatedName` is not supplied,\n * the source model name in lowercase will be used. Note that with the one-to-one\n * relationship, the `relatedName` should be in singular, not plural.\n *\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance.\n * @param {string} [relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance\n * @return {OneToOne}\n */\n\n\nfunction oneToOne(...args) {\n return new _OneToOne__WEBPACK_IMPORTED_MODULE_3__[\"default\"](...args);\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9maWVsZHMvaW5kZXguanM/M2Y2ZiJdLCJuYW1lcyI6WyJhdHRyIiwib3B0cyIsIkF0dHJpYnV0ZSIsImZrIiwiYXJncyIsIkZvcmVpZ25LZXkiLCJtYW55IiwiTWFueVRvTWFueSIsIm9uZVRvT25lIiwiT25lVG9PbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsU0FBU0EsSUFBVCxDQUFjQyxJQUFkLEVBQW9CO0FBQ2hCLFNBQU8sSUFBSUMsa0RBQUosQ0FBY0QsSUFBZCxDQUFQO0FBQ0g7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNFLEVBQVQsQ0FBWSxHQUFHQyxJQUFmLEVBQXFCO0FBQ2pCLFNBQU8sSUFBSUMsbURBQUosQ0FBZSxHQUFHRCxJQUFsQixDQUFQO0FBQ0g7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0UsSUFBVCxDQUFjLEdBQUdGLElBQWpCLEVBQXVCO0FBQ25CLFNBQU8sSUFBSUcsbURBQUosQ0FBZSxHQUFHSCxJQUFsQixDQUFQO0FBQ0g7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0ksUUFBVCxDQUFrQixHQUFHSixJQUFyQixFQUEyQjtBQUN2QixTQUFPLElBQUlLLGlEQUFKLENBQWEsR0FBR0wsSUFBaEIsQ0FBUDtBQUNIIiwiZmlsZSI6Ii4vc3JjL2ZpZWxkcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBdHRyaWJ1dGUgZnJvbSBcIi4vQXR0cmlidXRlXCI7XG5pbXBvcnQgRm9yZWlnbktleSBmcm9tIFwiLi9Gb3JlaWduS2V5XCI7XG5pbXBvcnQgTWFueVRvTWFueSBmcm9tIFwiLi9NYW55VG9NYW55XCI7XG5pbXBvcnQgT25lVG9PbmUgZnJvbSBcIi4vT25lVG9PbmVcIjtcblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGhvdyBmaWVsZHMgb24ge0BsaW5rIE1vZGVsfXMgd29ya1xuICogYW5kIHdoaWNoIGRlc2NyaXB0b3JzIG11c3QgYmUgaW5zdGFsbGVkLlxuICpcbiAqIElmIHlvdXIgZ29hbCBpcyB0byBkZWZpbmUgZmllbGRzIG9uIGEgTW9kZWwgY2xhc3MsXG4gKiBwbGVhc2UgdXNlIHRoZSBtb3JlIGNvbnZlbmllbnQgbWV0aG9kcyB7QGxpbmsgYXR0cn0sXG4gKiB7QGxpbmsgZmt9LCB7QGxpbmsgbWFueX0gYW5kIHtAbGluayBvbmVUb09uZX0uXG4gKlxuICogQG1vZHVsZSBmaWVsZHNcbiAqL1xuXG4vKipcbiAqIERlZmluZXMgYSB2YWx1ZSBhdHRyaWJ1dGUgb24gdGhlIG1vZGVsLlxuICogVGhvdWdoIG5vdCByZXF1aXJlZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVmaW5lIHRoaXMgZm9yIGVhY2ggbm9uLWZvcmVpZ24ga2V5IHlvdSB3aXNoIHRvIHVzZS5cbiAqIEdldHRlcnMgYW5kIHNldHRlcnMgbmVlZCB0byBiZSBkZWZpbmVkIG9uIGVhY2ggTW9kZWxcbiAqIGluc3RhbnRpYXRpb24gZm9yIHVuZGVjbGFyZWQgZGF0YSBmaWVsZHMsIHdoaWNoIGlzIHNsb3dlci5cbiAqIFlvdSBjYW4gdXNlIHRoZSBvcHRpb25hbCBgZ2V0RGVmYXVsdGAgcGFyYW1ldGVyIHRvIGZpbGwgaW4gdW5wYXNzZWQgdmFsdWVzXG4gKiB0byB7QGxpbmsgTW9kZWwuY3JlYXRlfSwgc3VjaCBhcyBmb3IgZ2VuZXJhdGluZyBJRCdzIHdpdGggVVVJRDpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBpbXBvcnQgZ2V0VVVJRCBmcm9tICd5b3VyLXV1aWQtcGFja2FnZS1vZi1jaG9pY2UnO1xuICpcbiAqIGZpZWxkcyA9IHtcbiAqICAgaWQ6IGF0dHIoeyBnZXREZWZhdWx0OiAoKSA9PiBnZXRVVUlEKCkgfSksXG4gKiAgIHRpdGxlOiBhdHRyKCksXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZ2V0RGVmYXVsdF0gLSBJZiB5b3UgZ2l2ZSBhIGZ1bmN0aW9uIGhlcmUsIGl0cyByZXR1cm5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgZnJvbSBjYWxsaW5nIHdpdGggemVybyBhcmd1bWVudHMgd2lsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIHRoZSB2YWx1ZSB3aGVuIGNyZWF0aW5nIGEgbmV3IE1vZGVsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIHdpdGgge0BsaW5rIE1vZGVsI2NyZWF0ZX0gaWYgdGhlIGZpZWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIG5vdCBwYXNzZWQuXG4gKiBAcmV0dXJuIHtBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIGF0dHIob3B0cykge1xuICAgIHJldHVybiBuZXcgQXR0cmlidXRlKG9wdHMpO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBmb3JlaWduIGtleSBvbiBhIG1vZGVsLCB3aGljaCBwb2ludHNcbiAqIHRvIGEgc2luZ2xlIGVudGl0eSBvbiBhbm90aGVyIG1vZGVsLlxuICpcbiAqIFlvdSBjYW4gcGFzcyBhcmd1bWVudHMgYXMgZWl0aGVyIGEgc2luZ2xlIG9iamVjdCxcbiAqIG9yIHR3byBhcmd1bWVudHMuXG4gKlxuICogSWYgeW91IHBhc3MgdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IG9uZSBpcyB0aGUgbmFtZVxuICogb2YgdGhlIE1vZGVsIHRoZSBmb3JlaWduIGtleSBpcyBwb2ludGluZyB0bywgYW5kXG4gKiB0aGUgc2Vjb25kIG9uZSBpcyBhbiBvcHRpb25hbCByZWxhdGVkIG5hbWUsIHdoaWNoIHdpbGxcbiAqIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBNb2RlbCB0aGUgZm9yZWlnbiBrZXlcbiAqIGlzIGJlaW5nIGRlZmluZWQgZnJvbSwgZnJvbSB0aGUgdGFyZ2V0IE1vZGVsLlxuICpcbiAqIElmIHRoZSByZWxhdGVkIG5hbWUgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBzZXQgYXNcbiAqIGAke3RvTW9kZWxOYW1lfVNldGAuXG4gKlxuICogSWYgeW91IHBhc3MgYW4gb2JqZWN0IHRvIGBma2AsIGl0IGhhcyB0byBiZSBpbiB0aGUgZm9ybVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZpZWxkcyA9IHtcbiAqICAgYXV0aG9yOiBmayh7IHRvOiAnQXV0aG9yJywgcmVsYXRlZE5hbWU6ICdib29rcycgfSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdoaWNoIGlzIGVxdWFsIHRvXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZmllbGRzID0ge1xuICogICBhdXRob3I6IGZrKCdBdXRob3InLCAnYm9va3MnKSxcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPnxPYmplY3R9IG9wdGlvbnMgLSBUaGUgdGFyZ2V0IE1vZGVsIGNsYXNzLCBpdHMgYG1vZGVsTmFtZWBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb3IgYW4gb3B0aW9ucyBvYmplY3QgdGhhdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGVpdGhlciBhcyB0aGUgYHRvYCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ3xDbGFzczxNb2RlbD59IG9wdGlvbnMudG8gLSBUaGUgdGFyZ2V0IE1vZGVsIGNsYXNzIG9yIGl0cyBgbW9kZWxOYW1lYCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXNdIC0gTmFtZSBmb3IgdGhlIG5ldyBhY2Nlc3NvciBkZWZpbmVkIGZvciB0aGlzIGZpZWxkLiBJZiB5b3UgZG9uJ3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgdGhpcywgdGhlIGtleSB0aGF0IHRoaXMgZmllbGQgaXMgZGVmaW5lZCB1bmRlciB3aWxsIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZWxhdGVkTmFtZV0gLSBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBhY2Nlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFF1ZXJ5U2V0IGZvciBhbGwgc291cmNlIG1vZGVscyB0aGF0IHJlZmVyZW5jZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNwZWN0aXZlIHRhcmdldCBNb2RlbCdzIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtyZWxhdGVkTmFtZV0gLSBJZiB5b3UgZGlkbid0IHBhc3MgYW4gb2JqZWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgcHJvcGVydHkgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgYSBRdWVyeVNldCBmb3IgYWxsIHNvdXJjZSBtb2RlbHMgdGhhdCByZWZlcmVuY2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BlY3RpdmUgdGFyZ2V0IE1vZGVsJ3MgaW5zdGFuY2UuXG4gKiBAcmV0dXJuIHtGb3JlaWduS2V5fVxuICovXG5mdW5jdGlvbiBmayguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5KC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW5cbiAqIHRoaXMgKHNvdXJjZSkgYW5kIGFub3RoZXIgKHRhcmdldCkgbW9kZWwuXG4gKlxuICogVGhlIHJlbGF0aW9uc2hpcCBpcyBtb2RlbGVkIHdpdGggYW4gZXh0cmEgbW9kZWwgY2FsbGVkIHRoZSB0aHJvdWdoIG1vZGVsLlxuICogVGhlIHRocm91Z2ggbW9kZWwgaGFzIGZvcmVpZ24ga2V5cyB0byBib3RoIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBtb2RlbHMuXG4gKlxuICogWW91IGNhbiBkZWZpbmUgeW91ciBvd24gdGhyb3VnaCBtb2RlbCBpZiB5b3Ugd2FudCB0byBhc3NvY2lhdGUgbW9yZSBpbmZvcm1hdGlvblxuICogdG8gdGhlIHJlbGF0aW9uc2hpcC4gQSBjdXN0b20gdGhyb3VnaCBtb2RlbCBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGZvcmVpZ24ga2V5cyxcbiAqIG9uZSBwb2ludGluZyB0byB0aGUgc291cmNlIE1vZGVsLCBhbmQgb25lIHBvaW50aW5nIHRvIHRoZSB0YXJnZXQgTW9kZWwuXG4gKlxuICogTGlrZSBgZmtgLCB0aGlzIGZ1bmN0aW9uIGFjY2VwdHMgb25lIG9yIHR3byBzdHJpbmcgYXJndW1lbnRzIHNwZWNpZnlpbmcgdGhlIG90aGVyXG4gKiBNb2RlbCBhbmQgdGhlIHJlbGF0ZWQgbmFtZSwgb3IgYSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50IHRoYXQgYWxsb3dzIHlvdSB0byBwYXNzXG4gKiBhIGN1c3RvbSB0aHJvdWdoIG1vZGVsLlxuICpcbiAqIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgZm9yZWlnbiBrZXkgcG9pbnRpbmcgdG8gYSBzb3VyY2Ugb3IgdGFyZ2V0IE1vZGVsIGluIHRoZVxuICogdGhyb3VnaCBNb2RlbCwgeW91IG11c3QgcGFzcyB0aGUgb3B0aW9uIGB0aHJvdWdoRmllbGRzYCwgd2hpY2ggaXMgYW4gYXJyYXkgb2YgdHdvXG4gKiBzdHJpbmdzLCB3aGVyZSB0aGUgc3RyaW5ncyBhcmUgdGhlIGZpZWxkIG5hbWVzIHRoYXQgaWRlbnRpZnkgdGhlIGZvcmVpZ24ga2V5cyB0b1xuICogYmUgdXNlZCBmb3IgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuIFJlZHV4LU9STSB3aWxsIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgbmFtZVxuICogcG9pbnRzIHRvIHdoaWNoIG1vZGVsIGJ5IGNoZWNraW5nIHRoZSBcInRocm91Z2ggbW9kZWxcIiBkZWZpbml0aW9uLlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNsYXNzIEF1dGhvcnNoaXAgZXh0ZW5kcyBNb2RlbCB7fVxuICogQXV0aG9yc2hpcC5tb2RlbE5hbWUgPSAnQXV0aG9yc2hpcCc7XG4gKiBBdXRob3JzaGlwLmZpZWxkcyA9IHtcbiAqICAgYXV0aG9yOiBmaygnQXV0aG9yJywgJ2F1dGhvcnNoaXBzJyksXG4gKiAgIGJvb2s6IGZrKCdCb29rJywgJ2F1dGhvcnNoaXBzJyksXG4gKiB9O1xuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIE1vZGVsIHt9XG4gKiBBdXRob3IubW9kZWxOYW1lID0gJ0F1dGhvcic7XG4gKiBBdXRob3IuZmllbGRzID0ge1xuICogICBib29rczogbWFueSh7XG4gKiAgICAgdG86ICdCb29rJyxcbiAqICAgICByZWxhdGVkTmFtZTogJ2F1dGhvcnMnLFxuICogICAgIHRocm91Z2g6ICdBdXRob3JzaGlwJyxcbiAqXG4gKiAgICAgLy8gaGVyZSB0aGlzIGlzIG9wdGlvbmFsOiBSZWR1eC1PUk0gY2FuIGZpZ3VyZVxuICogICAgIC8vIG91dCB0aGUgdGhyb3VnaCBmaWVsZHMgaXRzZWxmIHNpbmNlIHRoZSB0d29cbiAqICAgICAvLyBmb3JlaWduIGtleSBmaWVsZHMgcG9pbnQgdG8gZGlmZmVyZW50IE1vZGVsc1xuICogICAgIHRocm91Z2hGaWVsZHM6IFsnYXV0aG9yJywgJ2Jvb2snXSxcbiAqICAgfSlcbiAqIH07XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIE1vZGVsIHt9XG4gKiBCb29rLm1vZGVsTmFtZSA9ICdCb29rJztcbiAqIGBgYFxuICpcbiAqIFlvdSBzaG91bGQgb25seSBkZWZpbmUgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAgb24gb25lIHNpZGUuIEluIHRoZVxuICogYWJvdmUgY2FzZSBvZiBBdXRob3JzIHRvIEJvb2tzIHRocm91Z2ggQXV0aG9yc2hpcHMsIHRoZSByZWxhdGlvbnNoaXAgaXNcbiAqIGRlZmluZWQgb25seSBvbiB0aGUgQXV0aG9yIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPnxPYmplY3R9IG9wdGlvbnMgLSBUaGUgdGFyZ2V0IE1vZGVsIGNsYXNzLCBpdHMgYG1vZGVsTmFtZWBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb3IgYW4gb3B0aW9ucyBvYmplY3QgdGhhdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGVpdGhlciBhcyB0aGUgYHRvYCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ3xDbGFzczxNb2RlbD59IG9wdGlvbnMudG8gLSBUaGUgdGFyZ2V0IE1vZGVsIGNsYXNzIG9yIGl0cyBgbW9kZWxOYW1lYCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXNdIC0gTmFtZSBmb3IgdGhlIG5ldyBhY2Nlc3NvciBkZWZpbmVkIGZvciB0aGlzIGZpZWxkLiBJZiB5b3UgZG9uJ3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgdGhpcywgdGhlIGtleSB0aGF0IHRoaXMgZmllbGQgaXMgZGVmaW5lZCB1bmRlciB3aWxsIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPn0gW29wdGlvbnMudGhyb3VnaF0gLSBUaGUgdGhyb3VnaCBNb2RlbCBjbGFzcyBvciBpdHMgYG1vZGVsTmFtZWBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuIEl0IG11c3QgZGVjbGFyZSBhdCBsZWFzdCBvbmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduIGtleSB0byBib3RoIHNvdXJjZSBhbmQgdGFyZ2V0IG1vZGVscy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3VwcGxpZWQsIFJlZHV4LU9STSB3aWxsIGdlbmVyYXRlIG9uZS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRpb25zLnRocm91Z2hGaWVsZHNdIC0gTXVzdCBiZSBzdXBwbGllZCBvbmx5IHdoZW4gYSBjdXN0b20gdGhyb3VnaFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbCBoYXMgbW9yZSB0aGFuIG9uZSBmb3JlaWduIGtleSBwb2ludGluZyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIHNvdXJjZSBvciB0YXJnZXQgbW9kZS4gSW4gdGhpcyBjYXNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZHV4LU9STSBjYW4ndCBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGZpZWxkcyBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LCB5b3UgbXVzdCBwcm92aWRlIHRoZW0uIFRoZSBzdXBwbGllZCBhcnJheSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0d28gZWxlbWVudHMgdGhhdCBhcmUgdGhlIGZpZWxkIG5hbWVzIGZvciB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBmaWVsZHMgeW91IHdhbnQgdG8gZGVjbGFyZSB0aGUgbWFueS10by1tYW55XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCB3aXRoLiBUaGUgb3JkZXIgZG9lc24ndCBtYXR0ZXI7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZHV4LU9STSB3aWxsIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgcG9pbnRzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UgTW9kZWwgYW5kIHdoaWNoIHRvIHRoZSB0YXJnZXQgTW9kZWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucmVsYXRlZE5hbWVdIC0gVGhlIGF0dHJpYnV0ZSB1c2VkIHRvIGFjY2VzcyBhIFF1ZXJ5U2V0IGZvciBhbGxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgbW9kZWxzIHRoYXQgcmVmZXJlbmNlIHRoZSByZXNwZWN0aXZlIHRhcmdldFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsJ3MgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JlbGF0ZWROYW1lXSAtIElmIHlvdSBkaWRuJ3QgcGFzcyBhbiBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyBhIFF1ZXJ5U2V0IGZvciBhbGwgc291cmNlIG1vZGVscyB0aGF0IHJlZmVyZW5jZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcGVjdGl2ZSB0YXJnZXQgTW9kZWwncyBpbnN0YW5jZS5cbiAqIEByZXR1cm4ge01hbnlUb01hbnl9XG4gKi9cbmZ1bmN0aW9uIG1hbnkoLi4uYXJncykge1xuICAgIHJldHVybiBuZXcgTWFueVRvTWFueSguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAuIEluIGRhdGFiYXNlIHRlcm1zLCB0aGlzIGlzIGEgZm9yZWlnbiBrZXkgd2l0aCB0aGVcbiAqIGFkZGVkIHJlc3RyaWN0aW9uIHRoYXQgb25seSBvbmUgZW50aXR5IGNhbiBwb2ludCB0byBzaW5nbGUgdGFyZ2V0IGVudGl0eS5cbiAqXG4gKiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3aXRoIGBma2AuIElmIGByZWxhdGVkTmFtZWAgaXMgbm90IHN1cHBsaWVkLFxuICogdGhlIHNvdXJjZSBtb2RlbCBuYW1lIGluIGxvd2VyY2FzZSB3aWxsIGJlIHVzZWQuIE5vdGUgdGhhdCB3aXRoIHRoZSBvbmUtdG8tb25lXG4gKiByZWxhdGlvbnNoaXAsIHRoZSBgcmVsYXRlZE5hbWVgIHNob3VsZCBiZSBpbiBzaW5ndWxhciwgbm90IHBsdXJhbC5cbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8Q2xhc3M8TW9kZWw+fE9iamVjdH0gb3B0aW9ucyAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3MsIGl0cyBgbW9kZWxOYW1lYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBvciBhbiBvcHRpb25zIG9iamVjdCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgZWl0aGVyIGFzIHRoZSBgdG9gIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfENsYXNzPE1vZGVsPn0gb3B0aW9ucy50byAtIFRoZSB0YXJnZXQgTW9kZWwgY2xhc3Mgb3IgaXRzIGBtb2RlbE5hbWVgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hc10gLSBOYW1lIGZvciB0aGUgbmV3IGFjY2Vzc29yIGRlZmluZWQgZm9yIHRoaXMgZmllbGQuIElmIHlvdSBkb24ndFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB0aGlzLCB0aGUga2V5IHRoYXQgdGhpcyBmaWVsZCBpcyBkZWZpbmVkIHVuZGVyIHdpbGwgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZGVuLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJlbGF0ZWROYW1lXSAtIFRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc291cmNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2UgcmVmZXJlbmNpbmcgdGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVsYXRlZE5hbWVdIC0gVGhlIHByb3BlcnR5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzb3VyY2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2UgcmVmZXJlbmNpbmcgdGhlIHRhcmdldCBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7T25lVG9PbmV9XG4gKi9cbmZ1bmN0aW9uIG9uZVRvT25lKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IE9uZVRvT25lKC4uLmFyZ3MpO1xufVxuXG5leHBvcnQgeyBmaywgYXR0ciwgbWFueSwgb25lVG9PbmUgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/fields/index.js\n");
/***/ }),
@@ -4678,7 +4700,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"eqCheck\", function() { return eqCheck; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"memoize\", function() { return memoize; });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\nconst defaultEqualityCheck = (a, b) => a === b;\n\nconst eqCheck = defaultEqualityCheck;\n\nconst isOrmState = arg => arg && typeof arg === \"object\" && arg.hasOwnProperty(_constants__WEBPACK_IMPORTED_MODULE_0__[\"STATE_FLAG\"]);\n\nconst argsAreEqual = (lastArgs, nextArgs, equalityCheck) => nextArgs.every((arg, index) => isOrmState(arg) && isOrmState(lastArgs[index]) || equalityCheck(arg, lastArgs[index]));\n\nconst rowsAreEqual = (ids, rowsA, rowsB) => ids.every(id => rowsA[id] === rowsB[id]);\n\nconst accessedModelInstancesAreEqual = (previous, ormState, orm) => {\n const {\n accessedInstances\n } = previous;\n return Object.entries(accessedInstances).every(([modelName, instances]) => {\n // if the entire table has not been changed, we have nothing to do\n if (previous.ormState[modelName] === ormState[modelName]) {\n return true;\n }\n\n const {\n mapName\n } = orm.getDatabase().describe(modelName);\n const {\n [mapName]: previousRows\n } = previous.ormState[modelName];\n const {\n [mapName]: rows\n } = ormState[modelName];\n const accessedIds = Object.keys(instances);\n return rowsAreEqual(accessedIds, previousRows, rows);\n });\n};\n\nconst accessedIndexesAreEqual = (previous, ormState) => {\n const {\n accessedIndexes\n } = previous;\n return Object.entries(accessedIndexes).every(([modelName, indexes]) => Object.entries(indexes).every(([column, values]) => values.every(value => previous.ormState[modelName].indexes[column][value] === ormState[modelName].indexes[column][value])));\n};\n\nconst fullTableScannedModelsAreEqual = (previous, ormState) => previous.fullTableScannedModels.every(modelName => previous.ormState[modelName] === ormState[modelName]);\n/**\n * A memoizer to use with redux-orm\n * selectors. When the memoized function is first run,\n * the memoizer will remember the models that are accessed\n * during that function run.\n *\n * On subsequent runs, the memoizer will check if those\n * models' states have changed compared to the previous run.\n *\n * Memoization algorithm operates like this:\n *\n * 1. Has the selector been run before? If not, go to 6.\n *\n * 2. If the selector has other input selectors in addition to the\n * ORM state selector, check their results for equality with the previous results.\n * If they aren't equal, go to 6.\n *\n * 3. Some filter queries may have required scanning entire tables during the last run.\n * If any of those tables have changed, go to 6.\n *\n * 4. Check which foreign key indexes the database has used to speed up queries\n * during the last run. If any have changed, go to 6.\n *\n * 5. Check which Model's instances the selector has accessed during the last run.\n * Check for equality with each of those states versus their states in the\n * previous ORM state. If all of them are equal, return the previous result.\n *\n * 6. Run the selector. Check the Session object used by the selector for\n * which Model's states were accessed, and merge them with the previously\n * saved information about accessed models (if-else branching can change\n * which models are accessed on different inputs). Save the ORM state and\n * other arguments the selector was called with, overriding previously\n * saved values. Save the selector result. Return the selector result.\n *\n * @private\n * @param {Function} func - function to memoize\n * @param {Function} argEqualityCheck - equality check function to use with normal\n * selector args\n * @param {ORM} orm - a redux-orm ORM instance\n * @return {Function} `func` memoized.\n */\n\n\nfunction memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {\n let previous = {\n /* Result of the previous function call */\n result: null,\n\n /* Arguments to the previous function call (excluding ORM state) */\n args: null,\n\n /**\n * Snapshot of the previous database.\n *\n * Lets us know how the tables looked like\n * during the previous function call.\n */\n ormState: null,\n\n /**\n * Names of models whose tables have been scanned completely\n * during previous function call (contains only model names)\n * Format example: ['Book']\n */\n fullTableScannedModels: [],\n\n /**\n * Map of which model instances have been accessed\n * during previous function call.\n * Contains only PKs of accessed instances.\n * Format example: { Book: { 1: true, 3: true } }\n */\n accessedInstances: {},\n\n /**\n * Map of which attribute indexes have been accessed\n * during previous function call.\n * Contains only attributes that were actually filtered on.\n * Author.withId(3).books would add 3 to the authorId index below.\n * Format example: { Book: { authorId: [1, 2], publisherId: [5] } }\n */\n accessedIndexes: {}\n };\n return (...stateAndArgs) => {\n /**\n * The first argument to this function needs to be\n * the ORM's reducer state in the user's Redux store.\n */\n const [ormState, ...args] = stateAndArgs;\n const selectorWasCalledBefore = Boolean(previous.args);\n\n if (selectorWasCalledBefore && argsAreEqual(previous.args, args, argEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {\n /**\n * None of this selector's dependencies have changed\n * since the last time that we called it.\n */\n return previous.result;\n }\n /**\n * Start a session so that the selector can access the database.\n * Make this session immutable. This way we can find out if\n * the operations that the selector performs are cacheable.\n */\n\n\n const session = orm.session(ormState);\n /* Replace all ORM state arguments by the session above */\n\n const argsWithSession = args.map(arg => isOrmState(arg) ? session : arg);\n /* This is where we call the actual function */\n\n const result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread\n\n /**\n * The metadata for the previous call are no longer valid.\n * Update cached values.\n */\n\n previous = {\n /* Arguments that were passed to the selector */\n args,\n\n /* Selector result */\n result,\n\n /* Redux state slice for session.state */\n ormState,\n\n /* Rows retrieved by resolved primary key */\n accessedInstances: session.accessedModelInstances,\n\n /* Foreign key indexes that were used to speed up queries */\n accessedIndexes: session.accessedIndexes,\n\n /* Tables that had to be scanned completely */\n fullTableScannedModels: session.fullTableScannedModels\n };\n return result;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9tZW1vaXplLmpzPzkxY2IiXSwibmFtZXMiOlsiZGVmYXVsdEVxdWFsaXR5Q2hlY2siLCJhIiwiYiIsImVxQ2hlY2siLCJpc09ybVN0YXRlIiwiYXJnIiwiaGFzT3duUHJvcGVydHkiLCJTVEFURV9GTEFHIiwiYXJnc0FyZUVxdWFsIiwibGFzdEFyZ3MiLCJuZXh0QXJncyIsImVxdWFsaXR5Q2hlY2siLCJldmVyeSIsImluZGV4Iiwicm93c0FyZUVxdWFsIiwiaWRzIiwicm93c0EiLCJyb3dzQiIsImlkIiwiYWNjZXNzZWRNb2RlbEluc3RhbmNlc0FyZUVxdWFsIiwicHJldmlvdXMiLCJvcm1TdGF0ZSIsIm9ybSIsImFjY2Vzc2VkSW5zdGFuY2VzIiwiT2JqZWN0IiwiZW50cmllcyIsIm1vZGVsTmFtZSIsImluc3RhbmNlcyIsIm1hcE5hbWUiLCJnZXREYXRhYmFzZSIsImRlc2NyaWJlIiwicHJldmlvdXNSb3dzIiwicm93cyIsImFjY2Vzc2VkSWRzIiwia2V5cyIsImFjY2Vzc2VkSW5kZXhlc0FyZUVxdWFsIiwiYWNjZXNzZWRJbmRleGVzIiwiaW5kZXhlcyIsImNvbHVtbiIsInZhbHVlcyIsInZhbHVlIiwiZnVsbFRhYmxlU2Nhbm5lZE1vZGVsc0FyZUVxdWFsIiwiZnVsbFRhYmxlU2Nhbm5lZE1vZGVscyIsIm1lbW9pemUiLCJmdW5jIiwiYXJnRXF1YWxpdHlDaGVjayIsInJlc3VsdCIsImFyZ3MiLCJzdGF0ZUFuZEFyZ3MiLCJzZWxlY3Rvcldhc0NhbGxlZEJlZm9yZSIsIkJvb2xlYW4iLCJzZXNzaW9uIiwiYXJnc1dpdGhTZXNzaW9uIiwibWFwIiwiYXBwbHkiLCJhY2Nlc3NlZE1vZGVsSW5zdGFuY2VzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLENBQUNDLENBQUQsRUFBSUMsQ0FBSixLQUFVRCxDQUFDLEtBQUtDLENBQTdDOztBQUNP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TSxHQUFMLENBQVNoRCxHQUFHLElBQ2hDRCxVQUFVLENBQUNDLEdBQUQsQ0FBVixHQUFrQjhDLE9BQWxCLEdBQTRCOUMsR0FEUixDQUF4QjtBQUlBOztBQUNBLFVBQU15QyxNQUFNLEdBQUdGLElBQUksQ0FBQ1UsS0FBTCxDQUFXLElBQVgsRUFBaUJGLGVBQWpCLENBQWYsQ0FsQ3dCLENBa0MwQjs7QUFFbEQ7Ozs7O0FBSUFoQyxZQUFRLEdBQUc7QUFDUDtBQUNBMkIsVUFGTzs7QUFHUDtBQUNBRCxZQUpPOztBQUtQO0FBQ0F6QixjQU5POztBQU9QO0FBQ0FFLHVCQUFpQixFQUFFNEIsT0FBTyxDQUFDSSxzQkFScEI7O0FBU1A7QUFDQW5CLHFCQUFlLEVBQUVlLE9BQU8sQ0FBQ2YsZUFWbEI7O0FBV1A7QUFDQU0sNEJBQXNCLEVBQUVTLE9BQU8sQ0FBQ1Q7QUFaekIsS0FBWDtBQWVBLFdBQU9JLE1BQVA7QUFDSCxHQXhERDtBQXlESCIsImZpbGUiOiIuL3NyYy9tZW1vaXplLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU1RBVEVfRkxBRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkZWZhdWx0RXF1YWxpdHlDaGVjayA9IChhLCBiKSA9PiBhID09PSBiO1xuZXhwb3J0IGNvbnN0IGVxQ2hlY2sgPSBkZWZhdWx0RXF1YWxpdHlDaGVjaztcblxuY29uc3QgaXNPcm1TdGF0ZSA9IGFyZyA9PlxuICAgIGFyZyAmJiB0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZy5oYXNPd25Qcm9wZXJ0eShTVEFURV9GTEFHKTtcblxuY29uc3QgYXJnc0FyZUVxdWFsID0gKGxhc3RBcmdzLCBuZXh0QXJncywgZXF1YWxpdHlDaGVjaykgPT5cbiAgICBuZXh0QXJncy5ldmVyeShcbiAgICAgICAgKGFyZywgaW5kZXgpID0+XG4gICAgICAgICAgICAoaXNPcm1TdGF0ZShhcmcpICYmIGlzT3JtU3RhdGUobGFzdEFyZ3NbaW5kZXhdKSkgfHxcbiAgICAgICAgICAgIGVxdWFsaXR5Q2hlY2soYXJnLCBsYXN0QXJnc1tpbmRleF0pXG4gICAgKTtcblxuY29uc3Qgcm93c0FyZUVxdWFsID0gKGlkcywgcm93c0EsIHJvd3NCKSA9PlxuICAgIGlkcy5ldmVyeShpZCA9PiByb3dzQVtpZF0gPT09IHJvd3NCW2lkXSk7XG5cbmNvbnN0IGFjY2Vzc2VkTW9kZWxJbnN0YW5jZXNBcmVFcXVhbCA9IChwcmV2aW91cywgb3JtU3RhdGUsIG9ybSkgPT4ge1xuICAgIGNvbnN0IHsgYWNjZXNzZWRJbnN0YW5jZXMgfSA9IHByZXZpb3VzO1xuXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGFjY2Vzc2VkSW5zdGFuY2VzKS5ldmVyeSgoW21vZGVsTmFtZSwgaW5zdGFuY2VzXSkgPT4ge1xuICAgICAgICAvLyBpZiB0aGUgZW50aXJlIHRhYmxlIGhhcyBub3QgYmVlbiBjaGFuZ2VkLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgaWYgKHByZXZpb3VzLm9ybVN0YXRlW21vZGVsTmFtZV0gPT09IG9ybVN0YXRlW21vZGVsTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtYXBOYW1lIH0gPSBvcm0uZ2V0RGF0YWJhc2UoKS5kZXNjcmliZShtb2RlbE5hbWUpO1xuXG4gICAgICAgIGNvbnN0IHsgW21hcE5hbWVdOiBwcmV2aW91c1Jvd3MgfSA9IHByZXZpb3VzLm9ybVN0YXRlW21vZGVsTmFtZV07XG4gICAgICAgIGNvbnN0IHsgW21hcE5hbWVdOiByb3dzIH0gPSBvcm1TdGF0ZVttb2RlbE5hbWVdO1xuXG4gICAgICAgIGNvbnN0IGFjY2Vzc2VkSWRzID0gT2JqZWN0LmtleXMoaW5zdGFuY2VzKTtcbiAgICAgICAgcmV0dXJuIHJvd3NBcmVFcXVhbChhY2Nlc3NlZElkcywgcHJldmlvdXNSb3dzLCByb3dzKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGFjY2Vzc2VkSW5kZXhlc0FyZUVxdWFsID0gKHByZXZpb3VzLCBvcm1TdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgYWNjZXNzZWRJbmRleGVzIH0gPSBwcmV2aW91cztcblxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhhY2Nlc3NlZEluZGV4ZXMpLmV2ZXJ5KChbbW9kZWxOYW1lLCBpbmRleGVzXSkgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaW5kZXhlcykuZXZlcnkoKFtjb2x1bW4sIHZhbHVlc10pID0+XG4gICAgICAgICAgICB2YWx1ZXMuZXZlcnkoXG4gICAgICAgICAgICAgICAgdmFsdWUgPT5cbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMub3JtU3RhdGVbbW9kZWxOYW1lXS5pbmRleGVzW2NvbHVtbl1bdmFsdWVdID09PVxuICAgICAgICAgICAgICAgICAgICBvcm1TdGF0ZVttb2RlbE5hbWVdLmluZGV4ZXNbY29sdW1uXVt2YWx1ZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICk7XG59O1xuXG5jb25zdCBmdWxsVGFibGVTY2FubmVkTW9kZWxzQXJlRXF1YWwgPSAocHJldmlvdXMsIG9ybVN0YXRlKSA9PlxuICAgIHByZXZpb3VzLmZ1bGxUYWJsZVNjYW5uZWRNb2RlbHMuZXZlcnkoXG4gICAgICAgIG1vZGVsTmFtZSA9PiBwcmV2aW91cy5vcm1TdGF0ZVttb2RlbE5hbWVdID09PSBvcm1TdGF0ZVttb2RlbE5hbWVdXG4gICAgKTtcblxuLyoqXG4gKiBBIG1lbW9pemVyIHRvIHVzZSB3aXRoIHJlZHV4LW9ybVxuICogc2VsZWN0b3JzLiBXaGVuIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyBmaXJzdCBydW4sXG4gKiB0aGUgbWVtb2l6ZXIgd2lsbCByZW1lbWJlciB0aGUgbW9kZWxzIHRoYXQgYXJlIGFjY2Vzc2VkXG4gKiBkdXJpbmcgdGhhdCBmdW5jdGlvbiBydW4uXG4gKlxuICogT24gc3Vic2VxdWVudCBydW5zLCB0aGUgbWVtb2l6ZXIgd2lsbCBjaGVjayBpZiB0aG9zZVxuICogbW9kZWxzJyBzdGF0ZXMgaGF2ZSBjaGFuZ2VkIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cyBydW4uXG4gKlxuICogTWVtb2l6YXRpb24gYWxnb3JpdGhtIG9wZXJhdGVzIGxpa2UgdGhpczpcbiAqXG4gKiAxLiBIYXMgdGhlIHNlbGVjdG9yIGJlZW4gcnVuIGJlZm9yZT8gSWYgbm90LCBnbyB0byA2LlxuICpcbiAqIDIuIElmIHRoZSBzZWxlY3RvciBoYXMgb3RoZXIgaW5wdXQgc2VsZWN0b3JzIGluIGFkZGl0aW9uIHRvIHRoZVxuICogICAgT1JNIHN0YXRlIHNlbGVjdG9yLCBjaGVjayB0aGVpciByZXN1bHRzIGZvciBlcXVhbGl0eSB3aXRoIHRoZSBwcmV2aW91cyByZXN1bHRzLlxuICogICAgSWYgdGhleSBhcmVuJ3QgZXF1YWwsIGdvIHRvIDYuXG4gKlxuICogMy4gU29tZSBmaWx0ZXIgcXVlcmllcyBtYXkgaGF2ZSByZXF1aXJlZCBzY2FubmluZyBlbnRpcmUgdGFibGVzIGR1cmluZyB0aGUgbGFzdCBydW4uXG4gKiAgICBJZiBhbnkgb2YgdGhvc2UgdGFibGVzIGhhdmUgY2hhbmdlZCwgZ28gdG8gNi5cbiAqXG4gKiA0LiBDaGVjayB3aGljaCBmb3JlaWduIGtleSBpbmRleGVzIHRoZSBkYXRhYmFzZSBoYXMgdXNlZCB0byBzcGVlZCB1cCBxdWVyaWVzXG4gKiAgICBkdXJpbmcgdGhlIGxhc3QgcnVuLiBJZiBhbnkgaGF2ZSBjaGFuZ2VkLCBnbyB0byA2LlxuICpcbiAqIDUuIENoZWNrIHdoaWNoIE1vZGVsJ3MgaW5zdGFuY2VzIHRoZSBzZWxlY3RvciBoYXMgYWNjZXNzZWQgZHVyaW5nIHRoZSBsYXN0IHJ1bi5cbiAqICAgIENoZWNrIGZvciBlcXVhbGl0eSB3aXRoIGVhY2ggb2YgdGhvc2Ugc3RhdGVzIHZlcnN1cyB0aGVpciBzdGF0ZXMgaW4gdGhlXG4gKiAgICBwcmV2aW91cyBPUk0gc3RhdGUuIElmIGFsbCBvZiB0aGVtIGFyZSBlcXVhbCwgcmV0dXJuIHRoZSBwcmV2aW91cyByZXN1bHQuXG4gKlxuICogNi4gUnVuIHRoZSBzZWxlY3Rvci4gQ2hlY2sgdGhlIFNlc3Npb24gb2JqZWN0IHVzZWQgYnkgdGhlIHNlbGVjdG9yIGZvclxuICogICAgd2hpY2ggTW9kZWwncyBzdGF0ZXMgd2VyZSBhY2Nlc3NlZCwgYW5kIG1lcmdlIHRoZW0gd2l0aCB0aGUgcHJldmlvdXNseVxuICogICAgc2F2ZWQgaW5mb3JtYXRpb24gYWJvdXQgYWNjZXNzZWQgbW9kZWxzIChpZi1lbHNlIGJyYW5jaGluZyBjYW4gY2hhbmdlXG4gKiAgICB3aGljaCBtb2RlbHMgYXJlIGFjY2Vzc2VkIG9uIGRpZmZlcmVudCBpbnB1dHMpLiBTYXZlIHRoZSBPUk0gc3RhdGUgYW5kXG4gKiAgICBvdGhlciBhcmd1bWVudHMgdGhlIHNlbGVjdG9yIHdhcyBjYWxsZWQgd2l0aCwgb3ZlcnJpZGluZyBwcmV2aW91c2x5XG4gKiAgICBzYXZlZCB2YWx1ZXMuIFNhdmUgdGhlIHNlbGVjdG9yIHJlc3VsdC4gUmV0dXJuIHRoZSBzZWxlY3RvciByZXN1bHQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmdW5jIC0gZnVuY3Rpb24gdG8gbWVtb2l6ZVxuICogQHBhcmFtICB7RnVuY3Rpb259IGFyZ0VxdWFsaXR5Q2hlY2sgLSBlcXVhbGl0eSBjaGVjayBmdW5jdGlvbiB0byB1c2Ugd2l0aCBub3JtYWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgYXJnc1xuICogQHBhcmFtICB7T1JNfSBvcm0gLSBhIHJlZHV4LW9ybSBPUk0gaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBgZnVuY2AgbWVtb2l6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIGFyZ0VxdWFsaXR5Q2hlY2sgPSBkZWZhdWx0RXF1YWxpdHlDaGVjaywgb3JtKSB7XG4gICAgbGV0IHByZXZpb3VzID0ge1xuICAgICAgICAvKiBSZXN1bHQgb2YgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNhbGwgKi9cbiAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAvKiBBcmd1bWVudHMgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNhbGwgKGV4Y2x1ZGluZyBPUk0gc3RhdGUpICovXG4gICAgICAgIGFyZ3M6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTbmFwc2hvdCBvZiB0aGUgcHJldmlvdXMgZGF0YWJhc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIExldHMgdXMga25vdyBob3cgdGhlIHRhYmxlcyBsb29rZWQgbGlrZVxuICAgICAgICAgKiBkdXJpbmcgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBvcm1TdGF0ZTogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5hbWVzIG9mIG1vZGVscyB3aG9zZSB0YWJsZXMgaGF2ZSBiZWVuIHNjYW5uZWQgY29tcGxldGVseVxuICAgICAgICAgKiBkdXJpbmcgcHJldmlvdXMgZnVuY3Rpb24gY2FsbCAoY29udGFpbnMgb25seSBtb2RlbCBuYW1lcylcbiAgICAgICAgICogRm9ybWF0IGV4YW1wbGU6IFsnQm9vayddXG4gICAgICAgICAqL1xuICAgICAgICBmdWxsVGFibGVTY2FubmVkTW9kZWxzOiBbXSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcCBvZiB3aGljaCBtb2RlbCBpbnN0YW5jZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkXG4gICAgICAgICAqIGR1cmluZyBwcmV2aW91cyBmdW5jdGlvbiBjYWxsLlxuICAgICAgICAgKiBDb250YWlucyBvbmx5IFBLcyBvZiBhY2Nlc3NlZCBpbnN0YW5jZXMuXG4gICAgICAgICAqIEZvcm1hdCBleGFtcGxlOiB7IEJvb2s6IHsgMTogdHJ1ZSwgMzogdHJ1ZSB9IH1cbiAgICAgICAgICovXG4gICAgICAgIGFjY2Vzc2VkSW5zdGFuY2VzOiB7fSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcCBvZiB3aGljaCBhdHRyaWJ1dGUgaW5kZXhlcyBoYXZlIGJlZW4gYWNjZXNzZWRcbiAgICAgICAgICogZHVyaW5nIHByZXZpb3VzIGZ1bmN0aW9uIGNhbGwuXG4gICAgICAgICAqIENvbnRhaW5zIG9ubHkgYXR0cmlidXRlcyB0aGF0IHdlcmUgYWN0dWFsbHkgZmlsdGVyZWQgb24uXG4gICAgICAgICAqIEF1dGhvci53aXRoSWQoMykuYm9va3Mgd291bGQgYWRkIDMgdG8gdGhlIGF1dGhvcklkIGluZGV4IGJlbG93LlxuICAgICAgICAgKiBGb3JtYXQgZXhhbXBsZTogeyBCb29rOiB7IGF1dGhvcklkOiBbMSwgMl0sIHB1Ymxpc2hlcklkOiBbNV0gfSB9XG4gICAgICAgICAqL1xuICAgICAgICBhY2Nlc3NlZEluZGV4ZXM6IHt9LFxuICAgIH07XG5cbiAgICByZXR1cm4gKC4uLnN0YXRlQW5kQXJncykgPT4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmVcbiAgICAgICAgICogdGhlIE9STSdzIHJlZHVjZXIgc3RhdGUgaW4gdGhlIHVzZXIncyBSZWR1eCBzdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IFtvcm1TdGF0ZSwgLi4uYXJnc10gPSBzdGF0ZUFuZEFyZ3M7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0b3JXYXNDYWxsZWRCZWZvcmUgPSBCb29sZWFuKHByZXZpb3VzLmFyZ3MpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3Rvcldhc0NhbGxlZEJlZm9yZSAmJlxuICAgICAgICAgICAgYXJnc0FyZUVxdWFsKHByZXZpb3VzLmFyZ3MsIGFyZ3MsIGFyZ0VxdWFsaXR5Q2hlY2spICYmXG4gICAgICAgICAgICBmdWxsVGFibGVTY2FubmVkTW9kZWxzQXJlRXF1YWwocHJldmlvdXMsIG9ybVN0YXRlKSAmJlxuICAgICAgICAgICAgYWNjZXNzZWRJbmRleGVzQXJlRXF1YWwocHJldmlvdXMsIG9ybVN0YXRlKSAmJlxuICAgICAgICAgICAgYWNjZXNzZWRNb2RlbEluc3RhbmNlc0FyZUVxdWFsKHByZXZpb3VzLCBvcm1TdGF0ZSwgb3JtKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTm9uZSBvZiB0aGlzIHNlbGVjdG9yJ3MgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICogc2luY2UgdGhlIGxhc3QgdGltZSB0aGF0IHdlIGNhbGxlZCBpdC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzLnJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGFydCBhIHNlc3Npb24gc28gdGhhdCB0aGUgc2VsZWN0b3IgY2FuIGFjY2VzcyB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIE1ha2UgdGhpcyBzZXNzaW9uIGltbXV0YWJsZS4gVGhpcyB3YXkgd2UgY2FuIGZpbmQgb3V0IGlmXG4gICAgICAgICAqIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIHNlbGVjdG9yIHBlcmZvcm1zIGFyZSBjYWNoZWFibGUuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gb3JtLnNlc3Npb24ob3JtU3RhdGUpO1xuICAgICAgICAvKiBSZXBsYWNlIGFsbCBPUk0gc3RhdGUgYXJndW1lbnRzIGJ5IHRoZSBzZXNzaW9uIGFib3ZlICovXG4gICAgICAgIGNvbnN0IGFyZ3NXaXRoU2Vzc2lvbiA9IGFyZ3MubWFwKGFyZyA9PlxuICAgICAgICAgICAgaXNPcm1TdGF0ZShhcmcpID8gc2Vzc2lvbiA6IGFyZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgYWN0dWFsIGZ1bmN0aW9uICovXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMuYXBwbHkobnVsbCwgYXJnc1dpdGhTZXNzaW9uKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByZXZpb3VzIGNhbGwgYXJlIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgICAgICogVXBkYXRlIGNhY2hlZCB2YWx1ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aW91cyA9IHtcbiAgICAgICAgICAgIC8qIEFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBzZWxlY3RvciAqL1xuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIC8qIFNlbGVjdG9yIHJlc3VsdCAqL1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgLyogUmVkdXggc3RhdGUgc2xpY2UgZm9yIHNlc3Npb24uc3RhdGUgKi9cbiAgICAgICAgICAgIG9ybVN0YXRlLFxuICAgICAgICAgICAgLyogUm93cyByZXRyaWV2ZWQgYnkgcmVzb2x2ZWQgcHJpbWFyeSBrZXkgKi9cbiAgICAgICAgICAgIGFjY2Vzc2VkSW5zdGFuY2VzOiBzZXNzaW9uLmFjY2Vzc2VkTW9kZWxJbnN0YW5jZXMsXG4gICAgICAgICAgICAvKiBGb3JlaWduIGtleSBpbmRleGVzIHRoYXQgd2VyZSB1c2VkIHRvIHNwZWVkIHVwIHF1ZXJpZXMgKi9cbiAgICAgICAgICAgIGFjY2Vzc2VkSW5kZXhlczogc2Vzc2lvbi5hY2Nlc3NlZEluZGV4ZXMsXG4gICAgICAgICAgICAvKiBUYWJsZXMgdGhhdCBoYWQgdG8gYmUgc2Nhbm5lZCBjb21wbGV0ZWx5ICovXG4gICAgICAgICAgICBmdWxsVGFibGVTY2FubmVkTW9kZWxzOiBzZXNzaW9uLmZ1bGxUYWJsZVNjYW5uZWRNb2RlbHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/memoize.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"eqCheck\", function() { return eqCheck; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"memoize\", function() { return memoize; });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\nconst defaultEqualityCheck = (a, b) => a === b;\n\nconst eqCheck = defaultEqualityCheck;\n\nconst isOrmState = arg => arg && typeof arg === \"object\" && arg.hasOwnProperty(_constants__WEBPACK_IMPORTED_MODULE_0__[\"STATE_FLAG\"]);\n\nconst argsAreEqual = (lastArgs, nextArgs, equalityCheck) => nextArgs.every((arg, index) => isOrmState(arg) && isOrmState(lastArgs[index]) || equalityCheck(arg, lastArgs[index]));\n\nconst rowsAreEqual = (ids, rowsA, rowsB) => ids.every(id => rowsA[id] === rowsB[id]);\n\nconst accessedModelInstancesAreEqual = (previous, ormState, orm) => {\n const {\n accessedInstances\n } = previous;\n return Object.entries(accessedInstances).every(([modelName, instances]) => {\n // if the entire table has not been changed, we have nothing to do\n if (previous.ormState[modelName] === ormState[modelName]) {\n return true;\n }\n\n const {\n mapName\n } = orm.getDatabase().describe(modelName);\n const {\n [mapName]: previousRows\n } = previous.ormState[modelName];\n const {\n [mapName]: rows\n } = ormState[modelName];\n const accessedIds = Object.keys(instances);\n return rowsAreEqual(accessedIds, previousRows, rows);\n });\n};\n\nconst accessedIndexesAreEqual = (previous, ormState) => {\n const {\n accessedIndexes\n } = previous;\n return Object.entries(accessedIndexes).every(([modelName, indexes]) => Object.entries(indexes).every(([column, values]) => values.every(value => previous.ormState[modelName].indexes[column][value] === ormState[modelName].indexes[column][value])));\n};\n\nconst fullTableScannedModelsAreEqual = (previous, ormState) => previous.fullTableScannedModels.every(modelName => previous.ormState[modelName] === ormState[modelName]);\n/**\n * A memoizer to use with redux-orm\n * selectors. When the memoized function is first run,\n * the memoizer will remember the models that are accessed\n * during that function run.\n *\n * On subsequent runs, the memoizer will check if those\n * models' states have changed compared to the previous run.\n *\n * Memoization algorithm operates like this:\n *\n * 1. Has the selector been run before? If not, go to 6.\n *\n * 2. If the selector has other input selectors in addition to the\n * ORM state selector, check their results for equality with the previous results.\n * If they aren't equal, go to 6.\n *\n * 3. Some filter queries may have required scanning entire tables during the last run.\n * If any of those tables have changed, go to 6.\n *\n * 4. Check which foreign key indexes the database has used to speed up queries\n * during the last run. If any have changed, go to 6.\n *\n * 5. Check which Model's instances the selector has accessed during the last run.\n * Check for equality with each of those states versus their states in the\n * previous ORM state. If all of them are equal, return the previous result.\n *\n * 6. Run the selector. Check the Session object used by the selector for\n * which Model's states were accessed, and merge them with the previously\n * saved information about accessed models (if-else branching can change\n * which models are accessed on different inputs). Save the ORM state and\n * other arguments the selector was called with, overriding previously\n * saved values. Save the selector result. Return the selector result.\n *\n * @private\n * @param {Function} func - function to memoize\n * @param {Function} argEqualityCheck - equality check function to use with normal\n * selector args\n * @param {ORM} orm - a redux-orm ORM instance\n * @return {Function} `func` memoized.\n */\n\n\nfunction memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {\n let previous = {\n /* Result of the previous function call */\n result: null,\n\n /* Arguments to the previous function call (excluding ORM state) */\n args: null,\n\n /**\n * Snapshot of the previous database.\n *\n * Lets us know how the tables looked like\n * during the previous function call.\n */\n ormState: null,\n\n /**\n * Names of models whose tables have been scanned completely\n * during previous function call (contains only model names)\n * Format example: ['Book']\n */\n fullTableScannedModels: [],\n\n /**\n * Map of which model instances have been accessed\n * during previous function call.\n * Contains only PKs of accessed instances.\n * Format example: { Book: { 1: true, 3: true } }\n */\n accessedInstances: {},\n\n /**\n * Map of which attribute indexes have been accessed\n * during previous function call.\n * Contains only attributes that were actually filtered on.\n * Author.withId(3).books would add 3 to the authorId index below.\n * Format example: { Book: { authorId: [1, 2], publisherId: [5] } }\n */\n accessedIndexes: {}\n };\n return (...stateAndArgs) => {\n /**\n * The first argument to this function needs to be\n * the ORM's reducer state in the user's Redux store.\n */\n const [ormState, ...args] = stateAndArgs;\n const selectorWasCalledBefore = Boolean(previous.args);\n\n if (selectorWasCalledBefore && argsAreEqual(previous.args, args, argEqualityCheck) && fullTableScannedModelsAreEqual(previous, ormState) && accessedIndexesAreEqual(previous, ormState) && accessedModelInstancesAreEqual(previous, ormState, orm)) {\n /**\n * None of this selector's dependencies have changed\n * since the last time that we called it.\n */\n return previous.result;\n }\n /**\n * Start a session so that the selector can access the database.\n * Make this session immutable. This way we can find out if\n * the operations that the selector performs are cacheable.\n */\n\n\n const session = orm.session(ormState);\n /* Replace all ORM state arguments by the session above */\n\n const argsWithSession = args.map(arg => isOrmState(arg) ? session : arg);\n /* This is where we call the actual function */\n\n const result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread\n\n /**\n * The metadata for the previous call are no longer valid.\n * Update cached values.\n */\n\n previous = {\n /* Arguments that were passed to the selector */\n args,\n\n /* Selector result */\n result,\n\n /* Redux state slice for session.state */\n ormState,\n\n /* Rows retrieved by resolved primary key */\n accessedInstances: session.accessedModelInstances,\n\n /* Foreign key indexes that were used to speed up queries */\n accessedIndexes: session.accessedIndexes,\n\n /* Tables that had to be scanned completely */\n fullTableScannedModels: session.fullTableScannedModels\n };\n return result;\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9tZW1vaXplLmpzPzkxY2IiXSwibmFtZXMiOlsiZGVmYXVsdEVxdWFsaXR5Q2hlY2siLCJhIiwiYiIsImVxQ2hlY2siLCJpc09ybVN0YXRlIiwiYXJnIiwiaGFzT3duUHJvcGVydHkiLCJTVEFURV9GTEFHIiwiYXJnc0FyZUVxdWFsIiwibGFzdEFyZ3MiLCJuZXh0QXJncyIsImVxdWFsaXR5Q2hlY2siLCJldmVyeSIsImluZGV4Iiwicm93c0FyZUVxdWFsIiwiaWRzIiwicm93c0EiLCJyb3dzQiIsImlkIiwiYWNjZXNzZWRNb2RlbEluc3RhbmNlc0FyZUVxdWFsIiwicHJldmlvdXMiLCJvcm1TdGF0ZSIsIm9ybSIsImFjY2Vzc2VkSW5zdGFuY2VzIiwiT2JqZWN0IiwiZW50cmllcyIsIm1vZGVsTmFtZSIsImluc3RhbmNlcyIsIm1hcE5hbWUiLCJnZXREYXRhYmFzZSIsImRlc2NyaWJlIiwicHJldmlvdXNSb3dzIiwicm93cyIsImFjY2Vzc2VkSWRzIiwia2V5cyIsImFjY2Vzc2VkSW5kZXhlc0FyZUVxdWFsIiwiYWNjZXNzZWRJbmRleGVzIiwiaW5kZXhlcyIsImNvbHVtbiIsInZhbHVlcyIsInZhbHVlIiwiZnVsbFRhYmxlU2Nhbm5lZE1vZGVsc0FyZUVxdWFsIiwiZnVsbFRhYmxlU2Nhbm5lZE1vZGVscyIsIm1lbW9pemUiLCJmdW5jIiwiYXJnRXF1YWxpdHlDaGVjayIsInJlc3VsdCIsImFyZ3MiLCJzdGF0ZUFuZEFyZ3MiLCJzZWxlY3Rvcldhc0NhbGxlZEJlZm9yZSIsIkJvb2xlYW4iLCJzZXNzaW9uIiwiYXJnc1dpdGhTZXNzaW9uIiwibWFwIiwiYXBwbHkiLCJhY2Nlc3NlZE1vZGVsSW5zdGFuY2VzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLENBQUNDLENBQUQsRUFBSUMsQ0FBSixLQUFVRCxDQUFDLEtBQUtDLENBQTdDOztBQUNP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LElBR0FjLHVCQUF1QixDQUFDZixRQUFELEVBQVdDLFFBQVgsQ0FIdkIsSUFJQUYsOEJBQThCLENBQUNDLFFBQUQsRUFBV0MsUUFBWCxFQUFxQkMsR0FBckIsQ0FMbEMsRUFNRTtBQUNFO0FBQ1o7QUFDQTtBQUNBO0FBQ1ksYUFBT0YsUUFBUSxDQUFDMEIsTUFBaEI7QUFDSDtBQUVEO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7OztBQUNRLFVBQU1LLE9BQU8sR0FBRzdCLEdBQUcsQ0FBQzZCLE9BQUosQ0FBWTlCLFFBQVosQ0FBaEI7QUFDQTs7QUFDQSxVQUFNK0IsZUFBZSxHQUFHTCxJQUFJLENBQUNNLEdBQUwsQ0FBVWhELEdBQUQsSUFDN0JELFVBQVUsQ0FBQ0MsR0FBRCxDQUFWLEdBQWtCOEMsT0FBbEIsR0FBNEI5QyxHQURSLENBQXhCO0FBSUE7O0FBQ0EsVUFBTXlDLE1BQU0sR0FBR0YsSUFBSSxDQUFDVSxLQUFMLENBQVcsSUFBWCxFQUFpQkYsZUFBakIsQ0FBZixDQWxDd0IsQ0FrQzBCOztBQUVsRDtBQUNSO0FBQ0E7QUFDQTs7QUFDUWhDLFlBQVEsR0FBRztBQUNQO0FBQ0EyQixVQUZPOztBQUdQO0FBQ0FELFlBSk87O0FBS1A7QUFDQXpCLGNBTk87O0FBT1A7QUFDQUUsdUJBQWlCLEVBQUU0QixPQUFPLENBQUNJLHNCQVJwQjs7QUFTUDtBQUNBbkIscUJBQWUsRUFBRWUsT0FBTyxDQUFDZixlQVZsQjs7QUFXUDtBQUNBTSw0QkFBc0IsRUFBRVMsT0FBTyxDQUFDVDtBQVp6QixLQUFYO0FBZUEsV0FBT0ksTUFBUDtBQUNILEdBeEREO0FBeURIIiwiZmlsZSI6Ii4vc3JjL21lbW9pemUuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTVEFURV9GTEFHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmNvbnN0IGRlZmF1bHRFcXVhbGl0eUNoZWNrID0gKGEsIGIpID0+IGEgPT09IGI7XG5leHBvcnQgY29uc3QgZXFDaGVjayA9IGRlZmF1bHRFcXVhbGl0eUNoZWNrO1xuXG5jb25zdCBpc09ybVN0YXRlID0gKGFyZykgPT5cbiAgICBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiBhcmcuaGFzT3duUHJvcGVydHkoU1RBVEVfRkxBRyk7XG5cbmNvbnN0IGFyZ3NBcmVFcXVhbCA9IChsYXN0QXJncywgbmV4dEFyZ3MsIGVxdWFsaXR5Q2hlY2spID0+XG4gICAgbmV4dEFyZ3MuZXZlcnkoXG4gICAgICAgIChhcmcsIGluZGV4KSA9PlxuICAgICAgICAgICAgKGlzT3JtU3RhdGUoYXJnKSAmJiBpc09ybVN0YXRlKGxhc3RBcmdzW2luZGV4XSkpIHx8XG4gICAgICAgICAgICBlcXVhbGl0eUNoZWNrKGFyZywgbGFzdEFyZ3NbaW5kZXhdKVxuICAgICk7XG5cbmNvbnN0IHJvd3NBcmVFcXVhbCA9IChpZHMsIHJvd3NBLCByb3dzQikgPT5cbiAgICBpZHMuZXZlcnkoKGlkKSA9PiByb3dzQVtpZF0gPT09IHJvd3NCW2lkXSk7XG5cbmNvbnN0IGFjY2Vzc2VkTW9kZWxJbnN0YW5jZXNBcmVFcXVhbCA9IChwcmV2aW91cywgb3JtU3RhdGUsIG9ybSkgPT4ge1xuICAgIGNvbnN0IHsgYWNjZXNzZWRJbnN0YW5jZXMgfSA9IHByZXZpb3VzO1xuXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGFjY2Vzc2VkSW5zdGFuY2VzKS5ldmVyeSgoW21vZGVsTmFtZSwgaW5zdGFuY2VzXSkgPT4ge1xuICAgICAgICAvLyBpZiB0aGUgZW50aXJlIHRhYmxlIGhhcyBub3QgYmVlbiBjaGFuZ2VkLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgaWYgKHByZXZpb3VzLm9ybVN0YXRlW21vZGVsTmFtZV0gPT09IG9ybVN0YXRlW21vZGVsTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtYXBOYW1lIH0gPSBvcm0uZ2V0RGF0YWJhc2UoKS5kZXNjcmliZShtb2RlbE5hbWUpO1xuXG4gICAgICAgIGNvbnN0IHsgW21hcE5hbWVdOiBwcmV2aW91c1Jvd3MgfSA9IHByZXZpb3VzLm9ybVN0YXRlW21vZGVsTmFtZV07XG4gICAgICAgIGNvbnN0IHsgW21hcE5hbWVdOiByb3dzIH0gPSBvcm1TdGF0ZVttb2RlbE5hbWVdO1xuXG4gICAgICAgIGNvbnN0IGFjY2Vzc2VkSWRzID0gT2JqZWN0LmtleXMoaW5zdGFuY2VzKTtcbiAgICAgICAgcmV0dXJuIHJvd3NBcmVFcXVhbChhY2Nlc3NlZElkcywgcHJldmlvdXNSb3dzLCByb3dzKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGFjY2Vzc2VkSW5kZXhlc0FyZUVxdWFsID0gKHByZXZpb3VzLCBvcm1TdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgYWNjZXNzZWRJbmRleGVzIH0gPSBwcmV2aW91cztcblxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhhY2Nlc3NlZEluZGV4ZXMpLmV2ZXJ5KChbbW9kZWxOYW1lLCBpbmRleGVzXSkgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaW5kZXhlcykuZXZlcnkoKFtjb2x1bW4sIHZhbHVlc10pID0+XG4gICAgICAgICAgICB2YWx1ZXMuZXZlcnkoXG4gICAgICAgICAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5vcm1TdGF0ZVttb2RlbE5hbWVdLmluZGV4ZXNbY29sdW1uXVt2YWx1ZV0gPT09XG4gICAgICAgICAgICAgICAgICAgIG9ybVN0YXRlW21vZGVsTmFtZV0uaW5kZXhlc1tjb2x1bW5dW3ZhbHVlXVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgKTtcbn07XG5cbmNvbnN0IGZ1bGxUYWJsZVNjYW5uZWRNb2RlbHNBcmVFcXVhbCA9IChwcmV2aW91cywgb3JtU3RhdGUpID0+XG4gICAgcHJldmlvdXMuZnVsbFRhYmxlU2Nhbm5lZE1vZGVscy5ldmVyeShcbiAgICAgICAgKG1vZGVsTmFtZSkgPT4gcHJldmlvdXMub3JtU3RhdGVbbW9kZWxOYW1lXSA9PT0gb3JtU3RhdGVbbW9kZWxOYW1lXVxuICAgICk7XG5cbi8qKlxuICogQSBtZW1vaXplciB0byB1c2Ugd2l0aCByZWR1eC1vcm1cbiAqIHNlbGVjdG9ycy4gV2hlbiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgZmlyc3QgcnVuLFxuICogdGhlIG1lbW9pemVyIHdpbGwgcmVtZW1iZXIgdGhlIG1vZGVscyB0aGF0IGFyZSBhY2Nlc3NlZFxuICogZHVyaW5nIHRoYXQgZnVuY3Rpb24gcnVuLlxuICpcbiAqIE9uIHN1YnNlcXVlbnQgcnVucywgdGhlIG1lbW9pemVyIHdpbGwgY2hlY2sgaWYgdGhvc2VcbiAqIG1vZGVscycgc3RhdGVzIGhhdmUgY2hhbmdlZCBjb21wYXJlZCB0byB0aGUgcHJldmlvdXMgcnVuLlxuICpcbiAqIE1lbW9pemF0aW9uIGFsZ29yaXRobSBvcGVyYXRlcyBsaWtlIHRoaXM6XG4gKlxuICogMS4gSGFzIHRoZSBzZWxlY3RvciBiZWVuIHJ1biBiZWZvcmU/IElmIG5vdCwgZ28gdG8gNi5cbiAqXG4gKiAyLiBJZiB0aGUgc2VsZWN0b3IgaGFzIG90aGVyIGlucHV0IHNlbGVjdG9ycyBpbiBhZGRpdGlvbiB0byB0aGVcbiAqICAgIE9STSBzdGF0ZSBzZWxlY3RvciwgY2hlY2sgdGhlaXIgcmVzdWx0cyBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgcHJldmlvdXMgcmVzdWx0cy5cbiAqICAgIElmIHRoZXkgYXJlbid0IGVxdWFsLCBnbyB0byA2LlxuICpcbiAqIDMuIFNvbWUgZmlsdGVyIHF1ZXJpZXMgbWF5IGhhdmUgcmVxdWlyZWQgc2Nhbm5pbmcgZW50aXJlIHRhYmxlcyBkdXJpbmcgdGhlIGxhc3QgcnVuLlxuICogICAgSWYgYW55IG9mIHRob3NlIHRhYmxlcyBoYXZlIGNoYW5nZWQsIGdvIHRvIDYuXG4gKlxuICogNC4gQ2hlY2sgd2hpY2ggZm9yZWlnbiBrZXkgaW5kZXhlcyB0aGUgZGF0YWJhc2UgaGFzIHVzZWQgdG8gc3BlZWQgdXAgcXVlcmllc1xuICogICAgZHVyaW5nIHRoZSBsYXN0IHJ1bi4gSWYgYW55IGhhdmUgY2hhbmdlZCwgZ28gdG8gNi5cbiAqXG4gKiA1LiBDaGVjayB3aGljaCBNb2RlbCdzIGluc3RhbmNlcyB0aGUgc2VsZWN0b3IgaGFzIGFjY2Vzc2VkIGR1cmluZyB0aGUgbGFzdCBydW4uXG4gKiAgICBDaGVjayBmb3IgZXF1YWxpdHkgd2l0aCBlYWNoIG9mIHRob3NlIHN0YXRlcyB2ZXJzdXMgdGhlaXIgc3RhdGVzIGluIHRoZVxuICogICAgcHJldmlvdXMgT1JNIHN0YXRlLiBJZiBhbGwgb2YgdGhlbSBhcmUgZXF1YWwsIHJldHVybiB0aGUgcHJldmlvdXMgcmVzdWx0LlxuICpcbiAqIDYuIFJ1biB0aGUgc2VsZWN0b3IuIENoZWNrIHRoZSBTZXNzaW9uIG9iamVjdCB1c2VkIGJ5IHRoZSBzZWxlY3RvciBmb3JcbiAqICAgIHdoaWNoIE1vZGVsJ3Mgc3RhdGVzIHdlcmUgYWNjZXNzZWQsIGFuZCBtZXJnZSB0aGVtIHdpdGggdGhlIHByZXZpb3VzbHlcbiAqICAgIHNhdmVkIGluZm9ybWF0aW9uIGFib3V0IGFjY2Vzc2VkIG1vZGVscyAoaWYtZWxzZSBicmFuY2hpbmcgY2FuIGNoYW5nZVxuICogICAgd2hpY2ggbW9kZWxzIGFyZSBhY2Nlc3NlZCBvbiBkaWZmZXJlbnQgaW5wdXRzKS4gU2F2ZSB0aGUgT1JNIHN0YXRlIGFuZFxuICogICAgb3RoZXIgYXJndW1lbnRzIHRoZSBzZWxlY3RvciB3YXMgY2FsbGVkIHdpdGgsIG92ZXJyaWRpbmcgcHJldmlvdXNseVxuICogICAgc2F2ZWQgdmFsdWVzLiBTYXZlIHRoZSBzZWxlY3RvciByZXN1bHQuIFJldHVybiB0aGUgc2VsZWN0b3IgcmVzdWx0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZnVuYyAtIGZ1bmN0aW9uIHRvIG1lbW9pemVcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBhcmdFcXVhbGl0eUNoZWNrIC0gZXF1YWxpdHkgY2hlY2sgZnVuY3Rpb24gdG8gdXNlIHdpdGggbm9ybWFsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yIGFyZ3NcbiAqIEBwYXJhbSAge09STX0gb3JtIC0gYSByZWR1eC1vcm0gT1JNIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gYGZ1bmNgIG1lbW9pemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCBhcmdFcXVhbGl0eUNoZWNrID0gZGVmYXVsdEVxdWFsaXR5Q2hlY2ssIG9ybSkge1xuICAgIGxldCBwcmV2aW91cyA9IHtcbiAgICAgICAgLyogUmVzdWx0IG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbiBjYWxsICovXG4gICAgICAgIHJlc3VsdDogbnVsbCxcbiAgICAgICAgLyogQXJndW1lbnRzIHRvIHRoZSBwcmV2aW91cyBmdW5jdGlvbiBjYWxsIChleGNsdWRpbmcgT1JNIHN0YXRlKSAqL1xuICAgICAgICBhcmdzOiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogU25hcHNob3Qgb2YgdGhlIHByZXZpb3VzIGRhdGFiYXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBMZXRzIHVzIGtub3cgaG93IHRoZSB0YWJsZXMgbG9va2VkIGxpa2VcbiAgICAgICAgICogZHVyaW5nIHRoZSBwcmV2aW91cyBmdW5jdGlvbiBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgb3JtU3RhdGU6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lcyBvZiBtb2RlbHMgd2hvc2UgdGFibGVzIGhhdmUgYmVlbiBzY2FubmVkIGNvbXBsZXRlbHlcbiAgICAgICAgICogZHVyaW5nIHByZXZpb3VzIGZ1bmN0aW9uIGNhbGwgKGNvbnRhaW5zIG9ubHkgbW9kZWwgbmFtZXMpXG4gICAgICAgICAqIEZvcm1hdCBleGFtcGxlOiBbJ0Jvb2snXVxuICAgICAgICAgKi9cbiAgICAgICAgZnVsbFRhYmxlU2Nhbm5lZE1vZGVsczogW10sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXAgb2Ygd2hpY2ggbW9kZWwgaW5zdGFuY2VzIGhhdmUgYmVlbiBhY2Nlc3NlZFxuICAgICAgICAgKiBkdXJpbmcgcHJldmlvdXMgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICogQ29udGFpbnMgb25seSBQS3Mgb2YgYWNjZXNzZWQgaW5zdGFuY2VzLlxuICAgICAgICAgKiBGb3JtYXQgZXhhbXBsZTogeyBCb29rOiB7IDE6IHRydWUsIDM6IHRydWUgfSB9XG4gICAgICAgICAqL1xuICAgICAgICBhY2Nlc3NlZEluc3RhbmNlczoge30sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXAgb2Ygd2hpY2ggYXR0cmlidXRlIGluZGV4ZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkXG4gICAgICAgICAqIGR1cmluZyBwcmV2aW91cyBmdW5jdGlvbiBjYWxsLlxuICAgICAgICAgKiBDb250YWlucyBvbmx5IGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IGZpbHRlcmVkIG9uLlxuICAgICAgICAgKiBBdXRob3Iud2l0aElkKDMpLmJvb2tzIHdvdWxkIGFkZCAzIHRvIHRoZSBhdXRob3JJZCBpbmRleCBiZWxvdy5cbiAgICAgICAgICogRm9ybWF0IGV4YW1wbGU6IHsgQm9vazogeyBhdXRob3JJZDogWzEsIDJdLCBwdWJsaXNoZXJJZDogWzVdIH0gfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjZXNzZWRJbmRleGVzOiB7fSxcbiAgICB9O1xuXG4gICAgcmV0dXJuICguLi5zdGF0ZUFuZEFyZ3MpID0+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlXG4gICAgICAgICAqIHRoZSBPUk0ncyByZWR1Y2VyIHN0YXRlIGluIHRoZSB1c2VyJ3MgUmVkdXggc3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBbb3JtU3RhdGUsIC4uLmFyZ3NdID0gc3RhdGVBbmRBcmdzO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yV2FzQ2FsbGVkQmVmb3JlID0gQm9vbGVhbihwcmV2aW91cy5hcmdzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VsZWN0b3JXYXNDYWxsZWRCZWZvcmUgJiZcbiAgICAgICAgICAgIGFyZ3NBcmVFcXVhbChwcmV2aW91cy5hcmdzLCBhcmdzLCBhcmdFcXVhbGl0eUNoZWNrKSAmJlxuICAgICAgICAgICAgZnVsbFRhYmxlU2Nhbm5lZE1vZGVsc0FyZUVxdWFsKHByZXZpb3VzLCBvcm1TdGF0ZSkgJiZcbiAgICAgICAgICAgIGFjY2Vzc2VkSW5kZXhlc0FyZUVxdWFsKHByZXZpb3VzLCBvcm1TdGF0ZSkgJiZcbiAgICAgICAgICAgIGFjY2Vzc2VkTW9kZWxJbnN0YW5jZXNBcmVFcXVhbChwcmV2aW91cywgb3JtU3RhdGUsIG9ybSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIE5vbmUgb2YgdGhpcyBzZWxlY3RvcidzIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgICAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhhdCB3ZSBjYWxsZWQgaXQuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cy5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnQgYSBzZXNzaW9uIHNvIHRoYXQgdGhlIHNlbGVjdG9yIGNhbiBhY2Nlc3MgdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKiBNYWtlIHRoaXMgc2Vzc2lvbiBpbW11dGFibGUuIFRoaXMgd2F5IHdlIGNhbiBmaW5kIG91dCBpZlxuICAgICAgICAgKiB0aGUgb3BlcmF0aW9ucyB0aGF0IHRoZSBzZWxlY3RvciBwZXJmb3JtcyBhcmUgY2FjaGVhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKG9ybVN0YXRlKTtcbiAgICAgICAgLyogUmVwbGFjZSBhbGwgT1JNIHN0YXRlIGFyZ3VtZW50cyBieSB0aGUgc2Vzc2lvbiBhYm92ZSAqL1xuICAgICAgICBjb25zdCBhcmdzV2l0aFNlc3Npb24gPSBhcmdzLm1hcCgoYXJnKSA9PlxuICAgICAgICAgICAgaXNPcm1TdGF0ZShhcmcpID8gc2Vzc2lvbiA6IGFyZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgYWN0dWFsIGZ1bmN0aW9uICovXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMuYXBwbHkobnVsbCwgYXJnc1dpdGhTZXNzaW9uKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItc3ByZWFkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByZXZpb3VzIGNhbGwgYXJlIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgICAgICogVXBkYXRlIGNhY2hlZCB2YWx1ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcmV2aW91cyA9IHtcbiAgICAgICAgICAgIC8qIEFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBzZWxlY3RvciAqL1xuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIC8qIFNlbGVjdG9yIHJlc3VsdCAqL1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgLyogUmVkdXggc3RhdGUgc2xpY2UgZm9yIHNlc3Npb24uc3RhdGUgKi9cbiAgICAgICAgICAgIG9ybVN0YXRlLFxuICAgICAgICAgICAgLyogUm93cyByZXRyaWV2ZWQgYnkgcmVzb2x2ZWQgcHJpbWFyeSBrZXkgKi9cbiAgICAgICAgICAgIGFjY2Vzc2VkSW5zdGFuY2VzOiBzZXNzaW9uLmFjY2Vzc2VkTW9kZWxJbnN0YW5jZXMsXG4gICAgICAgICAgICAvKiBGb3JlaWduIGtleSBpbmRleGVzIHRoYXQgd2VyZSB1c2VkIHRvIHNwZWVkIHVwIHF1ZXJpZXMgKi9cbiAgICAgICAgICAgIGFjY2Vzc2VkSW5kZXhlczogc2Vzc2lvbi5hY2Nlc3NlZEluZGV4ZXMsXG4gICAgICAgICAgICAvKiBUYWJsZXMgdGhhdCBoYWQgdG8gYmUgc2Nhbm5lZCBjb21wbGV0ZWx5ICovXG4gICAgICAgICAgICBmdWxsVGFibGVTY2FubmVkTW9kZWxzOiBzZXNzaW9uLmZ1bGxUYWJsZVNjYW5uZWRNb2RlbHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/memoize.js\n");
/***/ }),
@@ -4690,7 +4712,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultUpdater\", function() { return defaultUpdater; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createReducer\", function() { return createReducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createSelector\", function() { return createSelector; });\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reselect */ \"./node_modules/reselect/lib/index.js\");\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(reselect__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var re_reselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! re-reselect */ \"./node_modules/re-reselect/dist/index.js\");\n/* harmony import */ var re_reselect__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(re_reselect__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _memoize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./memoize */ \"./src/memoize.js\");\n/* harmony import */ var _ORM__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ORM */ \"./src/ORM.js\");\n/* harmony import */ var _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./selectors/SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n/* harmony import */ var _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selectors/MapSelectorSpec */ \"./src/selectors/MapSelectorSpec.js\");\n\n\n\n\n\n\n/**\n * @module redux\n * @desc Provides functions for integration with Redux.\n */\n\n/**\n * Calls all models' reducers if they exist.\n *\n * @return {undefined}\n * @global\n */\n\nfunction defaultUpdater(session, action) {\n session.sessionBoundModels.forEach(modelClass => {\n if (typeof modelClass.reducer === \"function\") {\n // This calls this.applyUpdate to update this.state\n modelClass.reducer(action, modelClass, session);\n }\n });\n}\n/**\n * Call the returned function to pass actions to Redux-ORM.\n *\n * @global\n *\n * @param {ORM} orm - the ORM instance.\n * @param {Function} [updater] - the function updating the ORM state based on the given action.\n * @return {Function} reducer that will update the ORM state.\n */\n\nfunction createReducer(orm, updater = defaultUpdater) {\n return (state, action) => {\n const session = orm.session(state || orm.getEmptyState());\n updater(session, action);\n return session.state;\n };\n}\n/**\n * @private\n * @param {SelectorSpec} spec\n */\n\nfunction createSelectorFromSpec(spec) {\n if (spec instanceof _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n const parentSelector = createSelectorFromSpec(spec.parent);\n return spec.createResultFunc(parentSelector);\n }\n\n return re_reselect__WEBPACK_IMPORTED_MODULE_1___default()(spec.dependencies, spec.resultFunc)({\n keySelector: spec.keySelector,\n cacheObject: new re_reselect__WEBPACK_IMPORTED_MODULE_1__[\"FlatMapCache\"](),\n selectorCreator: createSelector // eslint-disable-line no-use-before-define\n\n });\n}\n/**\n * Tries to find ORM instance using the argument.\n * @private\n * @param {*} arg\n */\n\n\nfunction toORM(arg) {\n /* eslint-disable no-underscore-dangle */\n if (arg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n return arg;\n }\n\n if (arg instanceof _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n return arg._orm;\n }\n\n return false;\n}\n\nconst selectorCache = new Map();\nconst SELECTOR_KEY = Symbol.for(\"REDUX_ORM_SELECTOR\");\n/**\n * @private\n * @param {function|ORM|SelectorSpec} arg\n */\n\nfunction toSelector(arg) {\n if (typeof arg === \"function\") {\n return arg;\n }\n\n if (arg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n return arg.stateSelector;\n }\n\n if (arg instanceof _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // the argument to map() needs to be callable\n arg.selector = toSelector(arg.selector);\n }\n\n if (arg instanceof _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n const {\n orm,\n cachePath\n } = arg;\n let level; // the selector cache for the spec's ORM\n\n if (!selectorCache.has(orm)) {\n selectorCache.set(orm, new Map());\n }\n\n const ormSelectors = selectorCache.get(orm);\n /**\n * Drill down into selector map by cachePath.\n *\n * The selector itself is stored under a special SELECTOR_KEY\n * so that we can store selectors below it as well.\n */\n\n level = ormSelectors;\n\n for (let i = 0; i < cachePath.length; ++i) {\n const storageKey = cachePath[i];\n\n if (!level.has(storageKey)) {\n level.set(storageKey, new Map());\n }\n\n level = level.get(storageKey);\n }\n\n if (level && level.has(SELECTOR_KEY)) {\n // Cache hit: the selector has been created before\n return level.get(SELECTOR_KEY);\n } // Cache miss: the selector needs to be created\n\n\n const selector = createSelectorFromSpec(arg); // Save the selector at the cachePath position\n\n level.set(SELECTOR_KEY, selector);\n return selector;\n }\n\n throw new Error(`Failed to interpret selector argument: ${JSON.stringify(arg)} of type ${typeof arg}`);\n}\n/**\n * Returns a memoized selector based on passed arguments.\n * This is similar to `reselect`'s `createSelector`,\n * except you can also pass a single function to be memoized.\n *\n * If you pass multiple functions, the format will be the\n * same as in `reselect`. The last argument is the selector\n * function and the previous are input selectors.\n *\n * When you use this method to create a selector, the returned selector\n * expects the whole `redux-orm` state branch as input. In the selector\n * function that you pass as the last argument, any of the arguments\n * you pass first will be considered selectors and mapped\n * to their outputs, like in `reselect`.\n *\n * Here are some example selectors:\n *\n * ```javascript\n * // orm is an instance of ORM\n * // reduxState is the state of a Redux store\n * const books = createSelector(orm.Book);\n * books(reduxState) // array of book refs\n *\n * const bookAuthors = createSelector(orm.Book.authors);\n * bookAuthors(reduxState) // two-dimensional array of author refs for each book\n * ```\n * Selectors can easily be applied to related models:\n * ```javascript\n * const bookAuthorNames = createSelector(\n * orm.Book.authors.map(orm.Author.name),\n * );\n * bookAuthorNames(reduxState, 8) // names of all authors of book with ID 8\n * bookAuthorNames(reduxState, [8, 9]) // 2D array of names of all authors of books with IDs 8 and 9\n * ```\n * Also note that `orm.Author.name` did not need to be wrapped in another `createSelector` call,\n * although that would be possible.\n *\n * For more complex calculations you can access\n * entire session objects by passing an ORM instance.\n * ```javascript\n * const freshBananasCost = createSelector(\n * orm,\n * session => {\n * const banana = session.Product.get({\n * name: \"Banana\",\n * });\n * // amount of fresh bananas in shopping cart\n * const amount = session.ShoppingCart.filter({\n * product_id: banana.id,\n * is_fresh: true,\n * }).count();\n * return `USD ${amount * banana.price}`;\n * }\n * );\n * ```\n *\n * redux-orm uses a special memoization function to avoid recomputations.\n *\n * Everytime a selector runs, this function records which instances\n * of your `Model`s were accessed.<br>\n * On subsequent runs, the selector first checks if the previously\n * accessed instances or `args` have changed in any way:\n * <ul>\n * <li>If yes, the selector calls the function you passed to it.</li>\n * <li>If not, it just returns the previous result\n * (unless you call it for the first time).</li>\n * </ul>\n *\n * This way you can use pure rendering in your React components\n * for performance gains.\n *\n * @global\n *\n * @param {...Function} args - zero or more input selectors\n * and the selector function.\n * @return {Function} memoized selector\n */\n\n\nfunction createSelector(...args) {\n if (!args.length) {\n throw new Error(\"Cannot create a selector without arguments.\");\n }\n\n const resultArg = args.pop();\n const dependencies = Array.isArray(args[0]) ? args[0] : args;\n const orm = dependencies.map(toORM).find(Boolean);\n const inputFuncs = dependencies.map(toSelector);\n\n if (typeof resultArg === \"function\") {\n if (!orm) {\n throw new Error(\"Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.\");\n } else if (!orm.stateSelector) {\n throw new Error(\"Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.\");\n } else if (typeof orm.stateSelector !== \"function\") {\n throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \\`stateSelector\\`. Received: ${JSON.stringify(orm.stateSelector)} of type ${typeof orm.stateSelector}`);\n }\n\n return Object(reselect__WEBPACK_IMPORTED_MODULE_0__[\"createSelectorCreator\"])(_memoize__WEBPACK_IMPORTED_MODULE_2__[\"memoize\"], undefined, orm)([orm.stateSelector, ...inputFuncs], resultArg);\n }\n\n if (resultArg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n throw new Error(\"ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.\");\n }\n\n if (inputFuncs.length) {\n console.warn(\"Your input selectors will be ignored: the passed result function does not require any input.\");\n }\n\n return toSelector(resultArg);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9yZWR1eC5qcz8wYjAwIl0sIm5hbWVzIjpbImRlZmF1bHRVcGRhdGVyIiwic2Vzc2lvbiIsImFjdGlvbiIsInNlc3Npb25Cb3VuZE1vZGVscyIsImZvckVhY2giLCJtb2RlbENsYXNzIiwicmVkdWNlciIsImNyZWF0ZVJlZHVjZXIiLCJvcm0iLCJ1cGRhdGVyIiwic3RhdGUiLCJnZXRFbXB0eVN0YXRlIiwiY3JlYXRlU2VsZWN0b3JGcm9tU3BlYyIsInNwZWMiLCJNYXBTZWxlY3RvclNwZWMiLCJwYXJlbnRTZWxlY3RvciIsInBhcmVudCIsImNyZWF0ZVJlc3VsdEZ1bmMiLCJjcmVhdGVDYWNoZWRTZWxlY3RvciIsImRlcGVuZGVuY2llcyIsInJlc3VsdEZ1bmMiLCJrZXlTZWxlY3RvciIsImNhY2hlT2JqZWN0IiwiRmxhdE1hcENhY2hlIiwic2VsZWN0b3JDcmVhdG9yIiwiY3JlYXRlU2VsZWN0b3IiLCJ0b09STSIsImFyZyIsIk9STSIsIlNlbGVjdG9yU3BlYyIsIl9vcm0iLCJzZWxlY3RvckNhY2hlIiwiTWFwIiwiU0VMRUNUT1JfS0VZIiwiU3ltYm9sIiwiZm9yIiwidG9TZWxlY3RvciIsInN0YXRlU2VsZWN0b3IiLCJzZWxlY3RvciIsImNhY2hlUGF0aCIsImxldmVsIiwiaGFzIiwic2V0Iiwib3JtU2VsZWN0b3JzIiwiZ2V0IiwiaSIsImxlbmd0aCIsInN0b3JhZ2VLZXkiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcmdzIiwicmVzdWx0QXJnIiwicG9wIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiZmluZCIsIkJvb2xlYW4iLCJpbnB1dEZ1bmNzIiwiY3JlYXRlU2VsZWN0b3JDcmVhdG9yIiwibWVtb2l6ZSIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJ3YXJuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUMxQixVQUFNLElBQUlvQixLQUFKLENBQ0YsZ0pBREUsQ0FBTjtBQUdIOztBQUNELE1BQUlXLFVBQVUsQ0FBQ2IsTUFBZixFQUF1QjtBQUNuQmlCLFdBQU8sQ0FBQ0MsSUFBUixDQUNJLDhGQURKO0FBR0g7O0FBRUQsU0FBTzVCLFVBQVUsQ0FBQ2dCLFNBQUQsQ0FBakI7QUFDSCIsImZpbGUiOiIuL3NyYy9yZWR1eC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciB9IGZyb20gXCJyZXNlbGVjdFwiO1xuaW1wb3J0IGNyZWF0ZUNhY2hlZFNlbGVjdG9yLCB7IEZsYXRNYXBDYWNoZSB9IGZyb20gXCJyZS1yZXNlbGVjdFwiO1xuXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIi4vbWVtb2l6ZVwiO1xuXG5pbXBvcnQgeyBPUk0gfSBmcm9tIFwiLi9PUk1cIjtcbmltcG9ydCBTZWxlY3RvclNwZWMgZnJvbSBcIi4vc2VsZWN0b3JzL1NlbGVjdG9yU3BlY1wiO1xuaW1wb3J0IE1hcFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9zZWxlY3RvcnMvTWFwU2VsZWN0b3JTcGVjXCI7XG5cbi8qKlxuICogQG1vZHVsZSByZWR1eFxuICogQGRlc2MgUHJvdmlkZXMgZnVuY3Rpb25zIGZvciBpbnRlZ3JhdGlvbiB3aXRoIFJlZHV4LlxuICovXG5cbi8qKlxuICogQ2FsbHMgYWxsIG1vZGVscycgcmVkdWNlcnMgaWYgdGhleSBleGlzdC5cbiAqXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKiBAZ2xvYmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0VXBkYXRlcihzZXNzaW9uLCBhY3Rpb24pIHtcbiAgICBzZXNzaW9uLnNlc3Npb25Cb3VuZE1vZGVscy5mb3JFYWNoKG1vZGVsQ2xhc3MgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MucmVkdWNlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbGxzIHRoaXMuYXBwbHlVcGRhdGUgdG8gdXBkYXRlIHRoaXMuc3RhdGVcbiAgICAgICAgICAgIG1vZGVsQ2xhc3MucmVkdWNlcihhY3Rpb24sIG1vZGVsQ2xhc3MsIHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2FsbCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gdG8gcGFzcyBhY3Rpb25zIHRvIFJlZHV4LU9STS5cbiAqXG4gKiBAZ2xvYmFsXG4gKlxuICogQHBhcmFtIHtPUk19IG9ybSAtIHRoZSBPUk0gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdXBkYXRlcl0gLSB0aGUgZnVuY3Rpb24gdXBkYXRpbmcgdGhlIE9STSBzdGF0ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gYWN0aW9uLlxuICogQHJldHVybiB7RnVuY3Rpb259IHJlZHVjZXIgdGhhdCB3aWxsIHVwZGF0ZSB0aGUgT1JNIHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkdWNlcihvcm0sIHVwZGF0ZXIgPSBkZWZhdWx0VXBkYXRlcikge1xuICAgIHJldHVybiAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gb3JtLnNlc3Npb24oc3RhdGUgfHwgb3JtLmdldEVtcHR5U3RhdGUoKSk7XG4gICAgICAgIHVwZGF0ZXIoc2Vzc2lvbiwgYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uc3RhdGU7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTZWxlY3RvclNwZWN9IHNwZWNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JGcm9tU3BlYyhzcGVjKSB7XG4gICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBNYXBTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgY29uc3QgcGFyZW50U2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvckZyb21TcGVjKHNwZWMucGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHNwZWMuY3JlYXRlUmVzdWx0RnVuYyhwYXJlbnRTZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDYWNoZWRTZWxlY3RvcihcbiAgICAgICAgc3BlYy5kZXBlbmRlbmNpZXMsXG4gICAgICAgIHNwZWMucmVzdWx0RnVuY1xuICAgICkoe1xuICAgICAgICBrZXlTZWxlY3Rvcjogc3BlYy5rZXlTZWxlY3RvcixcbiAgICAgICAgY2FjaGVPYmplY3Q6IG5ldyBGbGF0TWFwQ2FjaGUoKSxcbiAgICAgICAgc2VsZWN0b3JDcmVhdG9yOiBjcmVhdGVTZWxlY3RvciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGZpbmQgT1JNIGluc3RhbmNlIHVzaW5nIHRoZSBhcmd1bWVudC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IGFyZ1xuICovXG5mdW5jdGlvbiB0b09STShhcmcpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPUk0pIHtcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIFNlbGVjdG9yU3BlYykge1xuICAgICAgICByZXR1cm4gYXJnLl9vcm07XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuY29uc3Qgc2VsZWN0b3JDYWNoZSA9IG5ldyBNYXAoKTtcbmNvbnN0IFNFTEVDVE9SX0tFWSA9IFN5bWJvbC5mb3IoXCJSRURVWF9PUk1fU0VMRUNUT1JcIik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb258T1JNfFNlbGVjdG9yU3BlY30gYXJnXG4gKi9cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgT1JNKSB7XG4gICAgICAgIHJldHVybiBhcmcuc3RhdGVTZWxlY3RvcjtcbiAgICB9XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIE1hcFNlbGVjdG9yU3BlYykge1xuICAgICAgICAvLyB0aGUgYXJndW1lbnQgdG8gbWFwKCkgbmVlZHMgdG8gYmUgY2FsbGFibGVcbiAgICAgICAgYXJnLnNlbGVjdG9yID0gdG9TZWxlY3Rvcihhcmcuc2VsZWN0b3IpO1xuICAgIH1cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgU2VsZWN0b3JTcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgb3JtLCBjYWNoZVBhdGggfSA9IGFyZztcbiAgICAgICAgbGV0IGxldmVsO1xuXG4gICAgICAgIC8vIHRoZSBzZWxlY3RvciBjYWNoZSBmb3IgdGhlIHNwZWMncyBPUk1cbiAgICAgICAgaWYgKCFzZWxlY3RvckNhY2hlLmhhcyhvcm0pKSB7XG4gICAgICAgICAgICBzZWxlY3RvckNhY2hlLnNldChvcm0sIG5ldyBNYXAoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JtU2VsZWN0b3JzID0gc2VsZWN0b3JDYWNoZS5nZXQob3JtKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRHJpbGwgZG93biBpbnRvIHNlbGVjdG9yIG1hcCBieSBjYWNoZVBhdGguXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBzZWxlY3RvciBpdHNlbGYgaXMgc3RvcmVkIHVuZGVyIGEgc3BlY2lhbCBTRUxFQ1RPUl9LRVlcbiAgICAgICAgICogc28gdGhhdCB3ZSBjYW4gc3RvcmUgc2VsZWN0b3JzIGJlbG93IGl0IGFzIHdlbGwuXG4gICAgICAgICAqL1xuICAgICAgICBsZXZlbCA9IG9ybVNlbGVjdG9ycztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZVBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBjYWNoZVBhdGhbaV07XG4gICAgICAgICAgICBpZiAoIWxldmVsLmhhcyhzdG9yYWdlS2V5KSkge1xuICAgICAgICAgICAgICAgIGxldmVsLnNldChzdG9yYWdlS2V5LCBuZXcgTWFwKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbC5nZXQoc3RvcmFnZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxldmVsICYmIGxldmVsLmhhcyhTRUxFQ1RPUl9LRVkpKSB7XG4gICAgICAgICAgICAvLyBDYWNoZSBoaXQ6IHRoZSBzZWxlY3RvciBoYXMgYmVlbiBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAgICAgcmV0dXJuIGxldmVsLmdldChTRUxFQ1RPUl9LRVkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhY2hlIG1pc3M6IHRoZSBzZWxlY3RvciBuZWVkcyB0byBiZSBjcmVhdGVkXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3JGcm9tU3BlYyhhcmcpO1xuICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3RvciBhdCB0aGUgY2FjaGVQYXRoIHBvc2l0aW9uXG4gICAgICAgIGxldmVsLnNldChTRUxFQ1RPUl9LRVksIHNlbGVjdG9yKTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbnRlcnByZXQgc2VsZWN0b3IgYXJndW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhcmdcbiAgICAgICAgKX0gb2YgdHlwZSAke3R5cGVvZiBhcmd9YFxuICAgICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1lbW9pemVkIHNlbGVjdG9yIGJhc2VkIG9uIHBhc3NlZCBhcmd1bWVudHMuXG4gKiBUaGlzIGlzIHNpbWlsYXIgdG8gYHJlc2VsZWN0YCdzIGBjcmVhdGVTZWxlY3RvcmAsXG4gKiBleGNlcHQgeW91IGNhbiBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24gdG8gYmUgbWVtb2l6ZWQuXG4gKlxuICogSWYgeW91IHBhc3MgbXVsdGlwbGUgZnVuY3Rpb25zLCB0aGUgZm9ybWF0IHdpbGwgYmUgdGhlXG4gKiBzYW1lIGFzIGluIGByZXNlbGVjdGAuIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzZWxlY3RvclxuICogZnVuY3Rpb24gYW5kIHRoZSBwcmV2aW91cyBhcmUgaW5wdXQgc2VsZWN0b3JzLlxuICpcbiAqIFdoZW4geW91IHVzZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBzZWxlY3RvciwgdGhlIHJldHVybmVkIHNlbGVjdG9yXG4gKiBleHBlY3RzIHRoZSB3aG9sZSBgcmVkdXgtb3JtYCBzdGF0ZSBicmFuY2ggYXMgaW5wdXQuIEluIHRoZSBzZWxlY3RvclxuICogZnVuY3Rpb24gdGhhdCB5b3UgcGFzcyBhcyB0aGUgbGFzdCBhcmd1bWVudCwgYW55IG9mIHRoZSBhcmd1bWVudHNcbiAqIHlvdSBwYXNzIGZpcnN0IHdpbGwgYmUgY29uc2lkZXJlZCBzZWxlY3RvcnMgYW5kIG1hcHBlZFxuICogdG8gdGhlaXIgb3V0cHV0cywgbGlrZSBpbiBgcmVzZWxlY3RgLlxuICpcbiAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZSBzZWxlY3RvcnM6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gb3JtIGlzIGFuIGluc3RhbmNlIG9mIE9STVxuICogLy8gcmVkdXhTdGF0ZSBpcyB0aGUgc3RhdGUgb2YgYSBSZWR1eCBzdG9yZVxuICogY29uc3QgYm9va3MgPSBjcmVhdGVTZWxlY3Rvcihvcm0uQm9vayk7XG4gKiBib29rcyhyZWR1eFN0YXRlKSAvLyBhcnJheSBvZiBib29rIHJlZnNcbiAqXG4gKiBjb25zdCBib29rQXV0aG9ycyA9IGNyZWF0ZVNlbGVjdG9yKG9ybS5Cb29rLmF1dGhvcnMpO1xuICogYm9va0F1dGhvcnMocmVkdXhTdGF0ZSkgLy8gdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIGF1dGhvciByZWZzIGZvciBlYWNoIGJvb2tcbiAqIGBgYFxuICogU2VsZWN0b3JzIGNhbiBlYXNpbHkgYmUgYXBwbGllZCB0byByZWxhdGVkIG1vZGVsczpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGJvb2tBdXRob3JOYW1lcyA9IGNyZWF0ZVNlbGVjdG9yKFxuICogICAgIG9ybS5Cb29rLmF1dGhvcnMubWFwKG9ybS5BdXRob3IubmFtZSksXG4gKiApO1xuICogYm9va0F1dGhvck5hbWVzKHJlZHV4U3RhdGUsIDgpIC8vIG5hbWVzIG9mIGFsbCBhdXRob3JzIG9mIGJvb2sgd2l0aCBJRCA4XG4gKiBib29rQXV0aG9yTmFtZXMocmVkdXhTdGF0ZSwgWzgsIDldKSAvLyAyRCBhcnJheSBvZiBuYW1lcyBvZiBhbGwgYXV0aG9ycyBvZiBib29rcyB3aXRoIElEcyA4IGFuZCA5XG4gKiBgYGBcbiAqIEFsc28gbm90ZSB0aGF0IGBvcm0uQXV0aG9yLm5hbWVgIGRpZCBub3QgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFub3RoZXIgYGNyZWF0ZVNlbGVjdG9yYCBjYWxsLFxuICogYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBwb3NzaWJsZS5cbiAqXG4gKiBGb3IgbW9yZSBjb21wbGV4IGNhbGN1bGF0aW9ucyB5b3UgY2FuIGFjY2Vzc1xuICogZW50aXJlIHNlc3Npb24gb2JqZWN0cyBieSBwYXNzaW5nIGFuIE9STSBpbnN0YW5jZS5cbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGZyZXNoQmFuYW5hc0Nvc3QgPSBjcmVhdGVTZWxlY3RvcihcbiAqICAgICBvcm0sXG4gKiAgICAgc2Vzc2lvbiA9PiB7XG4gKiAgICAgICAgY29uc3QgYmFuYW5hID0gc2Vzc2lvbi5Qcm9kdWN0LmdldCh7XG4gKiAgICAgICAgICAgIG5hbWU6IFwiQmFuYW5hXCIsXG4gKiAgICAgICAgfSk7XG4gKiAgICAgICAgLy8gYW1vdW50IG9mIGZyZXNoIGJhbmFuYXMgaW4gc2hvcHBpbmcgY2FydFxuICogICAgICAgIGNvbnN0IGFtb3VudCA9IHNlc3Npb24uU2hvcHBpbmdDYXJ0LmZpbHRlcih7XG4gKiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IGJhbmFuYS5pZCxcbiAqICAgICAgICAgICAgaXNfZnJlc2g6IHRydWUsXG4gKiAgICAgICAgfSkuY291bnQoKTtcbiAqICAgICAgICByZXR1cm4gYFVTRCAke2Ftb3VudCAqIGJhbmFuYS5wcmljZX1gO1xuICogICAgIH1cbiAqICk7XG4gKiBgYGBcbiAqXG4gKiByZWR1eC1vcm0gdXNlcyBhIHNwZWNpYWwgbWVtb2l6YXRpb24gZnVuY3Rpb24gdG8gYXZvaWQgcmVjb21wdXRhdGlvbnMuXG4gKlxuICogRXZlcnl0aW1lIGEgc2VsZWN0b3IgcnVucywgdGhpcyBmdW5jdGlvbiByZWNvcmRzIHdoaWNoIGluc3RhbmNlc1xuICogb2YgeW91ciBgTW9kZWxgcyB3ZXJlIGFjY2Vzc2VkLjxicj5cbiAqIE9uIHN1YnNlcXVlbnQgcnVucywgdGhlIHNlbGVjdG9yIGZpcnN0IGNoZWNrcyBpZiB0aGUgcHJldmlvdXNseVxuICogYWNjZXNzZWQgaW5zdGFuY2VzIG9yIGBhcmdzYCBoYXZlIGNoYW5nZWQgaW4gYW55IHdheTpcbiAqIDx1bD5cbiAqICAgICA8bGk+SWYgeWVzLCB0aGUgc2VsZWN0b3IgY2FsbHMgdGhlIGZ1bmN0aW9uIHlvdSBwYXNzZWQgdG8gaXQuPC9saT5cbiAqICAgICA8bGk+SWYgbm90LCBpdCBqdXN0IHJldHVybnMgdGhlIHByZXZpb3VzIHJlc3VsdFxuICogICAgICAgICAodW5sZXNzIHlvdSBjYWxsIGl0IGZvciB0aGUgZmlyc3QgdGltZSkuPC9saT5cbiAqIDwvdWw+XG4gKlxuICogVGhpcyB3YXkgeW91IGNhbiB1c2UgcHVyZSByZW5kZXJpbmcgaW4geW91ciBSZWFjdCBjb21wb25lbnRzXG4gKiBmb3IgcGVyZm9ybWFuY2UgZ2FpbnMuXG4gKlxuICogQGdsb2JhbFxuICpcbiAqIEBwYXJhbSAgey4uLkZ1bmN0aW9ufSBhcmdzIC0gemVybyBvciBtb3JlIGlucHV0IHNlbGVjdG9yc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybiB7RnVuY3Rpb259IG1lbW9pemVkIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvciguLi5hcmdzKSB7XG4gICAgaWYgKCFhcmdzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGEgc2VsZWN0b3Igd2l0aG91dCBhcmd1bWVudHMuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdEFyZyA9IGFyZ3MucG9wKCk7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gQXJyYXkuaXNBcnJheShhcmdzWzBdKSA/IGFyZ3NbMF0gOiBhcmdzO1xuXG4gICAgY29uc3Qgb3JtID0gZGVwZW5kZW5jaWVzLm1hcCh0b09STSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBpbnB1dEZ1bmNzID0gZGVwZW5kZW5jaWVzLm1hcCh0b1NlbGVjdG9yKTtcblxuICAgIGlmICh0eXBlb2YgcmVzdWx0QXJnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKCFvcm0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIHRoZSBjdXJyZW50IE9STSBkYXRhYmFzZSBzdGF0ZS4gUGxlYXNlIHBhc3MgYW4gT1JNIGluc3RhbmNlIG9yIGFuIE9STSBzZWxlY3RvciBhcyBhbiBhcmd1bWVudCB0byBgY3JlYXRlU2VsZWN0b3IoKWAuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9ybS5zdGF0ZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCBPUk0gZGF0YWJhc2Ugc3RhdGUuIFBsZWFzZSBwYXNzIGFuIG9iamVjdCB0byB0aGUgT1JNIGNvbnN0cnVjdG9yIHRoYXQgc3BlY2lmaWVzIGEgYHN0YXRlU2VsZWN0b3JgIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcm0uc3RhdGVTZWxlY3RvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIHRoZSBjdXJyZW50IE9STSBkYXRhYmFzZSBzdGF0ZS4gUGxlYXNlIHBhc3MgYSBmdW5jdGlvbiB3aGVuIHNwZWNpZnlpbmcgdGhlIE9STSdzIFxcYHN0YXRlU2VsZWN0b3JcXGAuIFJlY2VpdmVkOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICBvcm0uc3RhdGVTZWxlY3RvclxuICAgICAgICAgICAgICAgICl9IG9mIHR5cGUgJHt0eXBlb2Ygb3JtLnN0YXRlU2VsZWN0b3J9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RvckNyZWF0b3IoXG4gICAgICAgICAgICBtZW1vaXplLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JtXG4gICAgICAgICkoW29ybS5zdGF0ZVNlbGVjdG9yLCAuLi5pbnB1dEZ1bmNzXSwgcmVzdWx0QXJnKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0QXJnIGluc3RhbmNlb2YgT1JNKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiT1JNIGluc3RhbmNlcyBjYW5ub3QgYmUgdGhlIHJlc3VsdCBmdW5jdGlvbiBvZiBzZWxlY3RvcnMuIFlvdSBjYW4gYWNjZXNzIHlvdXIgbW9kZWxzIGluIHRoZSBsYXN0IGZ1bmN0aW9uIHRoYXQgeW91IHBhc3MgdG8gYGNyZWF0ZVNlbGVjdG9yKClgLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChpbnB1dEZ1bmNzLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIllvdXIgaW5wdXQgc2VsZWN0b3JzIHdpbGwgYmUgaWdub3JlZDogdGhlIHBhc3NlZCByZXN1bHQgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkgaW5wdXQuXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9TZWxlY3RvcihyZXN1bHRBcmcpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/redux.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultUpdater\", function() { return defaultUpdater; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createReducer\", function() { return createReducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createSelector\", function() { return createSelector; });\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reselect */ \"./node_modules/reselect/lib/index.js\");\n/* harmony import */ var reselect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(reselect__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var re_reselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! re-reselect */ \"./node_modules/re-reselect/dist/index.js\");\n/* harmony import */ var re_reselect__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(re_reselect__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _memoize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./memoize */ \"./src/memoize.js\");\n/* harmony import */ var _ORM__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ORM */ \"./src/ORM.js\");\n/* harmony import */ var _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./selectors/SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n/* harmony import */ var _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./selectors/MapSelectorSpec */ \"./src/selectors/MapSelectorSpec.js\");\n\n\n\n\n\n\n/**\n * @module redux\n * @desc Provides functions for integration with Redux.\n */\n\n/**\n * Calls all models' reducers if they exist.\n *\n * @return {undefined}\n * @global\n */\n\nfunction defaultUpdater(session, action) {\n session.sessionBoundModels.forEach(modelClass => {\n if (typeof modelClass.reducer === \"function\") {\n // This calls this.applyUpdate to update this.state\n modelClass.reducer(action, modelClass, session);\n }\n });\n}\n/**\n * Call the returned function to pass actions to Redux-ORM.\n *\n * @global\n *\n * @param {ORM} orm - the ORM instance.\n * @param {Function} [updater] - the function updating the ORM state based on the given action.\n * @return {Function} reducer that will update the ORM state.\n */\n\nfunction createReducer(orm, updater = defaultUpdater) {\n return (state, action) => {\n const session = orm.session(state || orm.getEmptyState());\n updater(session, action);\n return session.state;\n };\n}\n/**\n * @private\n * @param {SelectorSpec} spec\n */\n\nfunction createSelectorFromSpec(spec) {\n if (spec instanceof _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n const parentSelector = createSelectorFromSpec(spec.parent);\n return spec.createResultFunc(parentSelector);\n }\n\n return re_reselect__WEBPACK_IMPORTED_MODULE_1___default()(spec.dependencies, spec.resultFunc)({\n keySelector: spec.keySelector,\n cacheObject: new re_reselect__WEBPACK_IMPORTED_MODULE_1__[\"FlatMapCache\"](),\n selectorCreator: createSelector // eslint-disable-line no-use-before-define\n\n });\n}\n/**\n * Tries to find ORM instance using the argument.\n * @private\n * @param {*} arg\n */\n\n\nfunction toORM(arg) {\n /* eslint-disable no-underscore-dangle */\n if (arg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n return arg;\n }\n\n if (arg instanceof _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n return arg._orm;\n }\n\n return false;\n}\n\nconst selectorCache = new Map();\nconst SELECTOR_KEY = Symbol.for(\"REDUX_ORM_SELECTOR\");\n/**\n * @private\n * @param {function|ORM|SelectorSpec} arg\n */\n\nfunction toSelector(arg) {\n if (typeof arg === \"function\") {\n return arg;\n }\n\n if (arg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n return arg.stateSelector;\n }\n\n if (arg instanceof _selectors_MapSelectorSpec__WEBPACK_IMPORTED_MODULE_5__[\"default\"]) {\n // the argument to map() needs to be callable\n arg.selector = toSelector(arg.selector);\n }\n\n if (arg instanceof _selectors_SelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]) {\n const {\n orm,\n cachePath\n } = arg;\n let level; // the selector cache for the spec's ORM\n\n if (!selectorCache.has(orm)) {\n selectorCache.set(orm, new Map());\n }\n\n const ormSelectors = selectorCache.get(orm);\n /**\n * Drill down into selector map by cachePath.\n *\n * The selector itself is stored under a special SELECTOR_KEY\n * so that we can store selectors below it as well.\n */\n\n level = ormSelectors;\n\n for (let i = 0; i < cachePath.length; ++i) {\n const storageKey = cachePath[i];\n\n if (!level.has(storageKey)) {\n level.set(storageKey, new Map());\n }\n\n level = level.get(storageKey);\n }\n\n if (level && level.has(SELECTOR_KEY)) {\n // Cache hit: the selector has been created before\n return level.get(SELECTOR_KEY);\n } // Cache miss: the selector needs to be created\n\n\n const selector = createSelectorFromSpec(arg); // Save the selector at the cachePath position\n\n level.set(SELECTOR_KEY, selector);\n return selector;\n }\n\n throw new Error(`Failed to interpret selector argument: ${JSON.stringify(arg)} of type ${typeof arg}`);\n}\n/**\n * Returns a memoized selector based on passed arguments.\n * This is similar to `reselect`'s `createSelector`,\n * except you can also pass a single function to be memoized.\n *\n * If you pass multiple functions, the format will be the\n * same as in `reselect`. The last argument is the selector\n * function and the previous are input selectors.\n *\n * When you use this method to create a selector, the returned selector\n * expects the whole `redux-orm` state branch as input. In the selector\n * function that you pass as the last argument, any of the arguments\n * you pass first will be considered selectors and mapped\n * to their outputs, like in `reselect`.\n *\n * Here are some example selectors:\n *\n * ```javascript\n * // orm is an instance of ORM\n * // reduxState is the state of a Redux store\n * const books = createSelector(orm.Book);\n * books(reduxState) // array of book refs\n *\n * const bookAuthors = createSelector(orm.Book.authors);\n * bookAuthors(reduxState) // two-dimensional array of author refs for each book\n * ```\n * Selectors can easily be applied to related models:\n * ```javascript\n * const bookAuthorNames = createSelector(\n * orm.Book.authors.map(orm.Author.name),\n * );\n * bookAuthorNames(reduxState, 8) // names of all authors of book with ID 8\n * bookAuthorNames(reduxState, [8, 9]) // 2D array of names of all authors of books with IDs 8 and 9\n * ```\n * Also note that `orm.Author.name` did not need to be wrapped in another `createSelector` call,\n * although that would be possible.\n *\n * For more complex calculations you can access\n * entire session objects by passing an ORM instance.\n * ```javascript\n * const freshBananasCost = createSelector(\n * orm,\n * session => {\n * const banana = session.Product.get({\n * name: \"Banana\",\n * });\n * // amount of fresh bananas in shopping cart\n * const amount = session.ShoppingCart.filter({\n * product_id: banana.id,\n * is_fresh: true,\n * }).count();\n * return `USD ${amount * banana.price}`;\n * }\n * );\n * ```\n *\n * redux-orm uses a special memoization function to avoid recomputations.\n *\n * Everytime a selector runs, this function records which instances\n * of your `Model`s were accessed.<br>\n * On subsequent runs, the selector first checks if the previously\n * accessed instances or `args` have changed in any way:\n * <ul>\n * <li>If yes, the selector calls the function you passed to it.</li>\n * <li>If not, it just returns the previous result\n * (unless you call it for the first time).</li>\n * </ul>\n *\n * This way you can use pure rendering in your React components\n * for performance gains.\n *\n * @global\n *\n * @param {...Function} args - zero or more input selectors\n * and the selector function.\n * @return {Function} memoized selector\n */\n\n\nfunction createSelector(...args) {\n if (!args.length) {\n throw new Error(\"Cannot create a selector without arguments.\");\n }\n\n const resultArg = args.pop();\n const dependencies = Array.isArray(args[0]) ? args[0] : args;\n const orm = dependencies.map(toORM).find(Boolean);\n const inputFuncs = dependencies.map(toSelector);\n\n if (typeof resultArg === \"function\") {\n if (!orm) {\n throw new Error(\"Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.\");\n } else if (!orm.stateSelector) {\n throw new Error(\"Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.\");\n } else if (typeof orm.stateSelector !== \"function\") {\n throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \\`stateSelector\\`. Received: ${JSON.stringify(orm.stateSelector)} of type ${typeof orm.stateSelector}`);\n }\n\n return Object(reselect__WEBPACK_IMPORTED_MODULE_0__[\"createSelectorCreator\"])(_memoize__WEBPACK_IMPORTED_MODULE_2__[\"memoize\"], undefined, orm)([orm.stateSelector, ...inputFuncs], resultArg);\n }\n\n if (resultArg instanceof _ORM__WEBPACK_IMPORTED_MODULE_3__[\"ORM\"]) {\n throw new Error(\"ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.\");\n }\n\n if (inputFuncs.length) {\n console.warn(\"Your input selectors will be ignored: the passed result function does not require any input.\");\n }\n\n return toSelector(resultArg);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9yZWR1eC5qcz8wYjAwIl0sIm5hbWVzIjpbImRlZmF1bHRVcGRhdGVyIiwic2Vzc2lvbiIsImFjdGlvbiIsInNlc3Npb25Cb3VuZE1vZGVscyIsImZvckVhY2giLCJtb2RlbENsYXNzIiwicmVkdWNlciIsImNyZWF0ZVJlZHVjZXIiLCJvcm0iLCJ1cGRhdGVyIiwic3RhdGUiLCJnZXRFbXB0eVN0YXRlIiwiY3JlYXRlU2VsZWN0b3JGcm9tU3BlYyIsInNwZWMiLCJNYXBTZWxlY3RvclNwZWMiLCJwYXJlbnRTZWxlY3RvciIsInBhcmVudCIsImNyZWF0ZVJlc3VsdEZ1bmMiLCJjcmVhdGVDYWNoZWRTZWxlY3RvciIsImRlcGVuZGVuY2llcyIsInJlc3VsdEZ1bmMiLCJrZXlTZWxlY3RvciIsImNhY2hlT2JqZWN0IiwiRmxhdE1hcENhY2hlIiwic2VsZWN0b3JDcmVhdG9yIiwiY3JlYXRlU2VsZWN0b3IiLCJ0b09STSIsImFyZyIsIk9STSIsIlNlbGVjdG9yU3BlYyIsIl9vcm0iLCJzZWxlY3RvckNhY2hlIiwiTWFwIiwiU0VMRUNUT1JfS0VZIiwiU3ltYm9sIiwiZm9yIiwidG9TZWxlY3RvciIsInN0YXRlU2VsZWN0b3IiLCJzZWxlY3RvciIsImNhY2hlUGF0aCIsImxldmVsIiwiaGFzIiwic2V0Iiwib3JtU2VsZWN0b3JzIiwiZ2V0IiwiaSIsImxlbmd0aCIsInN0b3JhZ2VLZXkiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcmdzIiwicmVzdWx0QXJnIiwicG9wIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiZmluZCIsIkJvb2xlYW4iLCJpbnB1dEZ1bmNzIiwiY3JlYXRlU2VsZWN0b3JDcmVhdG9yIiwibWVtb2l6ZSIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJ3YXJuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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RyxDQUFDNkIsYUFBVCxFQUF3QjtBQUMzQixZQUFNLElBQUlXLEtBQUosQ0FDRiwySUFERSxDQUFOO0FBR0gsS0FKTSxNQUlBLElBQUksT0FBT3hDLEdBQUcsQ0FBQzZCLGFBQVgsS0FBNkIsVUFBakMsRUFBNkM7QUFDaEQsWUFBTSxJQUFJVyxLQUFKLENBQ0QsbUlBQWtJQyxJQUFJLENBQUNDLFNBQUwsQ0FDL0gxQyxHQUFHLENBQUM2QixhQUQySCxDQUVqSSxZQUFXLE9BQU83QixHQUFHLENBQUM2QixhQUFjLEVBSHBDLENBQU47QUFLSDs7QUFFRCxXQUFPdUIsc0VBQXFCLENBQ3hCQyxnREFEd0IsRUFFeEJDLFNBRndCLEVBR3hCdEQsR0FId0IsQ0FBckIsQ0FJTCxDQUFDQSxHQUFHLENBQUM2QixhQUFMLEVBQW9CLEdBQUdzQixVQUF2QixDQUpLLEVBSStCUCxTQUovQixDQUFQO0FBS0g7O0FBRUQsTUFBSUEsU0FBUyxZQUFZeEIsd0NBQXpCLEVBQThCO0FBQzFCLFVBQU0sSUFBSW9CLEtBQUosQ0FDRixnSkFERSxDQUFOO0FBR0g7O0FBQ0QsTUFBSVcsVUFBVSxDQUFDYixNQUFmLEVBQXVCO0FBQ25CaUIsV0FBTyxDQUFDQyxJQUFSLENBQ0ksOEZBREo7QUFHSDs7QUFFRCxTQUFPNUIsVUFBVSxDQUFDZ0IsU0FBRCxDQUFqQjtBQUNIIiwiZmlsZSI6Ii4vc3JjL3JlZHV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3JDcmVhdG9yIH0gZnJvbSBcInJlc2VsZWN0XCI7XG5pbXBvcnQgY3JlYXRlQ2FjaGVkU2VsZWN0b3IsIHsgRmxhdE1hcENhY2hlIH0gZnJvbSBcInJlLXJlc2VsZWN0XCI7XG5cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi9tZW1vaXplXCI7XG5cbmltcG9ydCB7IE9STSB9IGZyb20gXCIuL09STVwiO1xuaW1wb3J0IFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9zZWxlY3RvcnMvU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgTWFwU2VsZWN0b3JTcGVjIGZyb20gXCIuL3NlbGVjdG9ycy9NYXBTZWxlY3RvclNwZWNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHJlZHV4XG4gKiBAZGVzYyBQcm92aWRlcyBmdW5jdGlvbnMgZm9yIGludGVncmF0aW9uIHdpdGggUmVkdXguXG4gKi9cblxuLyoqXG4gKiBDYWxscyBhbGwgbW9kZWxzJyByZWR1Y2VycyBpZiB0aGV5IGV4aXN0LlxuICpcbiAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAqIEBnbG9iYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRVcGRhdGVyKHNlc3Npb24sIGFjdGlvbikge1xuICAgIHNlc3Npb24uc2Vzc2lvbkJvdW5kTW9kZWxzLmZvckVhY2goKG1vZGVsQ2xhc3MpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtb2RlbENsYXNzLnJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gVGhpcyBjYWxscyB0aGlzLmFwcGx5VXBkYXRlIHRvIHVwZGF0ZSB0aGlzLnN0YXRlXG4gICAgICAgICAgICBtb2RlbENsYXNzLnJlZHVjZXIoYWN0aW9uLCBtb2RlbENsYXNzLCBzZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIENhbGwgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHRvIHBhc3MgYWN0aW9ucyB0byBSZWR1eC1PUk0uXG4gKlxuICogQGdsb2JhbFxuICpcbiAqIEBwYXJhbSB7T1JNfSBvcm0gLSB0aGUgT1JNIGluc3RhbmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3VwZGF0ZXJdIC0gdGhlIGZ1bmN0aW9uIHVwZGF0aW5nIHRoZSBPUk0gc3RhdGUgYmFzZWQgb24gdGhlIGdpdmVuIGFjdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZWR1Y2VyIHRoYXQgd2lsbCB1cGRhdGUgdGhlIE9STSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIob3JtLCB1cGRhdGVyID0gZGVmYXVsdFVwZGF0ZXIpIHtcbiAgICByZXR1cm4gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG9ybS5zZXNzaW9uKHN0YXRlIHx8IG9ybS5nZXRFbXB0eVN0YXRlKCkpO1xuICAgICAgICB1cGRhdGVyKHNlc3Npb24sIGFjdGlvbik7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLnN0YXRlO1xuICAgIH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U2VsZWN0b3JTcGVjfSBzcGVjXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yRnJvbVNwZWMoc3BlYykge1xuICAgIGlmIChzcGVjIGluc3RhbmNlb2YgTWFwU2VsZWN0b3JTcGVjKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3JGcm9tU3BlYyhzcGVjLnBhcmVudCk7XG4gICAgICAgIHJldHVybiBzcGVjLmNyZWF0ZVJlc3VsdEZ1bmMocGFyZW50U2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2FjaGVkU2VsZWN0b3IoXG4gICAgICAgIHNwZWMuZGVwZW5kZW5jaWVzLFxuICAgICAgICBzcGVjLnJlc3VsdEZ1bmNcbiAgICApKHtcbiAgICAgICAga2V5U2VsZWN0b3I6IHNwZWMua2V5U2VsZWN0b3IsXG4gICAgICAgIGNhY2hlT2JqZWN0OiBuZXcgRmxhdE1hcENhY2hlKCksXG4gICAgICAgIHNlbGVjdG9yQ3JlYXRvcjogY3JlYXRlU2VsZWN0b3IsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmllcyB0byBmaW5kIE9STSBpbnN0YW5jZSB1c2luZyB0aGUgYXJndW1lbnQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBhcmdcbiAqL1xuZnVuY3Rpb24gdG9PUk0oYXJnKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgT1JNKSB7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgcmV0dXJuIGFyZy5fb3JtO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IHNlbGVjdG9yQ2FjaGUgPSBuZXcgTWFwKCk7XG5jb25zdCBTRUxFQ1RPUl9LRVkgPSBTeW1ib2wuZm9yKFwiUkVEVVhfT1JNX1NFTEVDVE9SXCIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufE9STXxTZWxlY3RvclNwZWN9IGFyZ1xuICovXG5mdW5jdGlvbiB0b1NlbGVjdG9yKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIE9STSkge1xuICAgICAgICByZXR1cm4gYXJnLnN0YXRlU2VsZWN0b3I7XG4gICAgfVxuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBNYXBTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgLy8gdGhlIGFyZ3VtZW50IHRvIG1hcCgpIG5lZWRzIHRvIGJlIGNhbGxhYmxlXG4gICAgICAgIGFyZy5zZWxlY3RvciA9IHRvU2VsZWN0b3IoYXJnLnNlbGVjdG9yKTtcbiAgICB9XG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIFNlbGVjdG9yU3BlYykge1xuICAgICAgICBjb25zdCB7IG9ybSwgY2FjaGVQYXRoIH0gPSBhcmc7XG4gICAgICAgIGxldCBsZXZlbDtcblxuICAgICAgICAvLyB0aGUgc2VsZWN0b3IgY2FjaGUgZm9yIHRoZSBzcGVjJ3MgT1JNXG4gICAgICAgIGlmICghc2VsZWN0b3JDYWNoZS5oYXMob3JtKSkge1xuICAgICAgICAgICAgc2VsZWN0b3JDYWNoZS5zZXQob3JtLCBuZXcgTWFwKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ybVNlbGVjdG9ycyA9IHNlbGVjdG9yQ2FjaGUuZ2V0KG9ybSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERyaWxsIGRvd24gaW50byBzZWxlY3RvciBtYXAgYnkgY2FjaGVQYXRoLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgc2VsZWN0b3IgaXRzZWxmIGlzIHN0b3JlZCB1bmRlciBhIHNwZWNpYWwgU0VMRUNUT1JfS0VZXG4gICAgICAgICAqIHNvIHRoYXQgd2UgY2FuIHN0b3JlIHNlbGVjdG9ycyBiZWxvdyBpdCBhcyB3ZWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV2ZWwgPSBvcm1TZWxlY3RvcnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGVQYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlS2V5ID0gY2FjaGVQYXRoW2ldO1xuICAgICAgICAgICAgaWYgKCFsZXZlbC5oYXMoc3RvcmFnZUtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXZlbC5zZXQoc3RvcmFnZUtleSwgbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsID0gbGV2ZWwuZ2V0KHN0b3JhZ2VLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZXZlbCAmJiBsZXZlbC5oYXMoU0VMRUNUT1JfS0VZKSkge1xuICAgICAgICAgICAgLy8gQ2FjaGUgaGl0OiB0aGUgc2VsZWN0b3IgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmVcbiAgICAgICAgICAgIHJldHVybiBsZXZlbC5nZXQoU0VMRUNUT1JfS0VZKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWNoZSBtaXNzOiB0aGUgc2VsZWN0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZFxuICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNyZWF0ZVNlbGVjdG9yRnJvbVNwZWMoYXJnKTtcbiAgICAgICAgLy8gU2F2ZSB0aGUgc2VsZWN0b3IgYXQgdGhlIGNhY2hlUGF0aCBwb3NpdGlvblxuICAgICAgICBsZXZlbC5zZXQoU0VMRUNUT1JfS0VZLCBzZWxlY3Rvcik7XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW50ZXJwcmV0IHNlbGVjdG9yIGFyZ3VtZW50OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYXJnXG4gICAgICAgICl9IG9mIHR5cGUgJHt0eXBlb2YgYXJnfWBcbiAgICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtZW1vaXplZCBzZWxlY3RvciBiYXNlZCBvbiBwYXNzZWQgYXJndW1lbnRzLlxuICogVGhpcyBpcyBzaW1pbGFyIHRvIGByZXNlbGVjdGAncyBgY3JlYXRlU2VsZWN0b3JgLFxuICogZXhjZXB0IHlvdSBjYW4gYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uIHRvIGJlIG1lbW9pemVkLlxuICpcbiAqIElmIHlvdSBwYXNzIG11bHRpcGxlIGZ1bmN0aW9ucywgdGhlIGZvcm1hdCB3aWxsIGJlIHRoZVxuICogc2FtZSBhcyBpbiBgcmVzZWxlY3RgLiBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgc2VsZWN0b3JcbiAqIGZ1bmN0aW9uIGFuZCB0aGUgcHJldmlvdXMgYXJlIGlucHV0IHNlbGVjdG9ycy5cbiAqXG4gKiBXaGVuIHlvdSB1c2UgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgc2VsZWN0b3IsIHRoZSByZXR1cm5lZCBzZWxlY3RvclxuICogZXhwZWN0cyB0aGUgd2hvbGUgYHJlZHV4LW9ybWAgc3RhdGUgYnJhbmNoIGFzIGlucHV0LiBJbiB0aGUgc2VsZWN0b3JcbiAqIGZ1bmN0aW9uIHRoYXQgeW91IHBhc3MgYXMgdGhlIGxhc3QgYXJndW1lbnQsIGFueSBvZiB0aGUgYXJndW1lbnRzXG4gKiB5b3UgcGFzcyBmaXJzdCB3aWxsIGJlIGNvbnNpZGVyZWQgc2VsZWN0b3JzIGFuZCBtYXBwZWRcbiAqIHRvIHRoZWlyIG91dHB1dHMsIGxpa2UgaW4gYHJlc2VsZWN0YC5cbiAqXG4gKiBIZXJlIGFyZSBzb21lIGV4YW1wbGUgc2VsZWN0b3JzOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIG9ybSBpcyBhbiBpbnN0YW5jZSBvZiBPUk1cbiAqIC8vIHJlZHV4U3RhdGUgaXMgdGhlIHN0YXRlIG9mIGEgUmVkdXggc3RvcmVcbiAqIGNvbnN0IGJvb2tzID0gY3JlYXRlU2VsZWN0b3Iob3JtLkJvb2spO1xuICogYm9va3MocmVkdXhTdGF0ZSkgLy8gYXJyYXkgb2YgYm9vayByZWZzXG4gKlxuICogY29uc3QgYm9va0F1dGhvcnMgPSBjcmVhdGVTZWxlY3Rvcihvcm0uQm9vay5hdXRob3JzKTtcbiAqIGJvb2tBdXRob3JzKHJlZHV4U3RhdGUpIC8vIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBhdXRob3IgcmVmcyBmb3IgZWFjaCBib29rXG4gKiBgYGBcbiAqIFNlbGVjdG9ycyBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgdG8gcmVsYXRlZCBtb2RlbHM6XG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBib29rQXV0aG9yTmFtZXMgPSBjcmVhdGVTZWxlY3RvcihcbiAqICAgICBvcm0uQm9vay5hdXRob3JzLm1hcChvcm0uQXV0aG9yLm5hbWUpLFxuICogKTtcbiAqIGJvb2tBdXRob3JOYW1lcyhyZWR1eFN0YXRlLCA4KSAvLyBuYW1lcyBvZiBhbGwgYXV0aG9ycyBvZiBib29rIHdpdGggSUQgOFxuICogYm9va0F1dGhvck5hbWVzKHJlZHV4U3RhdGUsIFs4LCA5XSkgLy8gMkQgYXJyYXkgb2YgbmFtZXMgb2YgYWxsIGF1dGhvcnMgb2YgYm9va3Mgd2l0aCBJRHMgOCBhbmQgOVxuICogYGBgXG4gKiBBbHNvIG5vdGUgdGhhdCBgb3JtLkF1dGhvci5uYW1lYCBkaWQgbm90IG5lZWQgdG8gYmUgd3JhcHBlZCBpbiBhbm90aGVyIGBjcmVhdGVTZWxlY3RvcmAgY2FsbCxcbiAqIGFsdGhvdWdoIHRoYXQgd291bGQgYmUgcG9zc2libGUuXG4gKlxuICogRm9yIG1vcmUgY29tcGxleCBjYWxjdWxhdGlvbnMgeW91IGNhbiBhY2Nlc3NcbiAqIGVudGlyZSBzZXNzaW9uIG9iamVjdHMgYnkgcGFzc2luZyBhbiBPUk0gaW5zdGFuY2UuXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBmcmVzaEJhbmFuYXNDb3N0ID0gY3JlYXRlU2VsZWN0b3IoXG4gKiAgICAgb3JtLFxuICogICAgIHNlc3Npb24gPT4ge1xuICogICAgICAgIGNvbnN0IGJhbmFuYSA9IHNlc3Npb24uUHJvZHVjdC5nZXQoe1xuICogICAgICAgICAgICBuYW1lOiBcIkJhbmFuYVwiLFxuICogICAgICAgIH0pO1xuICogICAgICAgIC8vIGFtb3VudCBvZiBmcmVzaCBiYW5hbmFzIGluIHNob3BwaW5nIGNhcnRcbiAqICAgICAgICBjb25zdCBhbW91bnQgPSBzZXNzaW9uLlNob3BwaW5nQ2FydC5maWx0ZXIoe1xuICogICAgICAgICAgICBwcm9kdWN0X2lkOiBiYW5hbmEuaWQsXG4gKiAgICAgICAgICAgIGlzX2ZyZXNoOiB0cnVlLFxuICogICAgICAgIH0pLmNvdW50KCk7XG4gKiAgICAgICAgcmV0dXJuIGBVU0QgJHthbW91bnQgKiBiYW5hbmEucHJpY2V9YDtcbiAqICAgICB9XG4gKiApO1xuICogYGBgXG4gKlxuICogcmVkdXgtb3JtIHVzZXMgYSBzcGVjaWFsIG1lbW9pemF0aW9uIGZ1bmN0aW9uIHRvIGF2b2lkIHJlY29tcHV0YXRpb25zLlxuICpcbiAqIEV2ZXJ5dGltZSBhIHNlbGVjdG9yIHJ1bnMsIHRoaXMgZnVuY3Rpb24gcmVjb3JkcyB3aGljaCBpbnN0YW5jZXNcbiAqIG9mIHlvdXIgYE1vZGVsYHMgd2VyZSBhY2Nlc3NlZC48YnI+XG4gKiBPbiBzdWJzZXF1ZW50IHJ1bnMsIHRoZSBzZWxlY3RvciBmaXJzdCBjaGVja3MgaWYgdGhlIHByZXZpb3VzbHlcbiAqIGFjY2Vzc2VkIGluc3RhbmNlcyBvciBgYXJnc2AgaGF2ZSBjaGFuZ2VkIGluIGFueSB3YXk6XG4gKiA8dWw+XG4gKiAgICAgPGxpPklmIHllcywgdGhlIHNlbGVjdG9yIGNhbGxzIHRoZSBmdW5jdGlvbiB5b3UgcGFzc2VkIHRvIGl0LjwvbGk+XG4gKiAgICAgPGxpPklmIG5vdCwgaXQganVzdCByZXR1cm5zIHRoZSBwcmV2aW91cyByZXN1bHRcbiAqICAgICAgICAgKHVubGVzcyB5b3UgY2FsbCBpdCBmb3IgdGhlIGZpcnN0IHRpbWUpLjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIFRoaXMgd2F5IHlvdSBjYW4gdXNlIHB1cmUgcmVuZGVyaW5nIGluIHlvdXIgUmVhY3QgY29tcG9uZW50c1xuICogZm9yIHBlcmZvcm1hbmNlIGdhaW5zLlxuICpcbiAqIEBnbG9iYWxcbiAqXG4gKiBAcGFyYW0gIHsuLi5GdW5jdGlvbn0gYXJncyAtIHplcm8gb3IgbW9yZSBpbnB1dCBzZWxlY3RvcnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzZWxlY3RvciBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBtZW1vaXplZCBzZWxlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3IoLi4uYXJncykge1xuICAgIGlmICghYXJncy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBhIHNlbGVjdG9yIHdpdGhvdXQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRBcmcgPSBhcmdzLnBvcCgpO1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcblxuICAgIGNvbnN0IG9ybSA9IGRlcGVuZGVuY2llcy5tYXAodG9PUk0pLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgaW5wdXRGdW5jcyA9IGRlcGVuZGVuY2llcy5tYXAodG9TZWxlY3Rvcik7XG5cbiAgICBpZiAodHlwZW9mIHJlc3VsdEFyZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmICghb3JtKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCBPUk0gZGF0YWJhc2Ugc3RhdGUuIFBsZWFzZSBwYXNzIGFuIE9STSBpbnN0YW5jZSBvciBhbiBPUk0gc2VsZWN0b3IgYXMgYW4gYXJndW1lbnQgdG8gYGNyZWF0ZVNlbGVjdG9yKClgLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFvcm0uc3RhdGVTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIHJlc29sdmUgdGhlIGN1cnJlbnQgT1JNIGRhdGFiYXNlIHN0YXRlLiBQbGVhc2UgcGFzcyBhbiBvYmplY3QgdG8gdGhlIE9STSBjb25zdHJ1Y3RvciB0aGF0IHNwZWNpZmllcyBhIGBzdGF0ZVNlbGVjdG9yYCBmdW5jdGlvbi5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3JtLnN0YXRlU2VsZWN0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgY3VycmVudCBPUk0gZGF0YWJhc2Ugc3RhdGUuIFBsZWFzZSBwYXNzIGEgZnVuY3Rpb24gd2hlbiBzcGVjaWZ5aW5nIHRoZSBPUk0ncyBcXGBzdGF0ZVNlbGVjdG9yXFxgLiBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgb3JtLnN0YXRlU2VsZWN0b3JcbiAgICAgICAgICAgICAgICApfSBvZiB0eXBlICR7dHlwZW9mIG9ybS5zdGF0ZVNlbGVjdG9yfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKFxuICAgICAgICAgICAgbWVtb2l6ZSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9ybVxuICAgICAgICApKFtvcm0uc3RhdGVTZWxlY3RvciwgLi4uaW5wdXRGdW5jc10sIHJlc3VsdEFyZyk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdEFyZyBpbnN0YW5jZW9mIE9STSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIk9STSBpbnN0YW5jZXMgY2Fubm90IGJlIHRoZSByZXN1bHQgZnVuY3Rpb24gb2Ygc2VsZWN0b3JzLiBZb3UgY2FuIGFjY2VzcyB5b3VyIG1vZGVscyBpbiB0aGUgbGFzdCBmdW5jdGlvbiB0aGF0IHlvdSBwYXNzIHRvIGBjcmVhdGVTZWxlY3RvcigpYC5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAoaW5wdXRGdW5jcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJZb3VyIGlucHV0IHNlbGVjdG9ycyB3aWxsIGJlIGlnbm9yZWQ6IHRoZSBwYXNzZWQgcmVzdWx0IGZ1bmN0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55IGlucHV0LlwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvU2VsZWN0b3IocmVzdWx0QXJnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/redux.js\n");
/***/ }),
@@ -4702,7 +4724,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return FieldSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MapSelectorSpec */ \"./src/selectors/MapSelectorSpec.js\");\n/* harmony import */ var _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ModelSelectorSpec */ \"./src/selectors/ModelSelectorSpec.js\");\n/* harmony import */ var _ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ModelBasedSelectorSpec */ \"./src/selectors/ModelBasedSelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n/* harmony import */ var _QuerySet__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../QuerySet */ \"./src/QuerySet.js\");\n/* harmony import */ var _Model__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Model */ \"./src/Model.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n\n\n\n\n\n\n\n\n\n\n\nlet FieldSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(FieldSelectorSpec, _ModelBasedSelectorSp);\n\n function FieldSelectorSpec({\n field,\n fieldModel,\n accessorName,\n isVirtual,\n ...other\n }) {\n var _this;\n\n _this = _ModelBasedSelectorSp.call(this, other) || this;\n _this._field = field;\n _this._fieldModel = fieldModel;\n _this._accessorName = accessorName;\n _this._isVirtual = isVirtual;\n return _this;\n }\n\n var _proto = FieldSelectorSpec.prototype;\n\n _proto.valueForInstance = function valueForInstance(instance, session) {\n if (!instance) {\n return null;\n }\n\n let value;\n\n if (this._parent instanceof _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n /* orm.Model.field */\n value = instance[this._accessorName];\n } else {\n /* orm.Model.field1.field2..fieldN.field */\n const {\n [this._parent.toModelName]: ParentToModel\n } = session;\n\n const parentRef = this._parent.valueForInstance(instance, session);\n\n const parentInstance = parentRef ? new ParentToModel(parentRef) : null;\n value = parentInstance ? parentInstance[this._accessorName] : null;\n }\n\n if (value instanceof _Model__WEBPACK_IMPORTED_MODULE_7__[\"default\"]) {\n return value.ref;\n }\n\n if (value instanceof _QuerySet__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n return value.toRefArray();\n }\n\n return value;\n };\n\n _proto.map = function map(selector) {\n if (selector instanceof _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n if (this.toModelName === selector.model.modelName) {\n throw new Error(`Cannot select models in a \\`map()\\` call. If you just want the \\`${this._accessorName}\\` as a ref array then you can simply drop the \\`map()\\`. Otherwise make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n } else {\n throw new Error(`Cannot select \\`${selector.model.modelName}\\` models in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n }\n } else if (selector instanceof FieldSelectorSpec || selector instanceof _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]) {\n if (this.toModelName !== selector.model.modelName) {\n throw new Error(`Cannot select fields of the \\`${selector.model.modelName}\\` model in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n }\n } else if (!selector || typeof selector !== \"function\" || !selector.recomputations) {\n throw new Error(`\\`map()\\` requires a selector as an input. Received: ${JSON.stringify(selector)} of type ${typeof selector}`);\n }\n\n if (!(this._field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_8__[\"default\"]) && !(this._field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_9__[\"default\"])) {\n throw new Error(\"Cannot map selectors for non-collection fields\");\n }\n\n return new _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n parent: this,\n model: this._model,\n orm: this._orm,\n field: this._field,\n selector\n });\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(FieldSelectorSpec, [{\n key: \"key\",\n get: function () {\n return this._accessorName;\n }\n }, {\n key: \"dependencies\",\n get: function () {\n return [this._orm, _idArgSelector__WEBPACK_IMPORTED_MODULE_5__[\"default\"]];\n }\n }, {\n key: \"toModelName\",\n get: function () {\n return this._field.toModelName === \"this\" ? this._fieldModel.modelName : this._field.toModelName;\n }\n }, {\n key: \"toModel\",\n get: function () {\n const db = this._orm.getDatabase();\n\n return db.describe(this.toModelName);\n }\n }]);\n\n return FieldSelectorSpec;\n}(_ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvRmllbGRTZWxlY3RvclNwZWMuanM/OTg2YSJdLCJuYW1lcyI6WyJGaWVsZFNlbGVjdG9yU3BlYyIsImZpZWxkIiwiZmllbGRNb2RlbCIsImFjY2Vzc29yTmFtZSIsImlzVmlydHVhbCIsIm90aGVyIiwiX2ZpZWxkIiwiX2ZpZWxkTW9kZWwiLCJfYWNjZXNzb3JOYW1lIiwiX2lzVmlydHVhbCIsInZhbHVlRm9ySW5zdGFuY2UiLCJpbnN0YW5jZSIsInNlc3Npb24iLCJ2YWx1ZSIsIl9wYXJlbnQiLCJNb2RlbFNlbGVjdG9yU3BlYyIsInRvTW9kZWxOYW1lIiwiUGFyZW50VG9Nb2RlbCIsInBhcmVudFJlZiIsInBhcmVudEluc3RhbmNlIiwiTW9kZWwiLCJyZWYiLCJRdWVyeVNldCIsInRvUmVmQXJyYXkiLCJtYXAiLCJzZWxlY3RvciIsIm1vZGVsIiwibW9kZWxOYW1lIiwiRXJyb3IiLCJNYXBTZWxlY3RvclNwZWMiLCJyZWNvbXB1dGF0aW9ucyIsIkpTT04iLCJzdHJpbmdpZnkiLCJGb3JlaWduS2V5IiwiTWFueVRvTWFueSIsInBhcmVudCIsIl9tb2RlbCIsIm9ybSIsIl9vcm0iLCJpZEFyZ1NlbGVjdG9yIiwiZGIiLCJnZXREYXRhYmFzZSIsImRlc2NyaWJlIiwiTW9kZWxCYXNlZFNlbGVjdG9yU3BlYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0lBRXFCQSxpQjs7O0FBQ2pCLDZCQUFZO0FBQUVDLFNBQUY7QUFBU0MsY0FBVDtBQUFxQkMsZ0JBQXJCO0FBQW1DQyxhQUFuQztBQUE4QyxPQUFHQztBQUFqRCxHQUFaLEVBQXNFO0FBQUE7O0FBQ2xFLDZDQUFNQSxLQUFOO0FBQ0EsVUFBS0MsTUFBTCxHQUFjTCxLQUFkO0FBQ0EsVUFBS00sV0FBTCxHQUFtQkwsVUFBbkI7QUFDQSxVQUFLTSxhQUFMLEdBQXFC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WjtBQUNIOzs7cUJBRWtCO0FBQ2YsYUFBTyxDQUFDLEtBQUs4QixJQUFOLEVBQVlDLHNEQUFaLENBQVA7QUFDSDs7O3FCQTBFaUI7QUFDZCxhQUFPLEtBQUtqQyxNQUFMLENBQVlVLFdBQVosS0FBNEIsTUFBNUIsR0FDRCxLQUFLVCxXQUFMLENBQWlCb0IsU0FEaEIsR0FFRCxLQUFLckIsTUFBTCxDQUFZVSxXQUZsQjtBQUdIOzs7cUJBRWE7QUFDVixZQUFNd0IsRUFBRSxHQUFHLEtBQUtGLElBQUwsQ0FBVUcsV0FBVixFQUFYOztBQUNBLGFBQU9ELEVBQUUsQ0FBQ0UsUUFBSCxDQUFZLEtBQUsxQixXQUFqQixDQUFQO0FBQ0g7Ozs7RUFsRzBDMkIsK0QiLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL0ZpZWxkU2VsZWN0b3JTcGVjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hcFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9NYXBTZWxlY3RvclNwZWNcIjtcbmltcG9ydCBNb2RlbFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9Nb2RlbFNlbGVjdG9yU3BlY1wiO1xuaW1wb3J0IE1vZGVsQmFzZWRTZWxlY3RvclNwZWMgZnJvbSBcIi4vTW9kZWxCYXNlZFNlbGVjdG9yU3BlY1wiO1xuaW1wb3J0IGlkQXJnU2VsZWN0b3IgZnJvbSBcIi4vaWRBcmdTZWxlY3RvclwiO1xuXG5pbXBvcnQgUXVlcnlTZXQgZnJvbSBcIi4uL1F1ZXJ5U2V0XCI7XG5pbXBvcnQgTW9kZWwgZnJvbSBcIi4uL01vZGVsXCI7XG5cbmltcG9ydCBGb3JlaWduS2V5IGZyb20gXCIuLi9maWVsZHMvRm9yZWlnbktleVwiO1xuaW1wb3J0IE1hbnlUb01hbnkgZnJvbSBcIi4uL2ZpZWxkcy9NYW55VG9NYW55XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpZWxkU2VsZWN0b3JTcGVjIGV4dGVuZHMgTW9kZWxCYXNlZFNlbGVjdG9yU3BlYyB7XG4gICAgY29uc3RydWN0b3IoeyBmaWVsZCwgZmllbGRNb2RlbCwgYWNjZXNzb3JOYW1lLCBpc1ZpcnR1YWwsIC4uLm90aGVyIH0pIHtcbiAgICAgICAgc3VwZXIob3RoZXIpO1xuICAgICAgICB0aGlzLl9maWVsZCA9IGZpZWxkO1xuICAgICAgICB0aGlzLl9maWVsZE1vZGVsID0gZmllbGRNb2RlbDtcbiAgICAgICAgdGhpcy5fYWNjZXNzb3JOYW1lID0gYWNjZXNzb3JOYW1lO1xuICAgICAgICB0aGlzLl9pc1ZpcnR1YWwgPSBpc1ZpcnR1YWw7XG4gICAgfVxuXG4gICAgZ2V0IGtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjY2Vzc29yTmFtZTtcbiAgICB9XG5cbiAgICBnZXQgZGVwZW5kZW5jaWVzKCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX29ybSwgaWRBcmdTZWxlY3Rvcl07XG4gICAgfVxuXG4gICAgdmFsdWVGb3JJbnN0YW5jZShpbnN0YW5jZSwgc2Vzc2lvbikge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBNb2RlbFNlbGVjdG9yU3BlYykge1xuICAgICAgICAgICAgLyogb3JtLk1vZGVsLmZpZWxkICovXG4gICAgICAgICAgICB2YWx1ZSA9IGluc3RhbmNlW3RoaXMuX2FjY2Vzc29yTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBvcm0uTW9kZWwuZmllbGQxLmZpZWxkMi4uZmllbGROLmZpZWxkICovXG4gICAgICAgICAgICBjb25zdCB7IFt0aGlzLl9wYXJlbnQudG9Nb2RlbE5hbWVdOiBQYXJlbnRUb01vZGVsIH0gPSBzZXNzaW9uO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UmVmID0gdGhpcy5fcGFyZW50LnZhbHVlRm9ySW5zdGFuY2UoaW5zdGFuY2UsIHNlc3Npb24pO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50SW5zdGFuY2UgPSBwYXJlbnRSZWZcbiAgICAgICAgICAgICAgICA/IG5ldyBQYXJlbnRUb01vZGVsKHBhcmVudFJlZilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcmVudEluc3RhbmNlID8gcGFyZW50SW5zdGFuY2VbdGhpcy5fYWNjZXNzb3JOYW1lXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZWY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUXVlcnlTZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1JlZkFycmF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIG1hcChzZWxlY3Rvcikge1xuICAgICAgICBpZiAoc2VsZWN0b3IgaW5zdGFuY2VvZiBNb2RlbFNlbGVjdG9yU3BlYykge1xuICAgICAgICAgICAgaWYgKHRoaXMudG9Nb2RlbE5hbWUgPT09IHNlbGVjdG9yLm1vZGVsLm1vZGVsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBzZWxlY3QgbW9kZWxzIGluIGEgXFxgbWFwKClcXGAgY2FsbC4gSWYgeW91IGp1c3Qgd2FudCB0aGUgXFxgJHt0aGlzLl9hY2Nlc3Nvck5hbWV9XFxgIGFzIGEgcmVmIGFycmF5IHRoZW4geW91IGNhbiBzaW1wbHkgZHJvcCB0aGUgXFxgbWFwKClcXGAuIE90aGVyd2lzZSBtYWtlIHN1cmUgeW91J3JlIHBhc3NpbmcgYSBmaWVsZCBzZWxlY3RvciBvZiB0aGUgZm9ybSBcXGAke3RoaXMudG9Nb2RlbE5hbWV9LjxmaWVsZD5cXGAgb3IgYSBjdXN0b20gc2VsZWN0b3IgaW5zdGVhZC5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IHNlbGVjdCBcXGAke3NlbGVjdG9yLm1vZGVsLm1vZGVsTmFtZX1cXGAgbW9kZWxzIGluIHRoaXMgXFxgbWFwKClcXGAgY2FsbC4gTWFrZSBzdXJlIHlvdSdyZSBwYXNzaW5nIGEgZmllbGQgc2VsZWN0b3Igb2YgdGhlIGZvcm0gXFxgJHt0aGlzLnRvTW9kZWxOYW1lfS48ZmllbGQ+XFxgIG9yIGEgY3VzdG9tIHNlbGVjdG9yIGluc3RlYWQuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBzZWxlY3RvciBpbnN0YW5jZW9mIEZpZWxkU2VsZWN0b3JTcGVjIHx8XG4gICAgICAgICAgICBzZWxlY3RvciBpbnN0YW5jZW9mIE1hcFNlbGVjdG9yU3BlY1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvTW9kZWxOYW1lICE9PSBzZWxlY3Rvci5tb2RlbC5tb2RlbE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3Qgc2VsZWN0IGZpZWxkcyBvZiB0aGUgXFxgJHtzZWxlY3Rvci5tb2RlbC5tb2RlbE5hbWV9XFxgIG1vZGVsIGluIHRoaXMgXFxgbWFwKClcXGAgY2FsbC4gTWFrZSBzdXJlIHlvdSdyZSBwYXNzaW5nIGEgZmllbGQgc2VsZWN0b3Igb2YgdGhlIGZvcm0gXFxgJHt0aGlzLnRvTW9kZWxOYW1lfS48ZmllbGQ+XFxgIG9yIGEgY3VzdG9tIHNlbGVjdG9yIGluc3RlYWQuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAhc2VsZWN0b3IgfHxcbiAgICAgICAgICAgIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgICAgICAgICAhc2VsZWN0b3IucmVjb21wdXRhdGlvbnNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFxcYG1hcCgpXFxgIHJlcXVpcmVzIGEgc2VsZWN0b3IgYXMgYW4gaW5wdXQuIFJlY2VpdmVkOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclxuICAgICAgICAgICAgICAgICl9IG9mIHR5cGUgJHt0eXBlb2Ygc2VsZWN0b3J9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKHRoaXMuX2ZpZWxkIGluc3RhbmNlb2YgRm9yZWlnbktleSkgJiZcbiAgICAgICAgICAgICEodGhpcy5fZmllbGQgaW5zdGFuY2VvZiBNYW55VG9NYW55KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBtYXAgc2VsZWN0b3JzIGZvciBub24tY29sbGVjdGlvbiBmaWVsZHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXBTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICAgICAgb3JtOiB0aGlzLl9vcm0sXG4gICAgICAgICAgICBmaWVsZDogdGhpcy5fZmllbGQsXG4gICAgICAgICAgICBzZWxlY3RvcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IHRvTW9kZWxOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGQudG9Nb2RlbE5hbWUgPT09IFwidGhpc1wiXG4gICAgICAgICAgICA/IHRoaXMuX2ZpZWxkTW9kZWwubW9kZWxOYW1lXG4gICAgICAgICAgICA6IHRoaXMuX2ZpZWxkLnRvTW9kZWxOYW1lO1xuICAgIH1cblxuICAgIGdldCB0b01vZGVsKCkge1xuICAgICAgICBjb25zdCBkYiA9IHRoaXMuX29ybS5nZXREYXRhYmFzZSgpO1xuICAgICAgICByZXR1cm4gZGIuZGVzY3JpYmUodGhpcy50b01vZGVsTmFtZSk7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/selectors/FieldSelectorSpec.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return FieldSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MapSelectorSpec */ \"./src/selectors/MapSelectorSpec.js\");\n/* harmony import */ var _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ModelSelectorSpec */ \"./src/selectors/ModelSelectorSpec.js\");\n/* harmony import */ var _ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ModelBasedSelectorSpec */ \"./src/selectors/ModelBasedSelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n/* harmony import */ var _QuerySet__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../QuerySet */ \"./src/QuerySet.js\");\n/* harmony import */ var _Model__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Model */ \"./src/Model.js\");\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n\n\n\n\n\n\n\n\n\n\n\nlet FieldSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(FieldSelectorSpec, _ModelBasedSelectorSp);\n\n function FieldSelectorSpec({\n field,\n fieldModel,\n accessorName,\n isVirtual,\n ...other\n }) {\n var _this;\n\n _this = _ModelBasedSelectorSp.call(this, other) || this;\n _this._field = field;\n _this._fieldModel = fieldModel;\n _this._accessorName = accessorName;\n _this._isVirtual = isVirtual;\n return _this;\n }\n\n var _proto = FieldSelectorSpec.prototype;\n\n _proto.valueForInstance = function valueForInstance(instance, session) {\n if (!instance) {\n return null;\n }\n\n let value;\n\n if (this._parent instanceof _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n /* orm.Model.field */\n value = instance[this._accessorName];\n } else {\n /* orm.Model.field1.field2..fieldN.field */\n const {\n [this._parent.toModelName]: ParentToModel\n } = session;\n\n const parentRef = this._parent.valueForInstance(instance, session);\n\n const parentInstance = parentRef ? new ParentToModel(parentRef) : null;\n value = parentInstance ? parentInstance[this._accessorName] : null;\n }\n\n if (value instanceof _Model__WEBPACK_IMPORTED_MODULE_7__[\"default\"]) {\n return value.ref;\n }\n\n if (value instanceof _QuerySet__WEBPACK_IMPORTED_MODULE_6__[\"default\"]) {\n return value.toRefArray();\n }\n\n return value;\n };\n\n _proto.map = function map(selector) {\n if (selector instanceof _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n if (this.toModelName === selector.model.modelName) {\n throw new Error(`Cannot select models in a \\`map()\\` call. If you just want the \\`${this._accessorName}\\` as a ref array then you can simply drop the \\`map()\\`. Otherwise make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n } else {\n throw new Error(`Cannot select \\`${selector.model.modelName}\\` models in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n }\n } else if (selector instanceof FieldSelectorSpec || selector instanceof _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]) {\n if (this.toModelName !== selector.model.modelName) {\n throw new Error(`Cannot select fields of the \\`${selector.model.modelName}\\` model in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`);\n }\n } else if (!selector || typeof selector !== \"function\" || !selector.recomputations) {\n throw new Error(`\\`map()\\` requires a selector as an input. Received: ${JSON.stringify(selector)} of type ${typeof selector}`);\n }\n\n if (!(this._field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_8__[\"default\"]) && !(this._field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_9__[\"default\"])) {\n throw new Error(\"Cannot map selectors for non-collection fields\");\n }\n\n return new _MapSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]({\n parent: this,\n model: this._model,\n orm: this._orm,\n field: this._field,\n selector\n });\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(FieldSelectorSpec, [{\n key: \"key\",\n get: function () {\n return this._accessorName;\n }\n }, {\n key: \"dependencies\",\n get: function () {\n return [this._orm, _idArgSelector__WEBPACK_IMPORTED_MODULE_5__[\"default\"]];\n }\n }, {\n key: \"toModelName\",\n get: function () {\n return this._field.toModelName === \"this\" ? this._fieldModel.modelName : this._field.toModelName;\n }\n }, {\n key: \"toModel\",\n get: function () {\n const db = this._orm.getDatabase();\n\n return db.describe(this.toModelName);\n }\n }]);\n\n return FieldSelectorSpec;\n}(_ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvRmllbGRTZWxlY3RvclNwZWMuanM/OTg2YSJdLCJuYW1lcyI6WyJGaWVsZFNlbGVjdG9yU3BlYyIsImZpZWxkIiwiZmllbGRNb2RlbCIsImFjY2Vzc29yTmFtZSIsImlzVmlydHVhbCIsIm90aGVyIiwiX2ZpZWxkIiwiX2ZpZWxkTW9kZWwiLCJfYWNjZXNzb3JOYW1lIiwiX2lzVmlydHVhbCIsInZhbHVlRm9ySW5zdGFuY2UiLCJpbnN0YW5jZSIsInNlc3Npb24iLCJ2YWx1ZSIsIl9wYXJlbnQiLCJNb2RlbFNlbGVjdG9yU3BlYyIsInRvTW9kZWxOYW1lIiwiUGFyZW50VG9Nb2RlbCIsInBhcmVudFJlZiIsInBhcmVudEluc3RhbmNlIiwiTW9kZWwiLCJyZWYiLCJRdWVyeVNldCIsInRvUmVmQXJyYXkiLCJtYXAiLCJzZWxlY3RvciIsIm1vZGVsIiwibW9kZWxOYW1lIiwiRXJyb3IiLCJNYXBTZWxlY3RvclNwZWMiLCJyZWNvbXB1dGF0aW9ucyIsIkpTT04iLCJzdHJpbmdpZnkiLCJGb3JlaWduS2V5IiwiTWFueVRvTWFueSIsInBhcmVudCIsIl9tb2RlbCIsIm9ybSIsIl9vcm0iLCJpZEFyZ1NlbGVjdG9yIiwiZGIiLCJnZXREYXRhYmFzZSIsImRlc2NyaWJlIiwiTW9kZWxCYXNlZFNlbGVjdG9yU3BlYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0lBRXFCQSxpQjs7O0FBQ2pCLDZCQUFZO0FBQUVDLFNBQUY7QUFBU0MsY0FBVDtBQUFxQkMsZ0JBQXJCO0FBQW1DQyxhQUFuQztBQUE4QyxPQUFHQztBQUFqRCxHQUFaLEVBQXNFO0FBQUE7O0FBQ2xFLDZDQUFNQSxLQUFOO0FBQ0EsVUFBS0MsTUFBTCxHQUFjTCxLQUFkO0FBQ0EsVUFBS00sV0FBTCxHQUFtQkwsVUFBbkI7QUFDQSxVQUFLTSxhQUFMLEdBQXFC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LGFBQVo7QUFDSDs7O1NBRUQsWUFBbUI7QUFDZixhQUFPLENBQUMsS0FBSzhCLElBQU4sRUFBWUMsc0RBQVosQ0FBUDtBQUNIOzs7U0EwRUQsWUFBa0I7QUFDZCxhQUFPLEtBQUtqQyxNQUFMLENBQVlVLFdBQVosS0FBNEIsTUFBNUIsR0FDRCxLQUFLVCxXQUFMLENBQWlCb0IsU0FEaEIsR0FFRCxLQUFLckIsTUFBTCxDQUFZVSxXQUZsQjtBQUdIOzs7U0FFRCxZQUFjO0FBQ1YsWUFBTXdCLEVBQUUsR0FBRyxLQUFLRixJQUFMLENBQVVHLFdBQVYsRUFBWDs7QUFDQSxhQUFPRCxFQUFFLENBQUNFLFFBQUgsQ0FBWSxLQUFLMUIsV0FBakIsQ0FBUDtBQUNIOzs7O0VBbEcwQzJCLCtEIiwiZmlsZSI6Ii4vc3JjL3NlbGVjdG9ycy9GaWVsZFNlbGVjdG9yU3BlYy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXBTZWxlY3RvclNwZWMgZnJvbSBcIi4vTWFwU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgTW9kZWxTZWxlY3RvclNwZWMgZnJvbSBcIi4vTW9kZWxTZWxlY3RvclNwZWNcIjtcbmltcG9ydCBNb2RlbEJhc2VkU2VsZWN0b3JTcGVjIGZyb20gXCIuL01vZGVsQmFzZWRTZWxlY3RvclNwZWNcIjtcbmltcG9ydCBpZEFyZ1NlbGVjdG9yIGZyb20gXCIuL2lkQXJnU2VsZWN0b3JcIjtcblxuaW1wb3J0IFF1ZXJ5U2V0IGZyb20gXCIuLi9RdWVyeVNldFwiO1xuaW1wb3J0IE1vZGVsIGZyb20gXCIuLi9Nb2RlbFwiO1xuXG5pbXBvcnQgRm9yZWlnbktleSBmcm9tIFwiLi4vZmllbGRzL0ZvcmVpZ25LZXlcIjtcbmltcG9ydCBNYW55VG9NYW55IGZyb20gXCIuLi9maWVsZHMvTWFueVRvTWFueVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWVsZFNlbGVjdG9yU3BlYyBleHRlbmRzIE1vZGVsQmFzZWRTZWxlY3RvclNwZWMge1xuICAgIGNvbnN0cnVjdG9yKHsgZmllbGQsIGZpZWxkTW9kZWwsIGFjY2Vzc29yTmFtZSwgaXNWaXJ0dWFsLCAuLi5vdGhlciB9KSB7XG4gICAgICAgIHN1cGVyKG90aGVyKTtcbiAgICAgICAgdGhpcy5fZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5fZmllbGRNb2RlbCA9IGZpZWxkTW9kZWw7XG4gICAgICAgIHRoaXMuX2FjY2Vzc29yTmFtZSA9IGFjY2Vzc29yTmFtZTtcbiAgICAgICAgdGhpcy5faXNWaXJ0dWFsID0gaXNWaXJ0dWFsO1xuICAgIH1cblxuICAgIGdldCBrZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3Nvck5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9vcm0sIGlkQXJnU2VsZWN0b3JdO1xuICAgIH1cblxuICAgIHZhbHVlRm9ySW5zdGFuY2UoaW5zdGFuY2UsIHNlc3Npb24pIHtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTW9kZWxTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgICAgIC8qIG9ybS5Nb2RlbC5maWVsZCAqL1xuICAgICAgICAgICAgdmFsdWUgPSBpbnN0YW5jZVt0aGlzLl9hY2Nlc3Nvck5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogb3JtLk1vZGVsLmZpZWxkMS5maWVsZDIuLmZpZWxkTi5maWVsZCAqL1xuICAgICAgICAgICAgY29uc3QgeyBbdGhpcy5fcGFyZW50LnRvTW9kZWxOYW1lXTogUGFyZW50VG9Nb2RlbCB9ID0gc2Vzc2lvbjtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlZiA9IHRoaXMuX3BhcmVudC52YWx1ZUZvckluc3RhbmNlKGluc3RhbmNlLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gcGFyZW50UmVmXG4gICAgICAgICAgICAgICAgPyBuZXcgUGFyZW50VG9Nb2RlbChwYXJlbnRSZWYpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJlbnRJbnN0YW5jZSA/IHBhcmVudEluc3RhbmNlW3RoaXMuX2FjY2Vzc29yTmFtZV0gOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVmO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFF1ZXJ5U2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9SZWZBcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBtYXAoc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgTW9kZWxTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRvTW9kZWxOYW1lID09PSBzZWxlY3Rvci5tb2RlbC5tb2RlbE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3Qgc2VsZWN0IG1vZGVscyBpbiBhIFxcYG1hcCgpXFxgIGNhbGwuIElmIHlvdSBqdXN0IHdhbnQgdGhlIFxcYCR7dGhpcy5fYWNjZXNzb3JOYW1lfVxcYCBhcyBhIHJlZiBhcnJheSB0aGVuIHlvdSBjYW4gc2ltcGx5IGRyb3AgdGhlIFxcYG1hcCgpXFxgLiBPdGhlcndpc2UgbWFrZSBzdXJlIHlvdSdyZSBwYXNzaW5nIGEgZmllbGQgc2VsZWN0b3Igb2YgdGhlIGZvcm0gXFxgJHt0aGlzLnRvTW9kZWxOYW1lfS48ZmllbGQ+XFxgIG9yIGEgY3VzdG9tIHNlbGVjdG9yIGluc3RlYWQuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBzZWxlY3QgXFxgJHtzZWxlY3Rvci5tb2RlbC5tb2RlbE5hbWV9XFxgIG1vZGVscyBpbiB0aGlzIFxcYG1hcCgpXFxgIGNhbGwuIE1ha2Ugc3VyZSB5b3UncmUgcGFzc2luZyBhIGZpZWxkIHNlbGVjdG9yIG9mIHRoZSBmb3JtIFxcYCR7dGhpcy50b01vZGVsTmFtZX0uPGZpZWxkPlxcYCBvciBhIGN1c3RvbSBzZWxlY3RvciBpbnN0ZWFkLmBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgc2VsZWN0b3IgaW5zdGFuY2VvZiBGaWVsZFNlbGVjdG9yU3BlYyB8fFxuICAgICAgICAgICAgc2VsZWN0b3IgaW5zdGFuY2VvZiBNYXBTZWxlY3RvclNwZWNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50b01vZGVsTmFtZSAhPT0gc2VsZWN0b3IubW9kZWwubW9kZWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IHNlbGVjdCBmaWVsZHMgb2YgdGhlIFxcYCR7c2VsZWN0b3IubW9kZWwubW9kZWxOYW1lfVxcYCBtb2RlbCBpbiB0aGlzIFxcYG1hcCgpXFxgIGNhbGwuIE1ha2Ugc3VyZSB5b3UncmUgcGFzc2luZyBhIGZpZWxkIHNlbGVjdG9yIG9mIHRoZSBmb3JtIFxcYCR7dGhpcy50b01vZGVsTmFtZX0uPGZpZWxkPlxcYCBvciBhIGN1c3RvbSBzZWxlY3RvciBpbnN0ZWFkLmBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgIXNlbGVjdG9yIHx8XG4gICAgICAgICAgICB0eXBlb2Ygc2VsZWN0b3IgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgICAgICAgIXNlbGVjdG9yLnJlY29tcHV0YXRpb25zXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBcXGBtYXAoKVxcYCByZXF1aXJlcyBhIHNlbGVjdG9yIGFzIGFuIGlucHV0LiBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICApfSBvZiB0eXBlICR7dHlwZW9mIHNlbGVjdG9yfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgISh0aGlzLl9maWVsZCBpbnN0YW5jZW9mIEZvcmVpZ25LZXkpICYmXG4gICAgICAgICAgICAhKHRoaXMuX2ZpZWxkIGluc3RhbmNlb2YgTWFueVRvTWFueSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbWFwIHNlbGVjdG9ycyBmb3Igbm9uLWNvbGxlY3Rpb24gZmllbGRzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTWFwU2VsZWN0b3JTcGVjKHtcbiAgICAgICAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbCxcbiAgICAgICAgICAgIG9ybTogdGhpcy5fb3JtLFxuICAgICAgICAgICAgZmllbGQ6IHRoaXMuX2ZpZWxkLFxuICAgICAgICAgICAgc2VsZWN0b3IsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCB0b01vZGVsTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkLnRvTW9kZWxOYW1lID09PSBcInRoaXNcIlxuICAgICAgICAgICAgPyB0aGlzLl9maWVsZE1vZGVsLm1vZGVsTmFtZVxuICAgICAgICAgICAgOiB0aGlzLl9maWVsZC50b01vZGVsTmFtZTtcbiAgICB9XG5cbiAgICBnZXQgdG9Nb2RlbCgpIHtcbiAgICAgICAgY29uc3QgZGIgPSB0aGlzLl9vcm0uZ2V0RGF0YWJhc2UoKTtcbiAgICAgICAgcmV0dXJuIGRiLmRlc2NyaWJlKHRoaXMudG9Nb2RlbE5hbWUpO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/selectors/FieldSelectorSpec.js\n");
/***/ }),
@@ -4714,7 +4736,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return MapSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ModelBasedSelectorSpec */ \"./src/selectors/ModelBasedSelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n\n\n\n\n\nlet MapSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(MapSelectorSpec, _ModelBasedSelectorSp);\n\n function MapSelectorSpec({\n field,\n selector,\n ...other\n }) {\n var _this;\n\n _this = _ModelBasedSelectorSp.call(this, other) || this;\n _this._field = field;\n _this._selector = selector;\n return _this;\n }\n\n var _proto = MapSelectorSpec.prototype;\n\n _proto.createResultFunc = function createResultFunc(parentSelector) {\n const {\n idAttribute\n } = this._parent.toModel;\n return (state, ...other) => {\n /**\n * The parent selector should return a ref array\n * in case of a single ID being passed.\n * Otherwise it should return an array of ref arrays.\n */\n const parentResult = parentSelector(state, ...other);\n const idArg = Object(_idArgSelector__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state, ...other);\n\n const single = refArray => {\n if (refArray === null) {\n // an intermediate field could not be resolved\n return null;\n }\n\n return refArray.map(ref => this._selector(state, ref[idAttribute]));\n };\n\n if (typeof idArg === \"undefined\" || Array.isArray(idArg)) {\n return parentResult.map(single);\n }\n\n return single(parentResult);\n };\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(MapSelectorSpec, [{\n key: \"selector\",\n get: function () {\n return this._selector;\n },\n set: function (selector) {\n this._selector = selector;\n }\n }, {\n key: \"key\",\n get: function () {\n return this._selector;\n }\n }]);\n\n return MapSelectorSpec;\n}(_ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTWFwU2VsZWN0b3JTcGVjLmpzP2E4MDUiXSwibmFtZXMiOlsiTWFwU2VsZWN0b3JTcGVjIiwiZmllbGQiLCJzZWxlY3RvciIsIm90aGVyIiwiX2ZpZWxkIiwiX3NlbGVjdG9yIiwiY3JlYXRlUmVzdWx0RnVuYyIsInBhcmVudFNlbGVjdG9yIiwiaWRBdHRyaWJ1dGUiLCJfcGFyZW50IiwidG9Nb2RlbCIsInN0YXRlIiwicGFyZW50UmVzdWx0IiwiaWRBcmciLCJpZEFyZ1NlbGVjdG9yIiwic2luZ2xlIiwicmVmQXJyYXkiLCJtYXAiLCJyZWYiLCJBcnJheSIsImlzQXJyYXkiLCJNb2RlbEJhc2VkU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTs7SUFFcUJBLGU7OztBQUNqQiwyQkFBWTtBQUFFQyxTQUFGO0FBQVNDLFlBQVQ7QUFBbUIsT0FBR0M7QUFBdEIsR0FBWixFQUEyQztBQUFBOztBQUN2Qyw2Q0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0gsS0FBZDtBQUNBLFVBQUtJLFNBQUwsR0FBaUJILFFBQWpCO0FBSHVDO0FBSTFDOzs7O1NBRURJLGdCLEdBQUEsMEJBQWlCQyxjQUFqQixFQUFpQztBQUM3QixVQUFNO0FBQUVDO0FBQUYsUUFBa0IsS0FBS0MsT0FBTCxDQUFhQyxPQUFyQztBQUNBLFdBQU8sQ0FBQ0MsS0FBRCxFQUFRLEdBQUdSLEtBQVgsS0FBcUI7QUFDeEI7Ozs7O0FBS0EsWUFBTVMsWUFBWSxHQUFHTCxjQUFjLENBQUNJLEtBQUQsRUFBUSxHQUFHUixLQUFYLENBQW5DO0FBQ0EsWUFBTVUsS0FBSyxHQUFHQyw4REFBYSxDQUFDSCxLQUFELEVBQVEsR0FBR1IsS0FBWCxDQUEzQjs7QUFDQSxZQUFNWSxNQUFNLEdBQUdDLFFBQVEsSUFBSTtBQUN2QixZQUFJQSxRQUFRLEtBQUssSUFBakIsRUFBdUI7QUFDbkI7QUFDQSxpQkFBTyxJQUFQO0FBQ0g7O0FBQ0QsZUFBT0EsUUFBUSxDQUFDQyxHQUFULENBQWFDLEdBQUcsSUFDbkIsS0FBS2IsU0FBTCxDQUFlTSxLQUFmLEVBQXNCTyxHQUFHLENBQUNWLFdBQUQsQ0FBekIsQ0FERyxDQUFQO0FBR0gsT0FSRDs7QUFTQSxVQUFJLE9BQU9LLEtBQVAsS0FBaUIsV0FBakIsSUFBZ0NNLEtBQUssQ0FBQ0MsT0FBTixDQUFjUCxLQUFkLENBQXBDLEVBQTBEO0FBQ3RELGVBQU9ELFlBQVksQ0FBQ0ssR0FBYixDQUFpQkYsTUFBakIsQ0FBUDtBQUNIOztBQUNELGFBQU9BLE1BQU0sQ0FBQ0gsWUFBRCxDQUFiO0FBQ0gsS0FyQkQ7QUFzQkgsRzs7OztxQkFFYztBQUNYLGFBQU8sS0FBS1AsU0FBWjtBQUNILEs7bUJBRVlILFEsRUFBVTtBQUNuQixXQUFLRyxTQUFMLEdBQWlCSCxRQUFqQjtBQUNIOzs7cUJBRVM7QUFDTixhQUFPLEtBQUtHLFNBQVo7QUFDSDs7OztFQTNDd0NnQiwrRCIsImZpbGUiOiIuL3NyYy9zZWxlY3RvcnMvTWFwU2VsZWN0b3JTcGVjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1vZGVsQmFzZWRTZWxlY3RvclNwZWMgZnJvbSBcIi4vTW9kZWxCYXNlZFNlbGVjdG9yU3BlY1wiO1xuaW1wb3J0IGlkQXJnU2VsZWN0b3IgZnJvbSBcIi4vaWRBcmdTZWxlY3RvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXBTZWxlY3RvclNwZWMgZXh0ZW5kcyBNb2RlbEJhc2VkU2VsZWN0b3JTcGVjIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGZpZWxkLCBzZWxlY3RvciwgLi4ub3RoZXIgfSkge1xuICAgICAgICBzdXBlcihvdGhlcik7XG4gICAgICAgIHRoaXMuX2ZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgY3JlYXRlUmVzdWx0RnVuYyhwYXJlbnRTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCB7IGlkQXR0cmlidXRlIH0gPSB0aGlzLl9wYXJlbnQudG9Nb2RlbDtcbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgLi4ub3RoZXIpID0+IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIHBhcmVudCBzZWxlY3RvciBzaG91bGQgcmV0dXJuIGEgcmVmIGFycmF5XG4gICAgICAgICAgICAgKiBpbiBjYXNlIG9mIGEgc2luZ2xlIElEIGJlaW5nIHBhc3NlZC5cbiAgICAgICAgICAgICAqIE90aGVyd2lzZSBpdCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIHJlZiBhcnJheXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlc3VsdCA9IHBhcmVudFNlbGVjdG9yKHN0YXRlLCAuLi5vdGhlcik7XG4gICAgICAgICAgICBjb25zdCBpZEFyZyA9IGlkQXJnU2VsZWN0b3Ioc3RhdGUsIC4uLm90aGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZSA9IHJlZkFycmF5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmQXJyYXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIGZpZWxkIGNvdWxkIG5vdCBiZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkFycmF5Lm1hcChyZWYgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3Ioc3RhdGUsIHJlZltpZEF0dHJpYnV0ZV0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkQXJnID09PSBcInVuZGVmaW5lZFwiIHx8IEFycmF5LmlzQXJyYXkoaWRBcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFJlc3VsdC5tYXAoc2luZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGUocGFyZW50UmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RvcjtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG5cbiAgICBnZXQga2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0b3I7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/selectors/MapSelectorSpec.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return MapSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ModelBasedSelectorSpec */ \"./src/selectors/ModelBasedSelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n\n\n\n\n\nlet MapSelectorSpec = /*#__PURE__*/function (_ModelBasedSelectorSp) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(MapSelectorSpec, _ModelBasedSelectorSp);\n\n function MapSelectorSpec({\n field,\n selector,\n ...other\n }) {\n var _this;\n\n _this = _ModelBasedSelectorSp.call(this, other) || this;\n _this._field = field;\n _this._selector = selector;\n return _this;\n }\n\n var _proto = MapSelectorSpec.prototype;\n\n _proto.createResultFunc = function createResultFunc(parentSelector) {\n const {\n idAttribute\n } = this._parent.toModel;\n return (state, ...other) => {\n /**\n * The parent selector should return a ref array\n * in case of a single ID being passed.\n * Otherwise it should return an array of ref arrays.\n */\n const parentResult = parentSelector(state, ...other);\n const idArg = Object(_idArgSelector__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(state, ...other);\n\n const single = refArray => {\n if (refArray === null) {\n // an intermediate field could not be resolved\n return null;\n }\n\n return refArray.map(ref => this._selector(state, ref[idAttribute]));\n };\n\n if (typeof idArg === \"undefined\" || Array.isArray(idArg)) {\n return parentResult.map(single);\n }\n\n return single(parentResult);\n };\n };\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(MapSelectorSpec, [{\n key: \"selector\",\n get: function () {\n return this._selector;\n },\n set: function (selector) {\n this._selector = selector;\n }\n }, {\n key: \"key\",\n get: function () {\n return this._selector;\n }\n }]);\n\n return MapSelectorSpec;\n}(_ModelBasedSelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTWFwU2VsZWN0b3JTcGVjLmpzP2E4MDUiXSwibmFtZXMiOlsiTWFwU2VsZWN0b3JTcGVjIiwiZmllbGQiLCJzZWxlY3RvciIsIm90aGVyIiwiX2ZpZWxkIiwiX3NlbGVjdG9yIiwiY3JlYXRlUmVzdWx0RnVuYyIsInBhcmVudFNlbGVjdG9yIiwiaWRBdHRyaWJ1dGUiLCJfcGFyZW50IiwidG9Nb2RlbCIsInN0YXRlIiwicGFyZW50UmVzdWx0IiwiaWRBcmciLCJpZEFyZ1NlbGVjdG9yIiwic2luZ2xlIiwicmVmQXJyYXkiLCJtYXAiLCJyZWYiLCJBcnJheSIsImlzQXJyYXkiLCJNb2RlbEJhc2VkU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTs7SUFFcUJBLGU7OztBQUNqQiwyQkFBWTtBQUFFQyxTQUFGO0FBQVNDLFlBQVQ7QUFBbUIsT0FBR0M7QUFBdEIsR0FBWixFQUEyQztBQUFBOztBQUN2Qyw2Q0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0gsS0FBZDtBQUNBLFVBQUtJLFNBQUwsR0FBaUJILFFBQWpCO0FBSHVDO0FBSTFDOzs7O1NBRURJLGdCLEdBQUEsMEJBQWlCQyxjQUFqQixFQUFpQztBQUM3QixVQUFNO0FBQUVDO0FBQUYsUUFBa0IsS0FBS0MsT0FBTCxDQUFhQyxPQUFyQztBQUNBLFdBQU8sQ0FBQ0MsS0FBRCxFQUFRLEdBQUdSLEtBQVgsS0FBcUI7QUFDeEI7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNZLFlBQU1TLFlBQVksR0FBR0wsY0FBYyxDQUFDSSxLQUFELEVBQVEsR0FBR1IsS0FBWCxDQUFuQztBQUNBLFlBQU1VLEtBQUssR0FBR0MsOERBQWEsQ0FBQ0gsS0FBRCxFQUFRLEdBQUdSLEtBQVgsQ0FBM0I7O0FBQ0EsWUFBTVksTUFBTSxHQUFJQyxRQUFELElBQWM7QUFDekIsWUFBSUEsUUFBUSxLQUFLLElBQWpCLEVBQXVCO0FBQ25CO0FBQ0EsaUJBQU8sSUFBUDtBQUNIOztBQUNELGVBQU9BLFFBQVEsQ0FBQ0MsR0FBVCxDQUFjQyxHQUFELElBQ2hCLEtBQUtiLFNBQUwsQ0FBZU0sS0FBZixFQUFzQk8sR0FBRyxDQUFDVixXQUFELENBQXpCLENBREcsQ0FBUDtBQUdILE9BUkQ7O0FBU0EsVUFBSSxPQUFPSyxLQUFQLEtBQWlCLFdBQWpCLElBQWdDTSxLQUFLLENBQUNDLE9BQU4sQ0FBY1AsS0FBZCxDQUFwQyxFQUEwRDtBQUN0RCxlQUFPRCxZQUFZLENBQUNLLEdBQWIsQ0FBaUJGLE1BQWpCLENBQVA7QUFDSDs7QUFDRCxhQUFPQSxNQUFNLENBQUNILFlBQUQsQ0FBYjtBQUNILEtBckJEO0FBc0JILEc7Ozs7U0FFRCxZQUFlO0FBQ1gsYUFBTyxLQUFLUCxTQUFaO0FBQ0gsSztTQUVELFVBQWFILFFBQWIsRUFBdUI7QUFDbkIsV0FBS0csU0FBTCxHQUFpQkgsUUFBakI7QUFDSDs7O1NBRUQsWUFBVTtBQUNOLGFBQU8sS0FBS0csU0FBWjtBQUNIOzs7O0VBM0N3Q2dCLCtEIiwiZmlsZSI6Ii4vc3JjL3NlbGVjdG9ycy9NYXBTZWxlY3RvclNwZWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTW9kZWxCYXNlZFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9Nb2RlbEJhc2VkU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgaWRBcmdTZWxlY3RvciBmcm9tIFwiLi9pZEFyZ1NlbGVjdG9yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcFNlbGVjdG9yU3BlYyBleHRlbmRzIE1vZGVsQmFzZWRTZWxlY3RvclNwZWMge1xuICAgIGNvbnN0cnVjdG9yKHsgZmllbGQsIHNlbGVjdG9yLCAuLi5vdGhlciB9KSB7XG4gICAgICAgIHN1cGVyKG90aGVyKTtcbiAgICAgICAgdGhpcy5fZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG5cbiAgICBjcmVhdGVSZXN1bHRGdW5jKHBhcmVudFNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHsgaWRBdHRyaWJ1dGUgfSA9IHRoaXMuX3BhcmVudC50b01vZGVsO1xuICAgICAgICByZXR1cm4gKHN0YXRlLCAuLi5vdGhlcikgPT4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgcGFyZW50IHNlbGVjdG9yIHNob3VsZCByZXR1cm4gYSByZWYgYXJyYXlcbiAgICAgICAgICAgICAqIGluIGNhc2Ugb2YgYSBzaW5nbGUgSUQgYmVpbmcgcGFzc2VkLlxuICAgICAgICAgICAgICogT3RoZXJ3aXNlIGl0IHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgcmVmIGFycmF5cy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UmVzdWx0ID0gcGFyZW50U2VsZWN0b3Ioc3RhdGUsIC4uLm90aGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGlkQXJnID0gaWRBcmdTZWxlY3RvcihzdGF0ZSwgLi4ub3RoZXIpO1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlID0gKHJlZkFycmF5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkFycmF5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBmaWVsZCBjb3VsZCBub3QgYmUgcmVzb2x2ZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWZBcnJheS5tYXAoKHJlZikgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3Ioc3RhdGUsIHJlZltpZEF0dHJpYnV0ZV0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkQXJnID09PSBcInVuZGVmaW5lZFwiIHx8IEFycmF5LmlzQXJyYXkoaWRBcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFJlc3VsdC5tYXAoc2luZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGUocGFyZW50UmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RvcjtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG5cbiAgICBnZXQga2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0b3I7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/selectors/MapSelectorSpec.js\n");
/***/ }),
@@ -4726,7 +4748,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModelBasedSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n\n\n\n\nlet ModelBasedSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ModelBasedSelectorSpec, _SelectorSpec);\n\n function ModelBasedSelectorSpec({\n model,\n ...other\n }) {\n var _this;\n\n _this = _SelectorSpec.call(this, other) || this;\n _this._model = model;\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ModelBasedSelectorSpec, [{\n key: \"resultFunc\",\n get: function () {\n return (session, idArg, ...other) => {\n const {\n [this._model.modelName]: ModelClass\n } = session;\n\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toModelArray().map(instance => this.valueForInstance(instance, session, ...other));\n }\n\n if (Array.isArray(idArg)) {\n return idArg.map(id => this.valueForInstance(ModelClass.withId(id), session, ...other));\n }\n\n return this.valueForInstance(ModelClass.withId(idArg), session, ...other);\n };\n }\n }, {\n key: \"model\",\n get: function () {\n return this._model;\n }\n }]);\n\n return ModelBasedSelectorSpec;\n}(_SelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTW9kZWxCYXNlZFNlbGVjdG9yU3BlYy5qcz8wODc2Il0sIm5hbWVzIjpbIk1vZGVsQmFzZWRTZWxlY3RvclNwZWMiLCJtb2RlbCIsIm90aGVyIiwiX21vZGVsIiwic2Vzc2lvbiIsImlkQXJnIiwibW9kZWxOYW1lIiwiTW9kZWxDbGFzcyIsImFsbCIsInRvTW9kZWxBcnJheSIsIm1hcCIsImluc3RhbmNlIiwidmFsdWVGb3JJbnN0YW5jZSIsIkFycmF5IiwiaXNBcnJheSIsImlkIiwid2l0aElkIiwiU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7SUFFcUJBLHNCOzs7QUFDakIsa0NBQVk7QUFBRUMsU0FBRjtBQUFTLE9BQUdDO0FBQVosR0FBWixFQUFpQztBQUFBOztBQUM3QixxQ0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0YsS0FBZDtBQUY2QjtBQUdoQzs7OztxQkFFZ0I7QUFDYixhQUFPLENBQUNHLE9BQUQsRUFBVUMsS0FBVixFQUFpQixHQUFHSCxLQUFwQixLQUE4QjtBQUNqQyxjQUFNO0FBQUUsV0FBQyxLQUFLQyxNQUFMLENBQVlHLFNBQWIsR0FBeUJDO0FBQTNCLFlBQTBDSCxPQUFoRDs7QUFDQSxZQUFJLE9BQU9DLEtBQVAsS0FBaUIsV0FBckIsRUFBa0M7QUFDOUIsaUJBQU9FLFVBQVUsQ0FBQ0MsR0FBWCxHQUNGQyxZQURFLEdBRUZDLEdBRkUsQ0FFRUMsUUFBUSxJQUNULEtBQUtDLGdCQUFMLENBQXNCRCxRQUF0QixFQUFnQ1AsT0FBaEMsRUFBeUMsR0FBR0YsS0FBNUMsQ0FIRCxDQUFQO0FBS0g7O0FBQ0QsWUFBSVcsS0FBSyxDQUFDQyxPQUFOLENBQWNULEtBQWQsQ0FBSixFQUEwQjtBQUN0QixpQkFBT0EsS0FBSyxDQUFDSyxHQUFOLENBQVVLLEVBQUUsSUFDZixLQUFLSCxnQkFBTCxDQUNJTCxVQUFVLENBQUNTLE1BQVgsQ0FBa0JELEVBQWxCLENBREosRUFFSVgsT0FGSixFQUdJLEdBQUdGLEtBSFAsQ0FERyxDQUFQO0FBT0g7O0FBQ0QsZUFBTyxLQUFLVSxnQkFBTCxDQUNITCxVQUFVLENBQUNTLE1BQVgsQ0FBa0JYLEtBQWxCLENBREcsRUFFSEQsT0FGRyxFQUdILEdBQUdGLEtBSEEsQ0FBUDtBQUtILE9BdkJEO0FBd0JIOzs7cUJBRVc7QUFDUixhQUFPLEtBQUtDLE1BQVo7QUFDSDs7OztFQW5DK0NjLHFEIiwiZmlsZSI6Ii4vc3JjL3NlbGVjdG9ycy9Nb2RlbEJhc2VkU2VsZWN0b3JTcGVjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9TZWxlY3RvclNwZWNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kZWxCYXNlZFNlbGVjdG9yU3BlYyBleHRlbmRzIFNlbGVjdG9yU3BlYyB7XG4gICAgY29uc3RydWN0b3IoeyBtb2RlbCwgLi4ub3RoZXIgfSkge1xuICAgICAgICBzdXBlcihvdGhlcik7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgfVxuXG4gICAgZ2V0IHJlc3VsdEZ1bmMoKSB7XG4gICAgICAgIHJldHVybiAoc2Vzc2lvbiwgaWRBcmcsIC4uLm90aGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IFt0aGlzLl9tb2RlbC5tb2RlbE5hbWVdOiBNb2RlbENsYXNzIH0gPSBzZXNzaW9uO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZEFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBNb2RlbENsYXNzLmFsbCgpXG4gICAgICAgICAgICAgICAgICAgIC50b01vZGVsQXJyYXkoKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGluc3RhbmNlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlRm9ySW5zdGFuY2UoaW5zdGFuY2UsIHNlc3Npb24sIC4uLm90aGVyKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWRBcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkQXJnLm1hcChpZCA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlRm9ySW5zdGFuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBNb2RlbENsYXNzLndpdGhJZChpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3RoZXJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUZvckluc3RhbmNlKFxuICAgICAgICAgICAgICAgIE1vZGVsQ2xhc3Mud2l0aElkKGlkQXJnKSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgIC4uLm90aGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/selectors/ModelBasedSelectorSpec.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModelBasedSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n\n\n\n\nlet ModelBasedSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ModelBasedSelectorSpec, _SelectorSpec);\n\n function ModelBasedSelectorSpec({\n model,\n ...other\n }) {\n var _this;\n\n _this = _SelectorSpec.call(this, other) || this;\n _this._model = model;\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ModelBasedSelectorSpec, [{\n key: \"resultFunc\",\n get: function () {\n return (session, idArg, ...other) => {\n const {\n [this._model.modelName]: ModelClass\n } = session;\n\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toModelArray().map(instance => this.valueForInstance(instance, session, ...other));\n }\n\n if (Array.isArray(idArg)) {\n return idArg.map(id => this.valueForInstance(ModelClass.withId(id), session, ...other));\n }\n\n return this.valueForInstance(ModelClass.withId(idArg), session, ...other);\n };\n }\n }, {\n key: \"model\",\n get: function () {\n return this._model;\n }\n }]);\n\n return ModelBasedSelectorSpec;\n}(_SelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTW9kZWxCYXNlZFNlbGVjdG9yU3BlYy5qcz8wODc2Il0sIm5hbWVzIjpbIk1vZGVsQmFzZWRTZWxlY3RvclNwZWMiLCJtb2RlbCIsIm90aGVyIiwiX21vZGVsIiwic2Vzc2lvbiIsImlkQXJnIiwibW9kZWxOYW1lIiwiTW9kZWxDbGFzcyIsImFsbCIsInRvTW9kZWxBcnJheSIsIm1hcCIsImluc3RhbmNlIiwidmFsdWVGb3JJbnN0YW5jZSIsIkFycmF5IiwiaXNBcnJheSIsImlkIiwid2l0aElkIiwiU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7SUFFcUJBLHNCOzs7QUFDakIsa0NBQVk7QUFBRUMsU0FBRjtBQUFTLE9BQUdDO0FBQVosR0FBWixFQUFpQztBQUFBOztBQUM3QixxQ0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0YsS0FBZDtBQUY2QjtBQUdoQzs7OztTQUVELFlBQWlCO0FBQ2IsYUFBTyxDQUFDRyxPQUFELEVBQVVDLEtBQVYsRUFBaUIsR0FBR0gsS0FBcEIsS0FBOEI7QUFDakMsY0FBTTtBQUFFLFdBQUMsS0FBS0MsTUFBTCxDQUFZRyxTQUFiLEdBQXlCQztBQUEzQixZQUEwQ0gsT0FBaEQ7O0FBQ0EsWUFBSSxPQUFPQyxLQUFQLEtBQWlCLFdBQXJCLEVBQWtDO0FBQzlCLGlCQUFPRSxVQUFVLENBQUNDLEdBQVgsR0FDRkMsWUFERSxHQUVGQyxHQUZFLENBRUdDLFFBQUQsSUFDRCxLQUFLQyxnQkFBTCxDQUFzQkQsUUFBdEIsRUFBZ0NQLE9BQWhDLEVBQXlDLEdBQUdGLEtBQTVDLENBSEQsQ0FBUDtBQUtIOztBQUNELFlBQUlXLEtBQUssQ0FBQ0MsT0FBTixDQUFjVCxLQUFkLENBQUosRUFBMEI7QUFDdEIsaUJBQU9BLEtBQUssQ0FBQ0ssR0FBTixDQUFXSyxFQUFELElBQ2IsS0FBS0gsZ0JBQUwsQ0FDSUwsVUFBVSxDQUFDUyxNQUFYLENBQWtCRCxFQUFsQixDQURKLEVBRUlYLE9BRkosRUFHSSxHQUFHRixLQUhQLENBREcsQ0FBUDtBQU9IOztBQUNELGVBQU8sS0FBS1UsZ0JBQUwsQ0FDSEwsVUFBVSxDQUFDUyxNQUFYLENBQWtCWCxLQUFsQixDQURHLEVBRUhELE9BRkcsRUFHSCxHQUFHRixLQUhBLENBQVA7QUFLSCxPQXZCRDtBQXdCSDs7O1NBRUQsWUFBWTtBQUNSLGFBQU8sS0FBS0MsTUFBWjtBQUNIOzs7O0VBbkMrQ2MscUQiLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL01vZGVsQmFzZWRTZWxlY3RvclNwZWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VsZWN0b3JTcGVjIGZyb20gXCIuL1NlbGVjdG9yU3BlY1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RlbEJhc2VkU2VsZWN0b3JTcGVjIGV4dGVuZHMgU2VsZWN0b3JTcGVjIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1vZGVsLCAuLi5vdGhlciB9KSB7XG4gICAgICAgIHN1cGVyKG90aGVyKTtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICB9XG5cbiAgICBnZXQgcmVzdWx0RnVuYygpIHtcbiAgICAgICAgcmV0dXJuIChzZXNzaW9uLCBpZEFyZywgLi4ub3RoZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgW3RoaXMuX21vZGVsLm1vZGVsTmFtZV06IE1vZGVsQ2xhc3MgfSA9IHNlc3Npb247XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1vZGVsQ2xhc3MuYWxsKClcbiAgICAgICAgICAgICAgICAgICAgLnRvTW9kZWxBcnJheSgpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGluc3RhbmNlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZUZvckluc3RhbmNlKGluc3RhbmNlLCBzZXNzaW9uLCAuLi5vdGhlcilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkQXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZEFyZy5tYXAoKGlkKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlRm9ySW5zdGFuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBNb2RlbENsYXNzLndpdGhJZChpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3RoZXJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZUZvckluc3RhbmNlKFxuICAgICAgICAgICAgICAgIE1vZGVsQ2xhc3Mud2l0aElkKGlkQXJnKSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgICAgIC4uLm90aGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/selectors/ModelBasedSelectorSpec.js\n");
/***/ }),
@@ -4738,7 +4760,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModelSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n\n\n\n\n\nlet ModelSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ModelSelectorSpec, _SelectorSpec);\n\n function ModelSelectorSpec({\n model,\n ...other\n }) {\n var _this;\n\n _this = _SelectorSpec.call(this, other) || this;\n _this._model = model;\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ModelSelectorSpec, [{\n key: \"key\",\n get: function () {\n return this._model.modelName;\n }\n }, {\n key: \"dependencies\",\n get: function () {\n return [this._orm, _idArgSelector__WEBPACK_IMPORTED_MODULE_3__[\"default\"]];\n }\n }, {\n key: \"resultFunc\",\n get: function () {\n return ({\n [this._model.modelName]: ModelClass\n }, idArg) => {\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toRefArray();\n }\n\n if (Array.isArray(idArg)) {\n return idArg.map(id => {\n const instance = ModelClass.withId(id);\n return instance ? instance.ref : null;\n });\n }\n\n const instance = ModelClass.withId(idArg);\n return instance ? instance.ref : null;\n };\n }\n }, {\n key: \"model\",\n get: function () {\n return this._model;\n }\n }]);\n\n return ModelSelectorSpec;\n}(_SelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTW9kZWxTZWxlY3RvclNwZWMuanM/YWE1YiJdLCJuYW1lcyI6WyJNb2RlbFNlbGVjdG9yU3BlYyIsIm1vZGVsIiwib3RoZXIiLCJfbW9kZWwiLCJtb2RlbE5hbWUiLCJfb3JtIiwiaWRBcmdTZWxlY3RvciIsIk1vZGVsQ2xhc3MiLCJpZEFyZyIsImFsbCIsInRvUmVmQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpZCIsImluc3RhbmNlIiwid2l0aElkIiwicmVmIiwiU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTs7SUFFcUJBLGlCOzs7QUFDakIsNkJBQVk7QUFBRUMsU0FBRjtBQUFTLE9BQUdDO0FBQVosR0FBWixFQUFpQztBQUFBOztBQUM3QixxQ0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0YsS0FBZDtBQUY2QjtBQUdoQzs7OztxQkFFUztBQUNOLGFBQU8sS0FBS0UsTUFBTCxDQUFZQyxTQUFuQjtBQUNIOzs7cUJBRWtCO0FBQ2YsYUFBTyxDQUFDLEtBQUtDLElBQU4sRUFBWUMsc0RBQVosQ0FBUDtBQUNIOzs7cUJBRWdCO0FBQ2IsYUFBTyxDQUFDO0FBQUUsU0FBQyxLQUFLSCxNQUFMLENBQVlDLFNBQWIsR0FBeUJHO0FBQTNCLE9BQUQsRUFBMENDLEtBQTFDLEtBQW9EO0FBQ3ZELFlBQUksT0FBT0EsS0FBUCxLQUFpQixXQUFyQixFQUFrQztBQUM5QixpQkFBT0QsVUFBVSxDQUFDRSxHQUFYLEdBQWlCQyxVQUFqQixFQUFQO0FBQ0g7O0FBQ0QsWUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNKLEtBQWQsQ0FBSixFQUEwQjtBQUN0QixpQkFBT0EsS0FBSyxDQUFDSyxHQUFOLENBQVVDLEVBQUUsSUFBSTtBQUNuQixrQkFBTUMsUUFBUSxHQUFHUixVQUFVLENBQUNTLE1BQVgsQ0FBa0JGLEVBQWxCLENBQWpCO0FBQ0EsbUJBQU9DLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxHQUFaLEdBQWtCLElBQWpDO0FBQ0gsV0FITSxDQUFQO0FBSUg7O0FBQ0QsY0FBTUYsUUFBUSxHQUFHUixVQUFVLENBQUNTLE1BQVgsQ0FBa0JSLEtBQWxCLENBQWpCO0FBQ0EsZUFBT08sUUFBUSxHQUFHQSxRQUFRLENBQUNFLEdBQVosR0FBa0IsSUFBakM7QUFDSCxPQVpEO0FBYUg7OztxQkFFVztBQUNSLGFBQU8sS0FBS2QsTUFBWjtBQUNIOzs7O0VBaEMwQ2UscUQiLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL01vZGVsU2VsZWN0b3JTcGVjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlbGVjdG9yU3BlYyBmcm9tIFwiLi9TZWxlY3RvclNwZWNcIjtcbmltcG9ydCBpZEFyZ1NlbGVjdG9yIGZyb20gXCIuL2lkQXJnU2VsZWN0b3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kZWxTZWxlY3RvclNwZWMgZXh0ZW5kcyBTZWxlY3RvclNwZWMge1xuICAgIGNvbnN0cnVjdG9yKHsgbW9kZWwsIC4uLm90aGVyIH0pIHtcbiAgICAgICAgc3VwZXIob3RoZXIpO1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICAgIH1cblxuICAgIGdldCBrZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbC5tb2RlbE5hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGRlcGVuZGVuY2llcygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9vcm0sIGlkQXJnU2VsZWN0b3JdO1xuICAgIH1cblxuICAgIGdldCByZXN1bHRGdW5jKCkge1xuICAgICAgICByZXR1cm4gKHsgW3RoaXMuX21vZGVsLm1vZGVsTmFtZV06IE1vZGVsQ2xhc3MgfSwgaWRBcmcpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRBcmcgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTW9kZWxDbGFzcy5hbGwoKS50b1JlZkFycmF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZEFyZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWRBcmcubWFwKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBNb2RlbENsYXNzLndpdGhJZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSA/IGluc3RhbmNlLnJlZiA6IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IE1vZGVsQ2xhc3Mud2l0aElkKGlkQXJnKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSA/IGluc3RhbmNlLnJlZiA6IG51bGw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/selectors/ModelSelectorSpec.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return ModelSelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/inheritsLoose */ \"./node_modules/@babel/runtime/helpers/inheritsLoose.js\");\n/* harmony import */ var _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _SelectorSpec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./SelectorSpec */ \"./src/selectors/SelectorSpec.js\");\n/* harmony import */ var _idArgSelector__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./idArgSelector */ \"./src/selectors/idArgSelector.js\");\n\n\n\n\n\nlet ModelSelectorSpec = /*#__PURE__*/function (_SelectorSpec) {\n _babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_1___default()(ModelSelectorSpec, _SelectorSpec);\n\n function ModelSelectorSpec({\n model,\n ...other\n }) {\n var _this;\n\n _this = _SelectorSpec.call(this, other) || this;\n _this._model = model;\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(ModelSelectorSpec, [{\n key: \"key\",\n get: function () {\n return this._model.modelName;\n }\n }, {\n key: \"dependencies\",\n get: function () {\n return [this._orm, _idArgSelector__WEBPACK_IMPORTED_MODULE_3__[\"default\"]];\n }\n }, {\n key: \"resultFunc\",\n get: function () {\n return ({\n [this._model.modelName]: ModelClass\n }, idArg) => {\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toRefArray();\n }\n\n if (Array.isArray(idArg)) {\n return idArg.map(id => {\n const instance = ModelClass.withId(id);\n return instance ? instance.ref : null;\n });\n }\n\n const instance = ModelClass.withId(idArg);\n return instance ? instance.ref : null;\n };\n }\n }, {\n key: \"model\",\n get: function () {\n return this._model;\n }\n }]);\n\n return ModelSelectorSpec;\n}(_SelectorSpec__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvTW9kZWxTZWxlY3RvclNwZWMuanM/YWE1YiJdLCJuYW1lcyI6WyJNb2RlbFNlbGVjdG9yU3BlYyIsIm1vZGVsIiwib3RoZXIiLCJfbW9kZWwiLCJtb2RlbE5hbWUiLCJfb3JtIiwiaWRBcmdTZWxlY3RvciIsIk1vZGVsQ2xhc3MiLCJpZEFyZyIsImFsbCIsInRvUmVmQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpZCIsImluc3RhbmNlIiwid2l0aElkIiwicmVmIiwiU2VsZWN0b3JTcGVjIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTs7SUFFcUJBLGlCOzs7QUFDakIsNkJBQVk7QUFBRUMsU0FBRjtBQUFTLE9BQUdDO0FBQVosR0FBWixFQUFpQztBQUFBOztBQUM3QixxQ0FBTUEsS0FBTjtBQUNBLFVBQUtDLE1BQUwsR0FBY0YsS0FBZDtBQUY2QjtBQUdoQzs7OztTQUVELFlBQVU7QUFDTixhQUFPLEtBQUtFLE1BQUwsQ0FBWUMsU0FBbkI7QUFDSDs7O1NBRUQsWUFBbUI7QUFDZixhQUFPLENBQUMsS0FBS0MsSUFBTixFQUFZQyxzREFBWixDQUFQO0FBQ0g7OztTQUVELFlBQWlCO0FBQ2IsYUFBTyxDQUFDO0FBQUUsU0FBQyxLQUFLSCxNQUFMLENBQVlDLFNBQWIsR0FBeUJHO0FBQTNCLE9BQUQsRUFBMENDLEtBQTFDLEtBQW9EO0FBQ3ZELFlBQUksT0FBT0EsS0FBUCxLQUFpQixXQUFyQixFQUFrQztBQUM5QixpQkFBT0QsVUFBVSxDQUFDRSxHQUFYLEdBQWlCQyxVQUFqQixFQUFQO0FBQ0g7O0FBQ0QsWUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNKLEtBQWQsQ0FBSixFQUEwQjtBQUN0QixpQkFBT0EsS0FBSyxDQUFDSyxHQUFOLENBQVdDLEVBQUQsSUFBUTtBQUNyQixrQkFBTUMsUUFBUSxHQUFHUixVQUFVLENBQUNTLE1BQVgsQ0FBa0JGLEVBQWxCLENBQWpCO0FBQ0EsbUJBQU9DLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxHQUFaLEdBQWtCLElBQWpDO0FBQ0gsV0FITSxDQUFQO0FBSUg7O0FBQ0QsY0FBTUYsUUFBUSxHQUFHUixVQUFVLENBQUNTLE1BQVgsQ0FBa0JSLEtBQWxCLENBQWpCO0FBQ0EsZUFBT08sUUFBUSxHQUFHQSxRQUFRLENBQUNFLEdBQVosR0FBa0IsSUFBakM7QUFDSCxPQVpEO0FBYUg7OztTQUVELFlBQVk7QUFDUixhQUFPLEtBQUtkLE1BQVo7QUFDSDs7OztFQWhDMENlLHFEIiwiZmlsZSI6Ii4vc3JjL3NlbGVjdG9ycy9Nb2RlbFNlbGVjdG9yU3BlYy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTZWxlY3RvclNwZWMgZnJvbSBcIi4vU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgaWRBcmdTZWxlY3RvciBmcm9tIFwiLi9pZEFyZ1NlbGVjdG9yXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGVsU2VsZWN0b3JTcGVjIGV4dGVuZHMgU2VsZWN0b3JTcGVjIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1vZGVsLCAuLi5vdGhlciB9KSB7XG4gICAgICAgIHN1cGVyKG90aGVyKTtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICB9XG5cbiAgICBnZXQga2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWwubW9kZWxOYW1lO1xuICAgIH1cblxuICAgIGdldCBkZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fb3JtLCBpZEFyZ1NlbGVjdG9yXTtcbiAgICB9XG5cbiAgICBnZXQgcmVzdWx0RnVuYygpIHtcbiAgICAgICAgcmV0dXJuICh7IFt0aGlzLl9tb2RlbC5tb2RlbE5hbWVdOiBNb2RlbENsYXNzIH0sIGlkQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1vZGVsQ2xhc3MuYWxsKCkudG9SZWZBcnJheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWRBcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkQXJnLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBNb2RlbENsYXNzLndpdGhJZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSA/IGluc3RhbmNlLnJlZiA6IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IE1vZGVsQ2xhc3Mud2l0aElkKGlkQXJnKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSA/IGluc3RhbmNlLnJlZiA6IG51bGw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/selectors/ModelSelectorSpec.js\n");
/***/ }),
@@ -4750,7 +4772,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return SelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n\n\n\nlet SelectorSpec = /*#__PURE__*/function () {\n function SelectorSpec({\n parent,\n orm\n }) {\n this._parent = parent;\n this._orm = orm;\n this.keySelector = _constants__WEBPACK_IMPORTED_MODULE_1__[\"ID_ARG_KEY_SELECTOR\"];\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(SelectorSpec, [{\n key: \"cachePath\",\n get: function () {\n const basePath = this._parent ? this._parent.cachePath : [];\n return [...basePath, this.key];\n }\n }, {\n key: \"orm\",\n get: function () {\n return this._orm;\n }\n }, {\n key: \"parent\",\n get: function () {\n return this._parent;\n }\n }]);\n\n return SelectorSpec;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvU2VsZWN0b3JTcGVjLmpzP2Q5MjUiXSwibmFtZXMiOlsiU2VsZWN0b3JTcGVjIiwicGFyZW50Iiwib3JtIiwiX3BhcmVudCIsIl9vcm0iLCJrZXlTZWxlY3RvciIsIklEX0FSR19LRVlfU0VMRUNUT1IiLCJiYXNlUGF0aCIsImNhY2hlUGF0aCIsImtleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0lBRXFCQSxZO0FBQ2pCLHdCQUFZO0FBQUVDLFVBQUY7QUFBVUM7QUFBVixHQUFaLEVBQTZCO0FBQ3pCLFNBQUtDLE9BQUwsR0FBZUYsTUFBZjtBQUNBLFNBQUtHLElBQUwsR0FBWUYsR0FBWjtBQUNBLFNBQUtHLFdBQUwsR0FBbUJDLDhEQUFuQjtBQUNIOzs7O3FCQUVlO0FBQ1osWUFBTUMsUUFBUSxHQUFHLEtBQUtKLE9BQUwsR0FBZSxLQUFLQSxPQUFMLENBQWFLLFNBQTVCLEdBQXdDLEVBQXpEO0FBQ0EsYUFBTyxDQUFDLEdBQUdELFFBQUosRUFBYyxLQUFLRSxHQUFuQixDQUFQO0FBQ0g7OztxQkFFUztBQUNOLGFBQU8sS0FBS0wsSUFBWjtBQUNIOzs7cUJBRVk7QUFDVCxhQUFPLEtBQUtELE9BQVo7QUFDSCIsImZpbGUiOiIuL3NyYy9zZWxlY3RvcnMvU2VsZWN0b3JTcGVjLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURfQVJHX0tFWV9TRUxFQ1RPUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0b3JTcGVjIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHBhcmVudCwgb3JtIH0pIHtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLl9vcm0gPSBvcm07XG4gICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBJRF9BUkdfS0VZX1NFTEVDVE9SO1xuICAgIH1cblxuICAgIGdldCBjYWNoZVBhdGgoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmNhY2hlUGF0aCA6IFtdO1xuICAgICAgICByZXR1cm4gWy4uLmJhc2VQYXRoLCB0aGlzLmtleV07XG4gICAgfVxuXG4gICAgZ2V0IG9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29ybTtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICAgIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/selectors/SelectorSpec.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return SelectorSpec; });\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"./src/constants.js\");\n\n\n\nlet SelectorSpec = /*#__PURE__*/function () {\n function SelectorSpec({\n parent,\n orm\n }) {\n this._parent = parent;\n this._orm = orm;\n this.keySelector = _constants__WEBPACK_IMPORTED_MODULE_1__[\"ID_ARG_KEY_SELECTOR\"];\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_0___default()(SelectorSpec, [{\n key: \"cachePath\",\n get: function () {\n const basePath = this._parent ? this._parent.cachePath : [];\n return [...basePath, this.key];\n }\n }, {\n key: \"orm\",\n get: function () {\n return this._orm;\n }\n }, {\n key: \"parent\",\n get: function () {\n return this._parent;\n }\n }]);\n\n return SelectorSpec;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvU2VsZWN0b3JTcGVjLmpzP2Q5MjUiXSwibmFtZXMiOlsiU2VsZWN0b3JTcGVjIiwicGFyZW50Iiwib3JtIiwiX3BhcmVudCIsIl9vcm0iLCJrZXlTZWxlY3RvciIsIklEX0FSR19LRVlfU0VMRUNUT1IiLCJiYXNlUGF0aCIsImNhY2hlUGF0aCIsImtleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0lBRXFCQSxZO0FBQ2pCLHdCQUFZO0FBQUVDLFVBQUY7QUFBVUM7QUFBVixHQUFaLEVBQTZCO0FBQ3pCLFNBQUtDLE9BQUwsR0FBZUYsTUFBZjtBQUNBLFNBQUtHLElBQUwsR0FBWUYsR0FBWjtBQUNBLFNBQUtHLFdBQUwsR0FBbUJDLDhEQUFuQjtBQUNIOzs7O1NBRUQsWUFBZ0I7QUFDWixZQUFNQyxRQUFRLEdBQUcsS0FBS0osT0FBTCxHQUFlLEtBQUtBLE9BQUwsQ0FBYUssU0FBNUIsR0FBd0MsRUFBekQ7QUFDQSxhQUFPLENBQUMsR0FBR0QsUUFBSixFQUFjLEtBQUtFLEdBQW5CLENBQVA7QUFDSDs7O1NBRUQsWUFBVTtBQUNOLGFBQU8sS0FBS0wsSUFBWjtBQUNIOzs7U0FFRCxZQUFhO0FBQ1QsYUFBTyxLQUFLRCxPQUFaO0FBQ0giLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL1NlbGVjdG9yU3BlYy5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEX0FSR19LRVlfU0VMRUNUT1IgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdG9yU3BlYyB7XG4gICAgY29uc3RydWN0b3IoeyBwYXJlbnQsIG9ybSB9KSB7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fb3JtID0gb3JtO1xuICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0gSURfQVJHX0tFWV9TRUxFQ1RPUjtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGVQYXRoKCkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5jYWNoZVBhdGggOiBbXTtcbiAgICAgICAgcmV0dXJuIFsuLi5iYXNlUGF0aCwgdGhpcy5rZXldO1xuICAgIH1cblxuICAgIGdldCBvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcm07XG4gICAgfVxuXG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/selectors/SelectorSpec.js\n");
/***/ }),
@@ -4774,7 +4796,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createFieldSelectorSpec\", function() { return createFieldSelectorSpec; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createModelSelectorSpec\", function() { return createModelSelectorSpec; });\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _fields_RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../fields/RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FieldSelectorSpec */ \"./src/selectors/FieldSelectorSpec.js\");\n/* harmony import */ var _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ModelSelectorSpec */ \"./src/selectors/ModelSelectorSpec.js\");\n\n\n\n\n\n/**\n * @module selectors\n * @private\n */\n\nfunction createFieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual\n}) {\n const fieldSelectorSpec = new _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual\n });\n /* Do not even try to create field selectors below attributes. */\n\n if (!(field instanceof _fields_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"])) {\n // \"orm.Author.name.publisher\" would be nonsense\n return fieldSelectorSpec;\n }\n /* Prevent field selectors below collections. */\n\n\n if (parent instanceof _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n /* eslint-disable no-underscore-dangle */\n if ( // \"orm.Author.books.publisher\" would be nonsense\n parent._field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_0__[\"default\"] && parent._isVirtual || // \"orm.Genre.books.publisher\" would be nonsense\n parent._field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_1__[\"default\"]) {\n throw new Error(`Cannot create a selector for \\`${parent._accessorName}.${accessorName}\\` because \\`${parent._accessorName}\\` is a collection field.`);\n }\n }\n\n const {\n toModelName\n } = field;\n const toModel = orm.get(toModelName === \"this\" ? model.modelName : toModelName);\n Object.entries(toModel.fields).forEach(([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false\n })\n });\n });\n Object.entries(toModel.virtualFields).forEach(([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n\n if (fieldSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true\n })\n });\n });\n return fieldSelectorSpec;\n}\nfunction createModelSelectorSpec({\n model,\n orm\n}) {\n const modelSelectorSpec = new _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n parent: null,\n orm,\n model\n });\n Object.entries(model.fields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false\n })\n });\n });\n Object.entries(model.virtualFields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n\n if (modelSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true\n })\n });\n });\n return modelSelectorSpec;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvaW5kZXguanM/YTA3NiJdLCJuYW1lcyI6WyJjcmVhdGVGaWVsZFNlbGVjdG9yU3BlYyIsInBhcmVudCIsIm1vZGVsIiwiZmllbGQiLCJmaWVsZE1vZGVsIiwiYWNjZXNzb3JOYW1lIiwib3JtIiwiaXNWaXJ0dWFsIiwiZmllbGRTZWxlY3RvclNwZWMiLCJGaWVsZFNlbGVjdG9yU3BlYyIsIlJlbGF0aW9uYWxGaWVsZCIsIl9maWVsZCIsIkZvcmVpZ25LZXkiLCJfaXNWaXJ0dWFsIiwiTWFueVRvTWFueSIsIkVycm9yIiwiX2FjY2Vzc29yTmFtZSIsInRvTW9kZWxOYW1lIiwidG9Nb2RlbCIsImdldCIsIm1vZGVsTmFtZSIsIk9iamVjdCIsImVudHJpZXMiLCJmaWVsZHMiLCJmb3JFYWNoIiwicmVsYXRlZEZpZWxkTmFtZSIsInJlbGF0ZWRGaWVsZCIsImZpZWxkQWNjZXNzb3JOYW1lIiwiYXMiLCJkZWZpbmVQcm9wZXJ0eSIsInZpcnR1YWxGaWVsZHMiLCJoYXNPd25Qcm9wZXJ0eSIsImNyZWF0ZU1vZGVsU2VsZWN0b3JTcGVjIiwibW9kZWxTZWxlY3RvclNwZWMiLCJNb2RlbFNlbGVjdG9yU3BlYyIsImZpZWxkTmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7QUFLTyxTQUFTQSx1QkFBVCxDQUFpQztBQUNwQ0MsUUFEb0M7QUFFcENDLE9BRm9DO0FBR3BDQyxPQUhvQztBQUlwQ0MsWUFKb0M7QUFLcENDLGNBTG9DO0FBTXBDQyxLQU5vQztBQU9wQ0M7QUFQb0MsQ0FBakMsRUFRSjtBQUNDLFFBQU1DLGlCQUFpQixHQUFHLElBQUlDLDBEQUFKLENBQXNCO0FBQzVDUixVQUQ0QztBQUU1Q0MsU0FGNEM7QUFHNUNDLFNBSDRDO0FBSTVDQyxjQUo0QztBQUs1Q0MsZ0JBTDRDO0FB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dEM7QUFDQWQsVUFBTSxDQUFDUSxjQUFQLENBQXNCSSxpQkFBdEIsRUFBeUNOLGlCQUF6QyxFQUE0RDtBQUN4RFIsU0FBRyxFQUFFLE1BQ0RuQix1QkFBdUIsQ0FBQztBQUNwQkMsY0FBTSxFQUFFZ0MsaUJBRFk7QUFFcEIvQixhQUZvQjtBQUdwQkUsa0JBQVUsRUFBRUYsS0FIUTtBQUlwQkMsYUFKb0I7QUFLcEJFLG9CQUFZLEVBQUVzQixpQkFMTTtBQU1wQnJCLFdBTm9CO0FBT3BCQyxpQkFBUyxFQUFFO0FBUFMsT0FBRDtBQUY2QixLQUE1RDtBQVlILEdBZEQ7QUFnQkFjLFFBQU0sQ0FBQ0MsT0FBUCxDQUFlcEIsS0FBSyxDQUFDNEIsYUFBckIsRUFBb0NOLE9BQXBDLENBQTRDLENBQUMsQ0FBQ1csU0FBRCxFQUFZaEMsS0FBWixDQUFELEtBQXdCO0FBQ2hFLFVBQU13QixpQkFBaUIsR0FBR3hCLEtBQUssQ0FBQ3lCLEVBQU4sSUFBWU8sU0FBdEM7O0FBQ0EsUUFBSUYsaUJBQWlCLENBQUNGLGNBQWxCLENBQWlDSixpQkFBakMsQ0FBSixFQUF5RDtBQUNyRDtBQUNIOztBQUNETixVQUFNLENBQUNRLGNBQVAsQ0FBc0JJLGlCQUF0QixFQUF5Q04saUJBQXpDLEVBQTREO0FBQ3hEUixTQUFHLEVBQUUsTUFDRG5CLHVCQUF1QixDQUFDO0FBQ3BCQyxjQUFNLEVBQUVnQyxpQkFEWTtBQUVwQi9CLGFBRm9CO0FBR3BCRSxrQkFBVSxFQUFFRixLQUhRO0FBSXBCQyxhQUpvQjtBQUtwQkUsb0JBQVksRUFBRXNCLGlCQUxNO0FBTXBCckIsV0FOb0I7QUFPcEJDLGlCQUFTLEVBQUU7QUFQUyxPQUFEO0FBRjZCLEtBQTVEO0FBWUgsR0FqQkQ7QUFtQkEsU0FBTzBCLGlCQUFQO0FBQ0giLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZvcmVpZ25LZXkgZnJvbSBcIi4uL2ZpZWxkcy9Gb3JlaWduS2V5XCI7XG5pbXBvcnQgTWFueVRvTWFueSBmcm9tIFwiLi4vZmllbGRzL01hbnlUb01hbnlcIjtcbmltcG9ydCBSZWxhdGlvbmFsRmllbGQgZnJvbSBcIi4uL2ZpZWxkcy9SZWxhdGlvbmFsRmllbGRcIjtcblxuaW1wb3J0IEZpZWxkU2VsZWN0b3JTcGVjIGZyb20gXCIuL0ZpZWxkU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgTW9kZWxTZWxlY3RvclNwZWMgZnJvbSBcIi4vTW9kZWxTZWxlY3RvclNwZWNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHNlbGVjdG9yc1xuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgIHBhcmVudCxcbiAgICBtb2RlbCxcbiAgICBmaWVsZCxcbiAgICBmaWVsZE1vZGVsLFxuICAgIGFjY2Vzc29yTmFtZSxcbiAgICBvcm0sXG4gICAgaXNWaXJ0dWFsLFxufSkge1xuICAgIGNvbnN0IGZpZWxkU2VsZWN0b3JTcGVjID0gbmV3IEZpZWxkU2VsZWN0b3JTcGVjKHtcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZpZWxkTW9kZWwsXG4gICAgICAgIGFjY2Vzc29yTmFtZSxcbiAgICAgICAgb3JtLFxuICAgICAgICBpc1ZpcnR1YWwsXG4gICAgfSk7XG4gICAgLyogRG8gbm90IGV2ZW4gdHJ5IHRvIGNyZWF0ZSBmaWVsZCBzZWxlY3RvcnMgYmVsb3cgYXR0cmlidXRlcy4gKi9cbiAgICBpZiAoIShmaWVsZCBpbnN0YW5jZW9mIFJlbGF0aW9uYWxGaWVsZCkpIHtcbiAgICAgICAgLy8gXCJvcm0uQXV0aG9yLm5hbWUucHVibGlzaGVyXCIgd291bGQgYmUgbm9uc2Vuc2VcbiAgICAgICAgcmV0dXJuIGZpZWxkU2VsZWN0b3JTcGVjO1xuICAgIH1cbiAgICAvKiBQcmV2ZW50IGZpZWxkIHNlbGVjdG9ycyBiZWxvdyBjb2xsZWN0aW9ucy4gKi9cbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRmllbGRTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gXCJvcm0uQXV0aG9yLmJvb2tzLnB1Ymxpc2hlclwiIHdvdWxkIGJlIG5vbnNlbnNlXG4gICAgICAgICAgICAocGFyZW50Ll9maWVsZCBpbnN0YW5jZW9mIEZvcmVpZ25LZXkgJiYgcGFyZW50Ll9pc1ZpcnR1YWwpIHx8XG4gICAgICAgICAgICAvLyBcIm9ybS5HZW5yZS5ib29rcy5wdWJsaXNoZXJcIiB3b3VsZCBiZSBub25zZW5zZVxuICAgICAgICAgICAgcGFyZW50Ll9maWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgYSBzZWxlY3RvciBmb3IgXFxgJHtwYXJlbnQuX2FjY2Vzc29yTmFtZX0uJHthY2Nlc3Nvck5hbWV9XFxgIGJlY2F1c2UgXFxgJHtwYXJlbnQuX2FjY2Vzc29yTmFtZX1cXGAgaXMgYSBjb2xsZWN0aW9uIGZpZWxkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyB0b01vZGVsTmFtZSB9ID0gZmllbGQ7XG4gICAgY29uc3QgdG9Nb2RlbCA9IG9ybS5nZXQoXG4gICAgICAgIHRvTW9kZWxOYW1lID09PSBcInRoaXNcIiA/IG1vZGVsLm1vZGVsTmFtZSA6IHRvTW9kZWxOYW1lXG4gICAgKTtcbiAgICBPYmplY3QuZW50cmllcyh0b01vZGVsLmZpZWxkcykuZm9yRWFjaChcbiAgICAgICAgKFtyZWxhdGVkRmllbGROYW1lLCByZWxhdGVkRmllbGRdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEFjY2Vzc29yTmFtZSA9IHJlbGF0ZWRGaWVsZC5hcyB8fCByZWxhdGVkRmllbGROYW1lO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkU2VsZWN0b3JTcGVjLCBmaWVsZEFjY2Vzc29yTmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBmaWVsZFNlbGVjdG9yU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogdG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWxhdGVkRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICk7XG4gICAgT2JqZWN0LmVudHJpZXModG9Nb2RlbC52aXJ0dWFsRmllbGRzKS5mb3JFYWNoKFxuICAgICAgICAoW3JlbGF0ZWRGaWVsZE5hbWUsIHJlbGF0ZWRGaWVsZF0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkQWNjZXNzb3JOYW1lID0gcmVsYXRlZEZpZWxkLmFzIHx8IHJlbGF0ZWRGaWVsZE5hbWU7XG4gICAgICAgICAgICBpZiAoZmllbGRTZWxlY3RvclNwZWMuaGFzT3duUHJvcGVydHkoZmllbGRBY2Nlc3Nvck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkU2VsZWN0b3JTcGVjLCBmaWVsZEFjY2Vzc29yTmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBmaWVsZFNlbGVjdG9yU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogdG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWxhdGVkRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gZmllbGRTZWxlY3RvclNwZWM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFNlbGVjdG9yU3BlYyh7IG1vZGVsLCBvcm0gfSkge1xuICAgIGNvbnN0IG1vZGVsU2VsZWN0b3JTcGVjID0gbmV3IE1vZGVsU2VsZWN0b3JTcGVjKHtcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICBvcm0sXG4gICAgICAgIG1vZGVsLFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMobW9kZWwuZmllbGRzKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRBY2Nlc3Nvck5hbWUgPSBmaWVsZC5hcyB8fCBmaWVsZE5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbFNlbGVjdG9yU3BlYywgZmllbGRBY2Nlc3Nvck5hbWUsIHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFNlbGVjdG9yU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbW9kZWxTZWxlY3RvclNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZE1vZGVsOiBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yTmFtZTogZmllbGRBY2Nlc3Nvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG9ybSxcbiAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhtb2RlbC52aXJ0dWFsRmllbGRzKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRBY2Nlc3Nvck5hbWUgPSBmaWVsZC5hcyB8fCBmaWVsZE5hbWU7XG4gICAgICAgIGlmIChtb2RlbFNlbGVjdG9yU3BlYy5oYXNPd25Qcm9wZXJ0eShmaWVsZEFjY2Vzc29yTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWxTZWxlY3RvclNwZWMsIGZpZWxkQWNjZXNzb3JOYW1lLCB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+XG4gICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG1vZGVsU2VsZWN0b3JTcGVjLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcm0sXG4gICAgICAgICAgICAgICAgICAgIGlzVmlydHVhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW9kZWxTZWxlY3RvclNwZWM7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/selectors/index.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createFieldSelectorSpec\", function() { return createFieldSelectorSpec; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createModelSelectorSpec\", function() { return createModelSelectorSpec; });\n/* harmony import */ var _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../fields/ForeignKey */ \"./src/fields/ForeignKey.js\");\n/* harmony import */ var _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../fields/ManyToMany */ \"./src/fields/ManyToMany.js\");\n/* harmony import */ var _fields_RelationalField__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../fields/RelationalField */ \"./src/fields/RelationalField.js\");\n/* harmony import */ var _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FieldSelectorSpec */ \"./src/selectors/FieldSelectorSpec.js\");\n/* harmony import */ var _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ModelSelectorSpec */ \"./src/selectors/ModelSelectorSpec.js\");\n\n\n\n\n\n/**\n * @module selectors\n * @private\n */\n\nfunction createFieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual\n}) {\n const fieldSelectorSpec = new _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual\n });\n /* Do not even try to create field selectors below attributes. */\n\n if (!(field instanceof _fields_RelationalField__WEBPACK_IMPORTED_MODULE_2__[\"default\"])) {\n // \"orm.Author.name.publisher\" would be nonsense\n return fieldSelectorSpec;\n }\n /* Prevent field selectors below collections. */\n\n\n if (parent instanceof _FieldSelectorSpec__WEBPACK_IMPORTED_MODULE_3__[\"default\"]) {\n /* eslint-disable no-underscore-dangle */\n if ( // \"orm.Author.books.publisher\" would be nonsense\n parent._field instanceof _fields_ForeignKey__WEBPACK_IMPORTED_MODULE_0__[\"default\"] && parent._isVirtual || // \"orm.Genre.books.publisher\" would be nonsense\n parent._field instanceof _fields_ManyToMany__WEBPACK_IMPORTED_MODULE_1__[\"default\"]) {\n throw new Error(`Cannot create a selector for \\`${parent._accessorName}.${accessorName}\\` because \\`${parent._accessorName}\\` is a collection field.`);\n }\n }\n\n const {\n toModelName\n } = field;\n const toModel = orm.get(toModelName === \"this\" ? model.modelName : toModelName);\n Object.entries(toModel.fields).forEach(([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false\n })\n });\n });\n Object.entries(toModel.virtualFields).forEach(([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n\n if (fieldSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true\n })\n });\n });\n return fieldSelectorSpec;\n}\nfunction createModelSelectorSpec({\n model,\n orm\n}) {\n const modelSelectorSpec = new _ModelSelectorSpec__WEBPACK_IMPORTED_MODULE_4__[\"default\"]({\n parent: null,\n orm,\n model\n });\n Object.entries(model.fields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false\n })\n });\n });\n Object.entries(model.virtualFields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n\n if (modelSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () => createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true\n })\n });\n });\n return modelSelectorSpec;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy9zZWxlY3RvcnMvaW5kZXguanM/YTA3NiJdLCJuYW1lcyI6WyJjcmVhdGVGaWVsZFNlbGVjdG9yU3BlYyIsInBhcmVudCIsIm1vZGVsIiwiZmllbGQiLCJmaWVsZE1vZGVsIiwiYWNjZXNzb3JOYW1lIiwib3JtIiwiaXNWaXJ0dWFsIiwiZmllbGRTZWxlY3RvclNwZWMiLCJGaWVsZFNlbGVjdG9yU3BlYyIsIlJlbGF0aW9uYWxGaWVsZCIsIl9maWVsZCIsIkZvcmVpZ25LZXkiLCJfaXNWaXJ0dWFsIiwiTWFueVRvTWFueSIsIkVycm9yIiwiX2FjY2Vzc29yTmFtZSIsInRvTW9kZWxOYW1lIiwidG9Nb2RlbCIsImdldCIsIm1vZGVsTmFtZSIsIk9iamVjdCIsImVudHJpZXMiLCJmaWVsZHMiLCJmb3JFYWNoIiwicmVsYXRlZEZpZWxkTmFtZSIsInJlbGF0ZWRGaWVsZCIsImZpZWxkQWNjZXNzb3JOYW1lIiwiYXMiLCJkZWZpbmVQcm9wZXJ0eSIsInZpcnR1YWxGaWVsZHMiLCJoYXNPd25Qcm9wZXJ0eSIsImNyZWF0ZU1vZGVsU2VsZWN0b3JTcGVjIiwibW9kZWxTZWxlY3RvclNwZWMiLCJNb2RlbFNlbGVjdG9yU3BlYyIsImZpZWxkTmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxTQUFTQSx1QkFBVCxDQUFpQztBQUNwQ0MsUUFEb0M7QUFFcENDLE9BRm9DO0FBR3BDQyxPQUhvQztBQUlwQ0MsWUFKb0M7QUFLcENDLGNBTG9DO0FBTXBDQyxLQU5vQztBQU9wQ0M7QUFQb0MsQ0FBakMsRUFRSjtBQUNDLFFBQU1DLGlCQUFpQixHQUFHLElBQUlDLDBEQUFKLENBQXNCO0FBQzVDUixVQUQ0QztBQUU1Q0MsU0FGNEM7QUFHNUNDLFNBSDRDO0FBSTVDQyxjQUo0QztBQUs1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QU4sSUFBWU8sU0FBdEM7QUFDQWQsVUFBTSxDQUFDUSxjQUFQLENBQXNCSSxpQkFBdEIsRUFBeUNOLGlCQUF6QyxFQUE0RDtBQUN4RFIsU0FBRyxFQUFFLE1BQ0RuQix1QkFBdUIsQ0FBQztBQUNwQkMsY0FBTSxFQUFFZ0MsaUJBRFk7QUFFcEIvQixhQUZvQjtBQUdwQkUsa0JBQVUsRUFBRUYsS0FIUTtBQUlwQkMsYUFKb0I7QUFLcEJFLG9CQUFZLEVBQUVzQixpQkFMTTtBQU1wQnJCLFdBTm9CO0FBT3BCQyxpQkFBUyxFQUFFO0FBUFMsT0FBRDtBQUY2QixLQUE1RDtBQVlILEdBZEQ7QUFnQkFjLFFBQU0sQ0FBQ0MsT0FBUCxDQUFlcEIsS0FBSyxDQUFDNEIsYUFBckIsRUFBb0NOLE9BQXBDLENBQTRDLENBQUMsQ0FBQ1csU0FBRCxFQUFZaEMsS0FBWixDQUFELEtBQXdCO0FBQ2hFLFVBQU13QixpQkFBaUIsR0FBR3hCLEtBQUssQ0FBQ3lCLEVBQU4sSUFBWU8sU0FBdEM7O0FBQ0EsUUFBSUYsaUJBQWlCLENBQUNGLGNBQWxCLENBQWlDSixpQkFBakMsQ0FBSixFQUF5RDtBQUNyRDtBQUNIOztBQUNETixVQUFNLENBQUNRLGNBQVAsQ0FBc0JJLGlCQUF0QixFQUF5Q04saUJBQXpDLEVBQTREO0FBQ3hEUixTQUFHLEVBQUUsTUFDRG5CLHVCQUF1QixDQUFDO0FBQ3BCQyxjQUFNLEVBQUVnQyxpQkFEWTtBQUVwQi9CLGFBRm9CO0FBR3BCRSxrQkFBVSxFQUFFRixLQUhRO0FBSXBCQyxhQUpvQjtBQUtwQkUsb0JBQVksRUFBRXNCLGlCQUxNO0FBTXBCckIsV0FOb0I7QUFPcEJDLGlCQUFTLEVBQUU7QUFQUyxPQUFEO0FBRjZCLEtBQTVEO0FBWUgsR0FqQkQ7QUFtQkEsU0FBTzBCLGlCQUFQO0FBQ0giLCJmaWxlIjoiLi9zcmMvc2VsZWN0b3JzL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZvcmVpZ25LZXkgZnJvbSBcIi4uL2ZpZWxkcy9Gb3JlaWduS2V5XCI7XG5pbXBvcnQgTWFueVRvTWFueSBmcm9tIFwiLi4vZmllbGRzL01hbnlUb01hbnlcIjtcbmltcG9ydCBSZWxhdGlvbmFsRmllbGQgZnJvbSBcIi4uL2ZpZWxkcy9SZWxhdGlvbmFsRmllbGRcIjtcblxuaW1wb3J0IEZpZWxkU2VsZWN0b3JTcGVjIGZyb20gXCIuL0ZpZWxkU2VsZWN0b3JTcGVjXCI7XG5pbXBvcnQgTW9kZWxTZWxlY3RvclNwZWMgZnJvbSBcIi4vTW9kZWxTZWxlY3RvclNwZWNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHNlbGVjdG9yc1xuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgIHBhcmVudCxcbiAgICBtb2RlbCxcbiAgICBmaWVsZCxcbiAgICBmaWVsZE1vZGVsLFxuICAgIGFjY2Vzc29yTmFtZSxcbiAgICBvcm0sXG4gICAgaXNWaXJ0dWFsLFxufSkge1xuICAgIGNvbnN0IGZpZWxkU2VsZWN0b3JTcGVjID0gbmV3IEZpZWxkU2VsZWN0b3JTcGVjKHtcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZpZWxkTW9kZWwsXG4gICAgICAgIGFjY2Vzc29yTmFtZSxcbiAgICAgICAgb3JtLFxuICAgICAgICBpc1ZpcnR1YWwsXG4gICAgfSk7XG4gICAgLyogRG8gbm90IGV2ZW4gdHJ5IHRvIGNyZWF0ZSBmaWVsZCBzZWxlY3RvcnMgYmVsb3cgYXR0cmlidXRlcy4gKi9cbiAgICBpZiAoIShmaWVsZCBpbnN0YW5jZW9mIFJlbGF0aW9uYWxGaWVsZCkpIHtcbiAgICAgICAgLy8gXCJvcm0uQXV0aG9yLm5hbWUucHVibGlzaGVyXCIgd291bGQgYmUgbm9uc2Vuc2VcbiAgICAgICAgcmV0dXJuIGZpZWxkU2VsZWN0b3JTcGVjO1xuICAgIH1cbiAgICAvKiBQcmV2ZW50IGZpZWxkIHNlbGVjdG9ycyBiZWxvdyBjb2xsZWN0aW9ucy4gKi9cbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRmllbGRTZWxlY3RvclNwZWMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gXCJvcm0uQXV0aG9yLmJvb2tzLnB1Ymxpc2hlclwiIHdvdWxkIGJlIG5vbnNlbnNlXG4gICAgICAgICAgICAocGFyZW50Ll9maWVsZCBpbnN0YW5jZW9mIEZvcmVpZ25LZXkgJiYgcGFyZW50Ll9pc1ZpcnR1YWwpIHx8XG4gICAgICAgICAgICAvLyBcIm9ybS5HZW5yZS5ib29rcy5wdWJsaXNoZXJcIiB3b3VsZCBiZSBub25zZW5zZVxuICAgICAgICAgICAgcGFyZW50Ll9maWVsZCBpbnN0YW5jZW9mIE1hbnlUb01hbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgYSBzZWxlY3RvciBmb3IgXFxgJHtwYXJlbnQuX2FjY2Vzc29yTmFtZX0uJHthY2Nlc3Nvck5hbWV9XFxgIGJlY2F1c2UgXFxgJHtwYXJlbnQuX2FjY2Vzc29yTmFtZX1cXGAgaXMgYSBjb2xsZWN0aW9uIGZpZWxkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeyB0b01vZGVsTmFtZSB9ID0gZmllbGQ7XG4gICAgY29uc3QgdG9Nb2RlbCA9IG9ybS5nZXQoXG4gICAgICAgIHRvTW9kZWxOYW1lID09PSBcInRoaXNcIiA/IG1vZGVsLm1vZGVsTmFtZSA6IHRvTW9kZWxOYW1lXG4gICAgKTtcbiAgICBPYmplY3QuZW50cmllcyh0b01vZGVsLmZpZWxkcykuZm9yRWFjaChcbiAgICAgICAgKFtyZWxhdGVkRmllbGROYW1lLCByZWxhdGVkRmllbGRdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEFjY2Vzc29yTmFtZSA9IHJlbGF0ZWRGaWVsZC5hcyB8fCByZWxhdGVkRmllbGROYW1lO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkU2VsZWN0b3JTcGVjLCBmaWVsZEFjY2Vzc29yTmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBmaWVsZFNlbGVjdG9yU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogdG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWxhdGVkRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICk7XG4gICAgT2JqZWN0LmVudHJpZXModG9Nb2RlbC52aXJ0dWFsRmllbGRzKS5mb3JFYWNoKFxuICAgICAgICAoW3JlbGF0ZWRGaWVsZE5hbWUsIHJlbGF0ZWRGaWVsZF0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkQWNjZXNzb3JOYW1lID0gcmVsYXRlZEZpZWxkLmFzIHx8IHJlbGF0ZWRGaWVsZE5hbWU7XG4gICAgICAgICAgICBpZiAoZmllbGRTZWxlY3RvclNwZWMuaGFzT3duUHJvcGVydHkoZmllbGRBY2Nlc3Nvck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZpZWxkU2VsZWN0b3JTcGVjLCBmaWVsZEFjY2Vzc29yTmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBmaWVsZFNlbGVjdG9yU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogdG9Nb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWxhdGVkRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gZmllbGRTZWxlY3RvclNwZWM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFNlbGVjdG9yU3BlYyh7IG1vZGVsLCBvcm0gfSkge1xuICAgIGNvbnN0IG1vZGVsU2VsZWN0b3JTcGVjID0gbmV3IE1vZGVsU2VsZWN0b3JTcGVjKHtcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICBvcm0sXG4gICAgICAgIG1vZGVsLFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMobW9kZWwuZmllbGRzKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRBY2Nlc3Nvck5hbWUgPSBmaWVsZC5hcyB8fCBmaWVsZE5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbFNlbGVjdG9yU3BlYywgZmllbGRBY2Nlc3Nvck5hbWUsIHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFNlbGVjdG9yU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbW9kZWxTZWxlY3RvclNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZE1vZGVsOiBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yTmFtZTogZmllbGRBY2Nlc3Nvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG9ybSxcbiAgICAgICAgICAgICAgICAgICAgaXNWaXJ0dWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhtb2RlbC52aXJ0dWFsRmllbGRzKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRBY2Nlc3Nvck5hbWUgPSBmaWVsZC5hcyB8fCBmaWVsZE5hbWU7XG4gICAgICAgIGlmIChtb2RlbFNlbGVjdG9yU3BlYy5oYXNPd25Qcm9wZXJ0eShmaWVsZEFjY2Vzc29yTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWxTZWxlY3RvclNwZWMsIGZpZWxkQWNjZXNzb3JOYW1lLCB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+XG4gICAgICAgICAgICAgICAgY3JlYXRlRmllbGRTZWxlY3RvclNwZWMoe1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG1vZGVsU2VsZWN0b3JTcGVjLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZmllbGRNb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWU6IGZpZWxkQWNjZXNzb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcm0sXG4gICAgICAgICAgICAgICAgICAgIGlzVmlydHVhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW9kZWxTZWxlY3RvclNwZWM7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/selectors/index.js\n");
/***/ }),
@@ -4786,7 +4808,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attachQuerySetMethods\", function() { return attachQuerySetMethods; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mName\", function() { return m2mName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mFromFieldName\", function() { return m2mFromFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mToFieldName\", function() { return m2mToFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reverseFieldName\", function() { return reverseFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"normalizeEntity\", function() { return normalizeEntity; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reverseFieldErrorMessage\", function() { return reverseFieldErrorMessage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objectShallowEquals\", function() { return objectShallowEquals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"arrayDiffActions\", function() { return arrayDiffActions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getBatchToken\", function() { return getBatchToken; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clauseFiltersByAttribute\", function() { return clauseFiltersByAttribute; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clauseReducesResultSetSize\", function() { return clauseReducesResultSetSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"warnDeprecated\", function() { return warnDeprecated; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapValues\", function() { return mapValues; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"normalizeModelReference\", function() { return normalizeModelReference; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ops\", function() { return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\n/**\n * @module utils\n * @private\n */\n\n/** @private */\n\nfunction warnDeprecated(msg) {\n const logger = typeof console.warn === \"function\" ? console.warn.bind(console) : console.log.bind(console);\n return logger(msg);\n}\n/** @private */\n\n\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n/**\n * Returns the branch name for a many-to-many relation.\n * The name is the combination of the model name and the field name the relation\n * was declared. The field name's first letter is capitalized.\n *\n * Example: model `Author` has a many-to-many relation to the model `Book`, defined\n * in the `Author` field `books`. The many-to-many branch name will be `AuthorBooks`.\n *\n * @param {string} declarationModelName - the name of the model the many-to-many relation was declared on\n * @param {string} fieldName - the field name where the many-to-many relation was declared on\n * @return {string} The branch name for the many-to-many relation.\n */\n\n\nfunction m2mName(declarationModelName, fieldName) {\n return declarationModelName + capitalize(fieldName);\n}\n/**\n * Returns the fieldname that saves a foreign key to the\n * model id where the many-to-many relation was declared.\n *\n * Example: `Author` => `fromAuthorId`\n *\n * @param {string} declarationModelName - the name of the model where the relation was declared\n * @return {string} the field name in the through model for `declarationModelName`'s foreign key.\n */\n\n\nfunction m2mFromFieldName(declarationModelName) {\n return `from${declarationModelName}Id`;\n}\n/**\n * Returns the fieldname that saves a foreign key in a many-to-many through model to the\n * model where the many-to-many relation was declared.\n *\n * Example: `Book` => `toBookId`\n *\n * @param {string} otherModelName - the name of the model that was the target of the many-to-many\n * declaration.\n * @return {string} the field name in the through model for `otherModelName`'s foreign key..\n */\n\n\nfunction m2mToFieldName(otherModelName) {\n return `to${otherModelName}Id`;\n}\n/** */\n\n\nfunction reverseFieldName(modelName) {\n return modelName.toLowerCase() + \"Set\"; // eslint-disable-line prefer-template\n}\n/** @private */\n\n\nfunction querySetDelegatorFactory(methodName) {\n return function querySetDelegator(...args) {\n return this.getQuerySet()[methodName](...args);\n };\n}\n/** @private */\n\n\nfunction querySetGetterDelegatorFactory(getterName) {\n return function querySetGetterDelegator() {\n const qs = this.getQuerySet();\n return qs[getterName];\n };\n}\n/** @private */\n\n\nfunction forEachSuperClass(subClass, func) {\n let currClass = subClass;\n\n while (currClass !== Function.prototype) {\n func(currClass);\n currClass = Object.getPrototypeOf(currClass);\n }\n}\n/** */\n\n\nfunction attachQuerySetMethods(modelClass, querySetClass) {\n const leftToDefine = querySetClass.sharedMethods.slice(); // There is no way to get a property descriptor for the whole prototype chain;\n // only from an objects own properties. Therefore we traverse the whole prototype\n // chain for querySet.\n\n forEachSuperClass(querySetClass, cls => {\n for (let i = 0; i < leftToDefine.length; i++) {\n let defined = false;\n const methodName = leftToDefine[i];\n const descriptor = Object.getOwnPropertyDescriptor(cls.prototype, methodName);\n\n if (typeof descriptor !== \"undefined\") {\n if (typeof descriptor.get !== \"undefined\") {\n descriptor.get = querySetGetterDelegatorFactory(methodName);\n Object.defineProperty(modelClass, methodName, descriptor);\n } else {\n modelClass[methodName] = querySetDelegatorFactory(methodName);\n }\n\n defined = true;\n }\n\n if (defined) {\n leftToDefine.splice(i--, 1);\n }\n }\n });\n}\n/**\n * Normalizes `entity` to an id, where `entity` can be an id\n * or a Model instance.\n *\n * @param {*} entity - either a Model instance or an id value\n * @return {*} the id value of `entity`\n */\n\n\nfunction normalizeEntity(entity) {\n if (entity !== null && typeof entity !== \"undefined\" && typeof entity.getId === \"function\") {\n return entity.getId();\n }\n\n return entity;\n}\n/** */\n\n\nfunction reverseFieldErrorMessage(modelName, fieldName, toModelName, backwardsFieldName) {\n return [`Reverse field ${backwardsFieldName} already defined`, ` on model ${toModelName}. To fix, set a custom related`, ` name on ${modelName}.${fieldName}.`].join(\"\");\n}\n/**\n * Fastest way to check if two objects are equal.\n * Object and array values have to be referentially equal.\n */\n\n\nfunction objectShallowEquals(a, b) {\n const entriesInA = Object.entries(Object(a));\n\n if (entriesInA.length !== Object.keys(b).length) {\n return false;\n }\n\n return entriesInA.every(([key, value]) => b.hasOwnProperty(key) && b[key] === value);\n}\n/** */\n\n\nfunction arrayDiffActions(sourceArr, targetArr) {\n const itemsInBoth = sourceArr.filter(item => targetArr.includes(item));\n const deleteItems = sourceArr.filter(item => !itemsInBoth.includes(item));\n const addItems = targetArr.filter(item => !itemsInBoth.includes(item));\n\n if (deleteItems.length || addItems.length) {\n return {\n delete: deleteItems,\n add: addItems\n };\n }\n\n return null;\n}\n\nconst {\n getBatchToken\n} = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/**\n * @return boolean\n */\n\nfunction clauseFiltersByAttribute({\n type,\n payload\n}, attribute) {\n if (type !== _constants__WEBPACK_IMPORTED_MODULE_1__[\"FILTER\"]) return false;\n\n if (typeof payload !== \"object\") {\n /**\n * payload could also be a function in which case\n * we would have no way of knowing what it does,\n * so we default to false for non-objects\n */\n return false;\n }\n\n if (!payload.hasOwnProperty(attribute)) return false;\n const attributeValue = payload[attribute];\n if (attributeValue === null) return false;\n if (attributeValue === undefined) return false;\n return true;\n}\n/**\n * @return boolean\n */\n\n\nfunction clauseReducesResultSetSize({\n type\n}) {\n return [_constants__WEBPACK_IMPORTED_MODULE_1__[\"FILTER\"], _constants__WEBPACK_IMPORTED_MODULE_1__[\"EXCLUDE\"]].includes(type);\n}\n/**\n * @param {Object} object\n * @return Object\n */\n\n\nfunction mapValues(object, func) {\n return Object.entries(object).reduce((newObject, [key, value]) => {\n newObject[key] = func(value);\n return newObject;\n }, {});\n}\n/** */\n\n\nfunction normalizeModelReference(modelNameOrClass) {\n if (!modelNameOrClass || typeof modelNameOrClass === \"string\") {\n return modelNameOrClass;\n }\n\n return modelNameOrClass.modelName;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy91dGlscy5qcz8wMjVlIl0sIm5hbWVzIjpbIndhcm5EZXByZWNhdGVkIiwibXNnIiwibG9nZ2VyIiwiY29uc29sZSIsIndhcm4iLCJiaW5kIiwibG9nIiwiY2FwaXRhbGl6ZSIsInN0cmluZyIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJtMm1OYW1lIiwiZGVjbGFyYXRpb25Nb2RlbE5hbWUiLCJmaWVsZE5hbWUiLCJtMm1Gcm9tRmllbGROYW1lIiwibTJtVG9GaWVsZE5hbWUiLCJvdGhlck1vZGVsTmFtZSIsInJldmVyc2VGaWVsZE5hbWUiLCJtb2RlbE5hbWUiLCJ0b0xvd2VyQ2FzZSIsInF1ZXJ5U2V0RGVsZWdhdG9yRmFjdG9yeSIsIm1ldGhvZE5hbWUiLCJxdWVyeVNldERlbGVnYXRvciIsImFyZ3MiLCJnZXRRdWVyeVNldCIsInF1ZXJ5U2V0R2V0dGVyRGVsZWdhdG9yRmFjdG9yeSIsImdldHRlck5hbWUiLCJxdWVyeVNldEdldHRlckRlbGVnYXRvciIsInFzIiwiZm9yRWFjaFN1cGVyQ2xhc3MiLCJzdWJDbGFzcyIsImZ1bmMiLCJjdXJyQ2xhc3MiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiYXR0YWNoUXVlcnlTZXRNZXRob2RzIiwibW9kZWxDbGFzcyIsInF1ZXJ5U2V0Q2xhc3MiLCJsZWZ0VG9EZWZpbmUiLCJzaGFyZWRNZXRob2RzIiwiY2xzIiwiaSIsImxlbmd0aCIsImRlZmluZWQiLCJkZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0IiwiZGVmaW5lUHJvcGVydHkiLCJzcGxpY2UiLCJub3JtYWxpemVFbnRpdHkiLCJlbnRpdHkiLCJnZXRJZCIsInJldmVyc2VGaWVsZEVycm9yTWVzc2FnZSIsInRvTW9kZWxOYW1lIiwiYmFja3dhcmRzRmllbGROYW1lIiwiam9pbiIsIm9iamVjdFNoYWxsb3dFcXVhbHMiLCJhIiwiYiIsImVudHJpZXNJbkEiLCJlbnRyaWVzIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwidmFsdWUiLCJoYXNPd25Qcm9wZXJ0eSIsImFycmF5RGlmZkFjdGlvbnMiLCJzb3VyY2VBcnIiLCJ0YXJnZXRBcnIiLCJpdGVtc0luQm90aCIsImZpbHRlciIsIml0ZW0iLCJpbmNsdWRlcyIsImRlbGV0ZUl0ZW1zIiwiYWRkSXRlbXMiLCJkZWxldGUiLCJhZGQiLCJnZXRCYXRjaFRva2VuIiwib3BzIiwiY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlIiwidHlwZSIsInBheWxvYWQiLCJhdHRyaWJ1dGUiLCJGSUxURVIiLCJhdHRyaWJ1dGVWYWx1ZSIsInVuZGVmaW5lZCIsImNsYXVzZVJlZHVjZXNSZXN1bHRTZXRTaXplIiwiRVhDTFVERSIsIm1hcFZhbHVlcyIsIm9iamVjdCIsInJlZHVjZSIsIm5ld09iamVjdCIsIm5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlIiwibW9kZWxOYW1lT3JDbGFzcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFLQTs7QUFDQSxTQUFTQSxjQUFULENBQXdCQyxHQUF4QixFQUE2QjtBQUN6QixRQUFNQyxNQUFNLEdBQ1IsT0FBT0MsT0FBTyxDQUFDQyxJQUFmLEtBQXdCLFVBQXhCLEdBQ01ELE9BQU8sQ0FBQ0MsSUFBUixDQUFhQyxJQUFiLENBQWtCRixPQUFsQixDQUROLEdBRU1BLE9BQU8sQ0FBQ0csR0FBUixDQUFZRCxJQUFaLENBQWlCRixPQUFqQixDQUhWO0FBSUEsU0FBT0QsTUFBTSxDQUFDRCxHQUFELENBQWI7QUFDSDtBQUVEOzs7QUFDQSxTQUFTTSxVQUFULENBQW9CQyxNQUFwQixFQUE0QjtBQUN4QixTQUFPQSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxDQUFkLEVBQWlCQyxX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O0FBR0EsU0FBU0MsMEJBQVQsQ0FBb0M7QUFBRU47QUFBRixDQUFwQyxFQUE4QztBQUMxQyxTQUFPLENBQUNHLGlEQUFELEVBQVNJLGtEQUFULEVBQWtCZixRQUFsQixDQUEyQlEsSUFBM0IsQ0FBUDtBQUNIO0FBRUQ7Ozs7OztBQUlBLFNBQVNRLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCNUQsSUFBM0IsRUFBaUM7QUFDN0IsU0FBT0ksTUFBTSxDQUFDMkIsT0FBUCxDQUFlNkIsTUFBZixFQUF1QkMsTUFBdkIsQ0FBOEIsQ0FBQ0MsU0FBRCxFQUFZLENBQUM1QixHQUFELEVBQU1DLEtBQU4sQ0FBWixLQUE2QjtBQUM5RDJCLGFBQVMsQ0FBQzVCLEdBQUQsQ0FBVCxHQUFpQmxDLElBQUksQ0FBQ21DLEtBQUQsQ0FBckI7QUFDQSxXQUFPMkIsU0FBUDtBQUNILEdBSE0sRUFHSixFQUhJLENBQVA7QUFJSDtBQUVEOzs7QUFDQSxTQUFTQyx1QkFBVCxDQUFpQ0MsZ0JBQWpDLEVBQW1EO0FBQy9DLE1BQUksQ0FBQ0EsZ0JBQUQsSUFBcUIsT0FBT0EsZ0JBQVAsS0FBNEIsUUFBckQsRUFBK0Q7QUFDM0QsV0FBT0EsZ0JBQVA7QUFDSDs7QUFDRCxTQUFPQSxnQkFBZ0IsQ0FBQzdFLFNBQXhCO0FBQ0giLCJmaWxlIjoiLi9zcmMvdXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3BzIGZyb20gXCJpbW11dGFibGUtb3BzXCI7XG5pbXBvcnQgeyBGSUxURVIsIEVYQ0xVREUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gd2FybkRlcHJlY2F0ZWQobXNnKSB7XG4gICAgY29uc3QgbG9nZ2VyID1cbiAgICAgICAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpXG4gICAgICAgICAgICA6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgcmV0dXJuIGxvZ2dlcihtc2cpO1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBicmFuY2ggbmFtZSBmb3IgYSBtYW55LXRvLW1hbnkgcmVsYXRpb24uXG4gKiBUaGUgbmFtZSBpcyB0aGUgY29tYmluYXRpb24gb2YgdGhlIG1vZGVsIG5hbWUgYW5kIHRoZSBmaWVsZCBuYW1lIHRoZSByZWxhdGlvblxuICogd2FzIGRlY2xhcmVkLiBUaGUgZmllbGQgbmFtZSdzIGZpcnN0IGxldHRlciBpcyBjYXBpdGFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOiBtb2RlbCBgQXV0aG9yYCBoYXMgYSBtYW55LXRvLW1hbnkgcmVsYXRpb24gdG8gdGhlIG1vZGVsIGBCb29rYCwgZGVmaW5lZFxuICogaW4gdGhlIGBBdXRob3JgIGZpZWxkIGBib29rc2AuIFRoZSBtYW55LXRvLW1hbnkgYnJhbmNoIG5hbWUgd2lsbCBiZSBgQXV0aG9yQm9va3NgLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZGVjbGFyYXRpb25Nb2RlbE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgbW9kZWwgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbiB3YXMgZGVjbGFyZWQgb25cbiAqIEBwYXJhbSAge3N0cmluZ30gZmllbGROYW1lICAgICAgICAgICAgLSB0aGUgZmllbGQgbmFtZSB3aGVyZSB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uIHdhcyBkZWNsYXJlZCBvblxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYnJhbmNoIG5hbWUgZm9yIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG0ybU5hbWUoZGVjbGFyYXRpb25Nb2RlbE5hbWUsIGZpZWxkTmFtZSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbk1vZGVsTmFtZSArIGNhcGl0YWxpemUoZmllbGROYW1lKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaWVsZG5hbWUgdGhhdCBzYXZlcyBhIGZvcmVpZ24ga2V5IHRvIHRoZVxuICogbW9kZWwgaWQgd2hlcmUgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbiB3YXMgZGVjbGFyZWQuXG4gKlxuICogRXhhbXBsZTogYEF1dGhvcmAgPT4gYGZyb21BdXRob3JJZGBcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmF0aW9uTW9kZWxOYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoZSByZWxhdGlvbiB3YXMgZGVjbGFyZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHRocm91Z2ggbW9kZWwgZm9yIGBkZWNsYXJhdGlvbk1vZGVsTmFtZWAncyBmb3JlaWduIGtleS5cbiAqL1xuZnVuY3Rpb24gbTJtRnJvbUZpZWxkTmFtZShkZWNsYXJhdGlvbk1vZGVsTmFtZSkge1xuICAgIHJldHVybiBgZnJvbSR7ZGVjbGFyYXRpb25Nb2RlbE5hbWV9SWRgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpZWxkbmFtZSB0aGF0IHNhdmVzIGEgZm9yZWlnbiBrZXkgaW4gYSBtYW55LXRvLW1hbnkgdGhyb3VnaCBtb2RlbCB0byB0aGVcbiAqIG1vZGVsIHdoZXJlIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2FzIGRlY2xhcmVkLlxuICpcbiAqIEV4YW1wbGU6IGBCb29rYCA9PiBgdG9Cb29rSWRgXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBvdGhlck1vZGVsTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBtb2RlbCB0aGF0IHdhcyB0aGUgdGFyZ2V0IG9mIHRoZSBtYW55LXRvLW1hbnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHRocm91Z2ggbW9kZWwgZm9yIGBvdGhlck1vZGVsTmFtZWAncyBmb3JlaWduIGtleS4uXG4gKi9cbmZ1bmN0aW9uIG0ybVRvRmllbGROYW1lKG90aGVyTW9kZWxOYW1lKSB7XG4gICAgcmV0dXJuIGB0byR7b3RoZXJNb2RlbE5hbWV9SWRgO1xufVxuXG4vKiogKi9cbmZ1bmN0aW9uIHJldmVyc2VGaWVsZE5hbWUobW9kZWxOYW1lKSB7XG4gICAgcmV0dXJuIG1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpICsgXCJTZXRcIjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItdGVtcGxhdGVcbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBxdWVyeVNldERlbGVnYXRvckZhY3RvcnkobWV0aG9kTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBxdWVyeVNldERlbGVnYXRvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5U2V0KClbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG4gICAgfTtcbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBxdWVyeVNldEdldHRlckRlbGVnYXRvckZhY3RvcnkoZ2V0dGVyTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBxdWVyeVNldEdldHRlckRlbGVnYXRvcigpIHtcbiAgICAgICAgY29uc3QgcXMgPSB0aGlzLmdldFF1ZXJ5U2V0KCk7XG4gICAgICAgIHJldHVybiBxc1tnZXR0ZXJOYW1lXTtcbiAgICB9O1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGZvckVhY2hTdXBlckNsYXNzKHN1YkNsYXNzLCBmdW5jKSB7XG4gICAgbGV0IGN1cnJDbGFzcyA9IHN1YkNsYXNzO1xuICAgIHdoaWxlIChjdXJyQ2xhc3MgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAgICAgICBmdW5jKGN1cnJDbGFzcyk7XG4gICAgICAgIGN1cnJDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyQ2xhc3MpO1xuICAgIH1cbn1cblxuLyoqICovXG5mdW5jdGlvbiBhdHRhY2hRdWVyeVNldE1ldGhvZHMobW9kZWxDbGFzcywgcXVlcnlTZXRDbGFzcykge1xuICAgIGNvbnN0IGxlZnRUb0RlZmluZSA9IHF1ZXJ5U2V0Q2xhc3Muc2hhcmVkTWV0aG9kcy5zbGljZSgpO1xuXG4gICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGdldCBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSB3aG9sZSBwcm90b3R5cGUgY2hhaW47XG4gICAgLy8gb25seSBmcm9tIGFuIG9iamVjdHMgb3duIHByb3BlcnRpZXMuIFRoZXJlZm9yZSB3ZSB0cmF2ZXJzZSB0aGUgd2hvbGUgcHJvdG90eXBlXG4gICAgLy8gY2hhaW4gZm9yIHF1ZXJ5U2V0LlxuICAgIGZvckVhY2hTdXBlckNsYXNzKHF1ZXJ5U2V0Q2xhc3MsIGNscyA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdFRvRGVmaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZGVmaW5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGxlZnRUb0RlZmluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIGNscy5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXQgPSBxdWVyeVNldEdldHRlckRlbGVnYXRvckZhY3RvcnkobWV0aG9kTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbENsYXNzLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbENsYXNzW21ldGhvZE5hbWVdID0gcXVlcnlTZXREZWxlZ2F0b3JGYWN0b3J5KFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGVmdFRvRGVmaW5lLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBgZW50aXR5YCB0byBhbiBpZCwgd2hlcmUgYGVudGl0eWAgY2FuIGJlIGFuIGlkXG4gKiBvciBhIE1vZGVsIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSAgeyp9IGVudGl0eSAtIGVpdGhlciBhIE1vZGVsIGluc3RhbmNlIG9yIGFuIGlkIHZhbHVlXG4gKiBAcmV0dXJuIHsqfSB0aGUgaWQgdmFsdWUgb2YgYGVudGl0eWBcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRW50aXR5KGVudGl0eSkge1xuICAgIGlmIChcbiAgICAgICAgZW50aXR5ICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBlbnRpdHkgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIGVudGl0eS5nZXRJZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHkuZ2V0SWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudGl0eTtcbn1cblxuLyoqICovXG5mdW5jdGlvbiByZXZlcnNlRmllbGRFcnJvck1lc3NhZ2UoXG4gICAgbW9kZWxOYW1lLFxuICAgIGZpZWxkTmFtZSxcbiAgICB0b01vZGVsTmFtZSxcbiAgICBiYWNrd2FyZHNGaWVsZE5hbWVcbikge1xuICAgIHJldHVybiBbXG4gICAgICAgIGBSZXZlcnNlIGZpZWxkICR7YmFja3dhcmRzRmllbGROYW1lfSBhbHJlYWR5IGRlZmluZWRgLFxuICAgICAgICBgIG9uIG1vZGVsICR7dG9Nb2RlbE5hbWV9LiBUbyBmaXgsIHNldCBhIGN1c3RvbSByZWxhdGVkYCxcbiAgICAgICAgYCBuYW1lIG9uICR7bW9kZWxOYW1lfS4ke2ZpZWxkTmFtZX0uYCxcbiAgICBdLmpvaW4oXCJcIik7XG59XG5cbi8qKlxuICogRmFzdGVzdCB3YXkgdG8gY2hlY2sgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLlxuICogT2JqZWN0IGFuZCBhcnJheSB2YWx1ZXMgaGF2ZSB0byBiZSByZWZlcmVudGlhbGx5IGVxdWFsLlxuICovXG5mdW5jdGlvbiBvYmplY3RTaGFsbG93RXF1YWxzKGEsIGIpIHtcbiAgICBjb25zdCBlbnRyaWVzSW5BID0gT2JqZWN0LmVudHJpZXMoT2JqZWN0KGEpKTtcblxuICAgIGlmIChlbnRyaWVzSW5BLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc0luQS5ldmVyeShcbiAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gYi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGJba2V5XSA9PT0gdmFsdWVcbiAgICApO1xufVxuXG4vKiogKi9cbmZ1bmN0aW9uIGFycmF5RGlmZkFjdGlvbnMoc291cmNlQXJyLCB0YXJnZXRBcnIpIHtcbiAgICBjb25zdCBpdGVtc0luQm90aCA9IHNvdXJjZUFyci5maWx0ZXIoaXRlbSA9PiB0YXJnZXRBcnIuaW5jbHVkZXMoaXRlbSkpO1xuICAgIGNvbnN0IGRlbGV0ZUl0ZW1zID0gc291cmNlQXJyLmZpbHRlcihpdGVtID0+ICFpdGVtc0luQm90aC5pbmNsdWRlcyhpdGVtKSk7XG4gICAgY29uc3QgYWRkSXRlbXMgPSB0YXJnZXRBcnIuZmlsdGVyKGl0ZW0gPT4gIWl0ZW1zSW5Cb3RoLmluY2x1ZGVzKGl0ZW0pKTtcblxuICAgIGlmIChkZWxldGVJdGVtcy5sZW5ndGggfHwgYWRkSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWxldGU6IGRlbGV0ZUl0ZW1zLFxuICAgICAgICAgICAgYWRkOiBhZGRJdGVtcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHsgZ2V0QmF0Y2hUb2tlbiB9ID0gb3BzO1xuXG4vKipcbiAqIEByZXR1cm4gYm9vbGVhblxuICovXG5mdW5jdGlvbiBjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUoeyB0eXBlLCBwYXlsb2FkIH0sIGF0dHJpYnV0ZSkge1xuICAgIGlmICh0eXBlICE9PSBGSUxURVIpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAvKipcbiAgICAgICAgICogcGF5bG9hZCBjb3VsZCBhbHNvIGJlIGEgZnVuY3Rpb24gaW4gd2hpY2ggY2FzZVxuICAgICAgICAgKiB3ZSB3b3VsZCBoYXZlIG5vIHdheSBvZiBrbm93aW5nIHdoYXQgaXQgZG9lcyxcbiAgICAgICAgICogc28gd2UgZGVmYXVsdCB0byBmYWxzZSBmb3Igbm9uLW9iamVjdHNcbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXBheWxvYWQuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gcGF5bG9hZFthdHRyaWJ1dGVdO1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIGJvb2xlYW5cbiAqL1xuZnVuY3Rpb24gY2xhdXNlUmVkdWNlc1Jlc3VsdFNldFNpemUoeyB0eXBlIH0pIHtcbiAgICByZXR1cm4gW0ZJTFRFUiwgRVhDTFVERV0uaW5jbHVkZXModHlwZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybiBPYmplY3RcbiAqL1xuZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgZnVuYykge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3QpLnJlZHVjZSgobmV3T2JqZWN0LCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSBmdW5jKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICB9LCB7fSk7XG59XG5cbi8qKiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTW9kZWxSZWZlcmVuY2UobW9kZWxOYW1lT3JDbGFzcykge1xuICAgIGlmICghbW9kZWxOYW1lT3JDbGFzcyB8fCB0eXBlb2YgbW9kZWxOYW1lT3JDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gbW9kZWxOYW1lT3JDbGFzcztcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsTmFtZU9yQ2xhc3MubW9kZWxOYW1lO1xufVxuXG5leHBvcnQge1xuICAgIGF0dGFjaFF1ZXJ5U2V0TWV0aG9kcyxcbiAgICBtMm1OYW1lLFxuICAgIG0ybUZyb21GaWVsZE5hbWUsXG4gICAgbTJtVG9GaWVsZE5hbWUsXG4gICAgcmV2ZXJzZUZpZWxkTmFtZSxcbiAgICBub3JtYWxpemVFbnRpdHksXG4gICAgcmV2ZXJzZUZpZWxkRXJyb3JNZXNzYWdlLFxuICAgIG9iamVjdFNoYWxsb3dFcXVhbHMsXG4gICAgb3BzLFxuICAgIGFycmF5RGlmZkFjdGlvbnMsXG4gICAgZ2V0QmF0Y2hUb2tlbixcbiAgICBjbGF1c2VGaWx0ZXJzQnlBdHRyaWJ1dGUsXG4gICAgY2xhdXNlUmVkdWNlc1Jlc3VsdFNldFNpemUsXG4gICAgd2FybkRlcHJlY2F0ZWQsXG4gICAgbWFwVmFsdWVzLFxuICAgIG5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlLFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/utils.js\n");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"attachQuerySetMethods\", function() { return attachQuerySetMethods; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mName\", function() { return m2mName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mFromFieldName\", function() { return m2mFromFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m2mToFieldName\", function() { return m2mToFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reverseFieldName\", function() { return reverseFieldName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"normalizeEntity\", function() { return normalizeEntity; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"reverseFieldErrorMessage\", function() { return reverseFieldErrorMessage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objectShallowEquals\", function() { return objectShallowEquals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"arrayDiffActions\", function() { return arrayDiffActions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getBatchToken\", function() { return getBatchToken; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clauseFiltersByAttribute\", function() { return clauseFiltersByAttribute; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clauseReducesResultSetSize\", function() { return clauseReducesResultSetSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"warnDeprecated\", function() { return warnDeprecated; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapValues\", function() { return mapValues; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"normalizeModelReference\", function() { return normalizeModelReference; });\n/* harmony import */ var immutable_ops__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! immutable-ops */ \"./node_modules/immutable-ops/es/index.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ops\", function() { return immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; });\n\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"./src/constants.js\");\n\n\n/**\n * @module utils\n * @private\n */\n\n/** @private */\n\nfunction warnDeprecated(msg) {\n const logger = typeof console.warn === \"function\" ? console.warn.bind(console) : console.log.bind(console);\n return logger(msg);\n}\n/** @private */\n\n\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n/**\n * Returns the branch name for a many-to-many relation.\n * The name is the combination of the model name and the field name the relation\n * was declared. The field name's first letter is capitalized.\n *\n * Example: model `Author` has a many-to-many relation to the model `Book`, defined\n * in the `Author` field `books`. The many-to-many branch name will be `AuthorBooks`.\n *\n * @param {string} declarationModelName - the name of the model the many-to-many relation was declared on\n * @param {string} fieldName - the field name where the many-to-many relation was declared on\n * @return {string} The branch name for the many-to-many relation.\n */\n\n\nfunction m2mName(declarationModelName, fieldName) {\n return declarationModelName + capitalize(fieldName);\n}\n/**\n * Returns the fieldname that saves a foreign key to the\n * model id where the many-to-many relation was declared.\n *\n * Example: `Author` => `fromAuthorId`\n *\n * @param {string} declarationModelName - the name of the model where the relation was declared\n * @return {string} the field name in the through model for `declarationModelName`'s foreign key.\n */\n\n\nfunction m2mFromFieldName(declarationModelName) {\n return `from${declarationModelName}Id`;\n}\n/**\n * Returns the fieldname that saves a foreign key in a many-to-many through model to the\n * model where the many-to-many relation was declared.\n *\n * Example: `Book` => `toBookId`\n *\n * @param {string} otherModelName - the name of the model that was the target of the many-to-many\n * declaration.\n * @return {string} the field name in the through model for `otherModelName`'s foreign key..\n */\n\n\nfunction m2mToFieldName(otherModelName) {\n return `to${otherModelName}Id`;\n}\n/** */\n\n\nfunction reverseFieldName(modelName) {\n return modelName.toLowerCase() + \"Set\"; // eslint-disable-line prefer-template\n}\n/** @private */\n\n\nfunction querySetDelegatorFactory(methodName) {\n return function querySetDelegator(...args) {\n return this.getQuerySet()[methodName](...args);\n };\n}\n/** @private */\n\n\nfunction querySetGetterDelegatorFactory(getterName) {\n return function querySetGetterDelegator() {\n const qs = this.getQuerySet();\n return qs[getterName];\n };\n}\n/** @private */\n\n\nfunction forEachSuperClass(subClass, func) {\n let currClass = subClass;\n\n while (currClass !== Function.prototype) {\n func(currClass);\n currClass = Object.getPrototypeOf(currClass);\n }\n}\n/** */\n\n\nfunction attachQuerySetMethods(modelClass, querySetClass) {\n const leftToDefine = querySetClass.sharedMethods.slice(); // There is no way to get a property descriptor for the whole prototype chain;\n // only from an objects own properties. Therefore we traverse the whole prototype\n // chain for querySet.\n\n forEachSuperClass(querySetClass, cls => {\n for (let i = 0; i < leftToDefine.length; i++) {\n let defined = false;\n const methodName = leftToDefine[i];\n const descriptor = Object.getOwnPropertyDescriptor(cls.prototype, methodName);\n\n if (typeof descriptor !== \"undefined\") {\n if (typeof descriptor.get !== \"undefined\") {\n descriptor.get = querySetGetterDelegatorFactory(methodName);\n Object.defineProperty(modelClass, methodName, descriptor);\n } else {\n modelClass[methodName] = querySetDelegatorFactory(methodName);\n }\n\n defined = true;\n }\n\n if (defined) {\n leftToDefine.splice(i--, 1);\n }\n }\n });\n}\n/**\n * Normalizes `entity` to an id, where `entity` can be an id\n * or a Model instance.\n *\n * @param {*} entity - either a Model instance or an id value\n * @return {*} the id value of `entity`\n */\n\n\nfunction normalizeEntity(entity) {\n if (entity !== null && typeof entity !== \"undefined\" && typeof entity.getId === \"function\") {\n return entity.getId();\n }\n\n return entity;\n}\n/** */\n\n\nfunction reverseFieldErrorMessage(modelName, fieldName, toModelName, backwardsFieldName) {\n return [`Reverse field ${backwardsFieldName} already defined`, ` on model ${toModelName}. To fix, set a custom related`, ` name on ${modelName}.${fieldName}.`].join(\"\");\n}\n/**\n * Fastest way to check if two objects are equal.\n * Object and array values have to be referentially equal.\n */\n\n\nfunction objectShallowEquals(a, b) {\n const entriesInA = Object.entries(Object(a));\n\n if (entriesInA.length !== Object.keys(b).length) {\n return false;\n }\n\n return entriesInA.every(([key, value]) => b.hasOwnProperty(key) && b[key] === value);\n}\n/** */\n\n\nfunction arrayDiffActions(sourceArr, targetArr) {\n const itemsInBoth = sourceArr.filter(item => targetArr.includes(item));\n const deleteItems = sourceArr.filter(item => !itemsInBoth.includes(item));\n const addItems = targetArr.filter(item => !itemsInBoth.includes(item));\n\n if (deleteItems.length || addItems.length) {\n return {\n delete: deleteItems,\n add: addItems\n };\n }\n\n return null;\n}\n\nconst {\n getBatchToken\n} = immutable_ops__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/**\n * @return boolean\n */\n\nfunction clauseFiltersByAttribute({\n type,\n payload\n}, attribute) {\n if (type !== _constants__WEBPACK_IMPORTED_MODULE_1__[\"FILTER\"]) return false;\n\n if (typeof payload !== \"object\") {\n /**\n * payload could also be a function in which case\n * we would have no way of knowing what it does,\n * so we default to false for non-objects\n */\n return false;\n }\n\n if (!payload.hasOwnProperty(attribute)) return false;\n const attributeValue = payload[attribute];\n if (attributeValue === null) return false;\n if (attributeValue === undefined) return false;\n return true;\n}\n/**\n * @return boolean\n */\n\n\nfunction clauseReducesResultSetSize({\n type\n}) {\n return [_constants__WEBPACK_IMPORTED_MODULE_1__[\"FILTER\"], _constants__WEBPACK_IMPORTED_MODULE_1__[\"EXCLUDE\"]].includes(type);\n}\n/**\n * @param {Object} object\n * @return Object\n */\n\n\nfunction mapValues(object, func) {\n return Object.entries(object).reduce((newObject, [key, value]) => {\n newObject[key] = func(value);\n return newObject;\n }, {});\n}\n/** */\n\n\nfunction normalizeModelReference(modelNameOrClass) {\n if (!modelNameOrClass || typeof modelNameOrClass === \"string\") {\n return modelNameOrClass;\n }\n\n return modelNameOrClass.modelName;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SZWR1eE9ybS8uL3NyYy91dGlscy5qcz8wMjVlIl0sIm5hbWVzIjpbIndhcm5EZXByZWNhdGVkIiwibXNnIiwibG9nZ2VyIiwiY29uc29sZSIsIndhcm4iLCJiaW5kIiwibG9nIiwiY2FwaXRhbGl6ZSIsInN0cmluZyIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJtMm1OYW1lIiwiZGVjbGFyYXRpb25Nb2RlbE5hbWUiLCJmaWVsZE5hbWUiLCJtMm1Gcm9tRmllbGROYW1lIiwibTJtVG9GaWVsZE5hbWUiLCJvdGhlck1vZGVsTmFtZSIsInJldmVyc2VGaWVsZE5hbWUiLCJtb2RlbE5hbWUiLCJ0b0xvd2VyQ2FzZSIsInF1ZXJ5U2V0RGVsZWdhdG9yRmFjdG9yeSIsIm1ldGhvZE5hbWUiLCJxdWVyeVNldERlbGVnYXRvciIsImFyZ3MiLCJnZXRRdWVyeVNldCIsInF1ZXJ5U2V0R2V0dGVyRGVsZWdhdG9yRmFjdG9yeSIsImdldHRlck5hbWUiLCJxdWVyeVNldEdldHRlckRlbGVnYXRvciIsInFzIiwiZm9yRWFjaFN1cGVyQ2xhc3MiLCJzdWJDbGFzcyIsImZ1bmMiLCJjdXJyQ2xhc3MiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiYXR0YWNoUXVlcnlTZXRNZXRob2RzIiwibW9kZWxDbGFzcyIsInF1ZXJ5U2V0Q2xhc3MiLCJsZWZ0VG9EZWZpbmUiLCJzaGFyZWRNZXRob2RzIiwiY2xzIiwiaSIsImxlbmd0aCIsImRlZmluZWQiLCJkZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0IiwiZGVmaW5lUHJvcGVydHkiLCJzcGxpY2UiLCJub3JtYWxpemVFbnRpdHkiLCJlbnRpdHkiLCJnZXRJZCIsInJldmVyc2VGaWVsZEVycm9yTWVzc2FnZSIsInRvTW9kZWxOYW1lIiwiYmFja3dhcmRzRmllbGROYW1lIiwiam9pbiIsIm9iamVjdFNoYWxsb3dFcXVhbHMiLCJhIiwiYiIsImVudHJpZXNJbkEiLCJlbnRyaWVzIiwia2V5cyIsImV2ZXJ5Iiwia2V5IiwidmFsdWUiLCJoYXNPd25Qcm9wZXJ0eSIsImFycmF5RGlmZkFjdGlvbnMiLCJzb3VyY2VBcnIiLCJ0YXJnZXRBcnIiLCJpdGVtc0luQm90aCIsImZpbHRlciIsIml0ZW0iLCJpbmNsdWRlcyIsImRlbGV0ZUl0ZW1zIiwiYWRkSXRlbXMiLCJkZWxldGUiLCJhZGQiLCJnZXRCYXRjaFRva2VuIiwib3BzIiwiY2xhdXNlRmlsdGVyc0J5QXR0cmlidXRlIiwidHlwZSIsInBheWxvYWQiLCJhdHRyaWJ1dGUiLCJGSUxURVIiLCJhdHRyaWJ1dGVWYWx1ZSIsInVuZGVmaW5lZCIsImNsYXVzZVJlZHVjZXNSZXN1bHRTZXRTaXplIiwiRVhDTFVERSIsIm1hcFZhbHVlcyIsIm9iamVjdCIsInJlZHVjZSIsIm5ld09iamVjdCIsIm5vcm1hbGl6ZU1vZGVsUmVmZXJlbmNlIiwibW9kZWxOYW1lT3JDbGFzcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFDQSxTQUFTQSxjQUFULENBQXdCQyxHQUF4QixFQUE2QjtBQUN6QixRQUFNQyxNQUFNLEdBQ1IsT0FBT0MsT0FBTyxDQUFDQyxJQUFmLEtBQXdCLFVBQXhCLEdBQ01ELE9BQU8sQ0FBQ0MsSUFBUixDQUFhQyxJQUFiLENBQWtCRixPQUFsQixDQUROLEdBRU1BLE9BQU8sQ0FBQ0csR0FBUixDQUFZRCxJQUFaLENBQWlCRixPQUFqQixDQUhWO0FBSUEsU0FBT0QsTUFBTSxDQUFDRCxHQUFELENBQWI7QUFDSDtBQUVEOzs7QUFDQSxTQUFTTSxVQUFULENBQW9CQyxNQUFwQixFQUE0QjtBQUN4QixTQUFPQSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxDQUFkLEVBQWlCQyxXQUFqQixLQUFpQ0YsTUFBTSxDQUFDRyxLQUFQLENBQWEsQ0FBYixDQUF4QztBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxPQUFULENBQWlCQyxvQkFBakIsRUFBdUNDLFNBQXZDLEVBQWtEO0FBQzlDLFNBQU9ELG9CQUFvQixHQUFHTixVQUFVLENBQUNPLFNBQUQsQ0FBeEM7QUFDSDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0MsZ0JBQVQsQ0FBMEJGLG9CQUExQixFQUFnRDtBQUM1QyxTQUFRLE9BQU1BLG9CQUFxQixJQUFuQztBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNHLGNBQVQsQ0FBd0JDLGNBQXhCLEVBQXdDO0FBQ3BDLFNBQVEsS0FBSUEsY0FBZSxJQUEzQjtBQUNIO0FBRUQ7OztBQUNBLFNBQVNDLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNqQyxTQUFPQSxTQUFTLENBQUNDLFdBQVYsS0FBMEIsS0FBakMsQ0FEaUMsQ0FDTztBQUMzQztBQUVEOzs7QUFDQSxTQUFTQyx3QkFBVCxDQUFrQ0MsVUFBbEMsRUFBOEM7QUFDMUMsU0FBTyxTQUFTQyxpQkFBVCxDQUEyQixHQUFHQyxJQUE5QixFQUFvQztBQUN2QyxXQUFPLEtBQUtDLFdBQUwsR0FBbUJILFVBQW5CLEVBQStCLEdBQUdFLElBQWxDLENBQVA7QUFDSCxHQUZEO0FBR0g7QUFFRDs7O0FBQ0EsU0FBU0UsOEJBQVQsQ0FBd0NDLFVBQXhDLEVBQW9EO0FBQ2hELFNBQU8sU0FBU0MsdUJBQVQsR0FBbUM7QUFDdEMsVUFBTUMsRUFBRSxHQUFHLEtBQUtKLFdBQUwsRUFBWDtBQUNBLFdBQU9JLEVBQUUsQ0FBQ0YsVUFBRCxDQUFUO0FBQ0gsR0FIRDtBQUlIO0FBRUQ7OztBQUNBLFNBQVNHLGlCQUFULENBQTJCQyxRQUEzQixFQUFxQ0MsSUFBckMsRUFBMkM7QUFDdkMsTUFBSUMsU0FBUyxHQUFHRixRQUFoQjs7QUFDQSxTQUFPRSxTQUFTLEtBQUtDLFFBQVEsQ0FBQ0MsU0FBOUIsRUFBeUM7QUFDckNILFFBQUksQ0FBQ0MsU0FBRCxDQUFKO0FBQ0FBLGFBQVMsR0FBR0csTUFBTSxDQUFDQyxjQUFQLENBQXNCSixTQUF0QixDQUFaO0FBQ0g7QUFDSjtBQUVEOzs7QUFDQSxTQUFTSyxxQkFBVCxDQUErQkMsVUFBL0IsRUFBMkNDLGFBQTNDLEVBQTBEO0FBQ3RELFFBQU1DLFlBQVksR0FBR0QsYUFBYSxDQUFDRSxhQUFkLENBQTRCL0IsS0FBNUIsRUFBckIsQ0FEc0QsQ0FHdEQ7QUFDQTtBQUNBOztBQUNBbUIsbUJBQWlCLENBQUNVLGFBQUQsRUFBaUJHLEdBQUQsSUFBUztBQUN0QyxTQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdILFlBQVksQ0FBQ0ksTUFBakMsRUFBeUNELENBQUMsRUFBMUMsRUFBOEM7QUFDMUMsVUFBSUUsT0FBTyxHQUFHLEtBQWQ7QUFDQSxZQUFNeEIsVUFBVSxHQUFHbUIsWUFBWSxDQUFDRyxDQUFELENBQS9CO0FBQ0EsWUFBTUcsVUFBVSxHQUFHWCxNQUFNLENBQUNZLHdCQUFQLENBQ2ZMLEdBQUcsQ0FBQ1IsU0FEVyxFQUVmYixVQUZlLENBQW5COztBQUlBLFVBQUksT0FBT3lCLFVBQVAsS0FBc0IsV0FBMUIsRUFBdUM7QUFDbkMsWUFBSSxPQUFPQSxVQUFVLENBQUNFLEdBQWxCLEtBQTBCLFdBQTlCLEVBQTJDO0FBQ3ZDRixvQkFBVSxDQUFDRSxHQUFYLEdBQWlCdkIsOEJBQThCLENBQUNKLFVBQUQsQ0FBL0M7QUFDQWMsZ0JBQU0sQ0FBQ2MsY0FBUCxDQUFzQlgsVUFBdEIsRUFBa0NqQixVQUFsQyxFQUE4Q3lCLFVBQTlDO0FBQ0gsU0FIRCxNQUdPO0FBQ0hSLG9CQUFVLENBQUNqQixVQUFELENBQVYsR0FBeUJELHdCQUF3QixDQUM3Q0MsVUFENkMsQ0FBakQ7QUFHSDs7QUFDRHdCLGVBQU8sR0FBRyxJQUFWO0FBQ0g7O0FBQ0QsVUFBSUEsT0FBSixFQUFhO0FBQ1RMLG9CQUFZLENBQUNVLE1BQWIsQ0FBb0JQLENBQUMsRUFBckIsRUFBeUIsQ0FBekI7QUFDSDtBQUNKO0FBQ0osR0F2QmdCLENBQWpCO0FBd0JIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNRLGVBQVQsQ0FBeUJDLE1BQXpCLEVBQWlDO0FBQzdCLE1BQ0lBLE1BQU0sS0FBSyxJQUFYLElBQ0EsT0FBT0EsTUFBUCxLQUFrQixXQURsQixJQUVBLE9BQU9BLE1BQU0sQ0FBQ0MsS0FBZCxLQUF3QixVQUg1QixFQUlFO0FBQ0UsV0FBT0QsTUFBTSxDQUFDQyxLQUFQLEVBQVA7QUFDSDs7QUFDRCxTQUFPRCxNQUFQO0FBQ0g7QUFFRDs7O0FBQ0EsU0FBU0Usd0JBQVQsQ0FDSXBDLFNBREosRUFFSUwsU0FGSixFQUdJMEMsV0FISixFQUlJQyxrQkFKSixFQUtFO0FBQ0UsU0FBTyxDQUNGLGlCQUFnQkEsa0JBQW1CLGtCQURqQyxFQUVGLGFBQVlELFdBQVksZ0NBRnRCLEVBR0YsWUFBV3JDLFNBQVUsSUFBR0wsU0FBVSxHQUhoQyxFQUlMNEMsSUFKSyxDQUlBLEVBSkEsQ0FBUDtBQUtIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNDLG1CQUFULENBQTZCQyxDQUE3QixFQUFnQ0MsQ0FBaEMsRUFBbUM7QUFDL0IsUUFBTUMsVUFBVSxHQUFHMUIsTUFBTSxDQUFDMkIsT0FBUCxDQUFlM0IsTUFBTSxDQUFDd0IsQ0FBRCxDQUFyQixDQUFuQjs7QUFFQSxNQUFJRSxVQUFVLENBQUNqQixNQUFYLEtBQXNCVCxNQUFNLENBQUM0QixJQUFQLENBQVlILENBQVosRUFBZWhCLE1BQXpDLEVBQWlEO0FBQzdDLFdBQU8sS0FBUDtBQUNIOztBQUVELFNBQU9pQixVQUFVLENBQUNHLEtBQVgsQ0FDSCxDQUFDLENBQUNDLEdBQUQsRUFBTUMsS0FBTixDQUFELEtBQWtCTixDQUFDLENBQUNPLGNBQUYsQ0FBaUJGLEdBQWpCLEtBQXlCTCxDQUFDLENBQUNLLEdBQUQsQ0FBRCxLQUFXQyxLQURuRCxDQUFQO0FBR0g7QUFFRDs7O0FBQ0EsU0FBU0UsZ0JBQVQsQ0FBMEJDLFNBQTFCLEVBQXFDQyxTQUFyQyxFQUFnRDtBQUM1QyxRQUFNQyxXQUFXLEdBQUdGLFNBQVMsQ0FBQ0csTUFBVixDQUFrQkMsSUFBRCxJQUFVSCxTQUFTLENBQUNJLFFBQVYsQ0FBbUJELElBQW5CLENBQTNCLENBQXBCO0FBQ0EsUUFBTUUsV0FBVyxHQUFHTixTQUFTLENBQUNHLE1BQVYsQ0FBa0JDLElBQUQsSUFBVSxDQUFDRixXQUFXLENBQUNHLFFBQVosQ0FBcUJELElBQXJCLENBQTVCLENBQXBCO0FBQ0EsUUFBTUcsUUFBUSxHQUFHTixTQUFTLENBQUNFLE1BQVYsQ0FBa0JDLElBQUQsSUFBVSxDQUFDRixXQUFXLENBQUNHLFFBQVosQ0FBcUJELElBQXJCLENBQTVCLENBQWpCOztBQUVBLE1BQUlFLFdBQVcsQ0FBQy9CLE1BQVosSUFBc0JnQyxRQUFRLENBQUNoQyxNQUFuQyxFQUEyQztBQUN2QyxXQUFPO0FBQ0hpQyxZQUFNLEVBQUVGLFdBREw7QUFFSEcsU0FBRyxFQUFFRjtBQUZGLEtBQVA7QUFJSDs7QUFDRCxTQUFPLElBQVA7QUFDSDs7QUFFRCxNQUFNO0FBQUVHO0FBQUYsSUFBb0JDLHFEQUExQjtBQUVBO0FBQ0E7QUFDQTs7QUFDQSxTQUFTQyx3QkFBVCxDQUFrQztBQUFFQyxNQUFGO0FBQVFDO0FBQVIsQ0FBbEMsRUFBcURDLFNBQXJELEVBQWdFO0FBQzVELE1BQUlGLElBQUksS0FBS0csaURBQWIsRUFBcUIsT0FBTyxLQUFQOztBQUVyQixNQUFJLE9BQU9GLE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDN0I7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNRLFdBQU8sS0FBUDtBQUNIOztBQUVELE1BQUksQ0FBQ0EsT0FBTyxDQUFDaEIsY0FBUixDQUF1QmlCLFNBQXZCLENBQUwsRUFBd0MsT0FBTyxLQUFQO0FBQ3hDLFFBQU1FLGNBQWMsR0FBR0gsT0FBTyxDQUFDQyxTQUFELENBQTlCO0FBQ0EsTUFBSUUsY0FBYyxLQUFLLElBQXZCLEVBQTZCLE9BQU8sS0FBUDtBQUM3QixNQUFJQSxjQUFjLEtBQUtDLFNBQXZCLEVBQWtDLE9BQU8sS0FBUDtBQUVsQyxTQUFPLElBQVA7QUFDSDtBQUVEO0FBQ0E7QUFDQTs7O0FBQ0EsU0FBU0MsMEJBQVQsQ0FBb0M7QUFBRU47QUFBRixDQUFwQyxFQUE4QztBQUMxQyxTQUFPLENBQUNHLGlEQUFELEVBQVNJLGtEQUFULEVBQWtCZixRQUFsQixDQUEyQlEsSUFBM0IsQ0FBUDtBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFNBQVNRLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCNUQsSUFBM0IsRUFBaUM7QUFDN0IsU0FBT0ksTUFBTSxDQUFDMkIsT0FBUCxDQUFlNkIsTUFBZixFQUF1QkMsTUFBdkIsQ0FBOEIsQ0FBQ0MsU0FBRCxFQUFZLENBQUM1QixHQUFELEVBQU1DLEtBQU4sQ0FBWixLQUE2QjtBQUM5RDJCLGFBQVMsQ0FBQzVCLEdBQUQsQ0FBVCxHQUFpQmxDLElBQUksQ0FBQ21DLEtBQUQsQ0FBckI7QUFDQSxXQUFPMkIsU0FBUDtBQUNILEdBSE0sRUFHSixFQUhJLENBQVA7QUFJSDtBQUVEOzs7QUFDQSxTQUFTQyx1QkFBVCxDQUFpQ0MsZ0JBQWpDLEVBQW1EO0FBQy9DLE1BQUksQ0FBQ0EsZ0JBQUQsSUFBcUIsT0FBT0EsZ0JBQVAsS0FBNEIsUUFBckQsRUFBK0Q7QUFDM0QsV0FBT0EsZ0JBQVA7QUFDSDs7QUFDRCxTQUFPQSxnQkFBZ0IsQ0FBQzdFLFNBQXhCO0FBQ0giLCJmaWxlIjoiLi9zcmMvdXRpbHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3BzIGZyb20gXCJpbW11dGFibGUtb3BzXCI7XG5pbXBvcnQgeyBGSUxURVIsIEVYQ0xVREUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKiBAcHJpdmF0ZSAqL1xuZnVuY3Rpb24gd2FybkRlcHJlY2F0ZWQobXNnKSB7XG4gICAgY29uc3QgbG9nZ2VyID1cbiAgICAgICAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpXG4gICAgICAgICAgICA6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgcmV0dXJuIGxvZ2dlcihtc2cpO1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBicmFuY2ggbmFtZSBmb3IgYSBtYW55LXRvLW1hbnkgcmVsYXRpb24uXG4gKiBUaGUgbmFtZSBpcyB0aGUgY29tYmluYXRpb24gb2YgdGhlIG1vZGVsIG5hbWUgYW5kIHRoZSBmaWVsZCBuYW1lIHRoZSByZWxhdGlvblxuICogd2FzIGRlY2xhcmVkLiBUaGUgZmllbGQgbmFtZSdzIGZpcnN0IGxldHRlciBpcyBjYXBpdGFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOiBtb2RlbCBgQXV0aG9yYCBoYXMgYSBtYW55LXRvLW1hbnkgcmVsYXRpb24gdG8gdGhlIG1vZGVsIGBCb29rYCwgZGVmaW5lZFxuICogaW4gdGhlIGBBdXRob3JgIGZpZWxkIGBib29rc2AuIFRoZSBtYW55LXRvLW1hbnkgYnJhbmNoIG5hbWUgd2lsbCBiZSBgQXV0aG9yQm9va3NgLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZGVjbGFyYXRpb25Nb2RlbE5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgbW9kZWwgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbiB3YXMgZGVjbGFyZWQgb25cbiAqIEBwYXJhbSAge3N0cmluZ30gZmllbGROYW1lICAgICAgICAgICAgLSB0aGUgZmllbGQgbmFtZSB3aGVyZSB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uIHdhcyBkZWNsYXJlZCBvblxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYnJhbmNoIG5hbWUgZm9yIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG0ybU5hbWUoZGVjbGFyYXRpb25Nb2RlbE5hbWUsIGZpZWxkTmFtZSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbk1vZGVsTmFtZSArIGNhcGl0YWxpemUoZmllbGROYW1lKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaWVsZG5hbWUgdGhhdCBzYXZlcyBhIGZvcmVpZ24ga2V5IHRvIHRoZVxuICogbW9kZWwgaWQgd2hlcmUgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvbiB3YXMgZGVjbGFyZWQuXG4gKlxuICogRXhhbXBsZTogYEF1dGhvcmAgPT4gYGZyb21BdXRob3JJZGBcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGRlY2xhcmF0aW9uTW9kZWxOYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG1vZGVsIHdoZXJlIHRoZSByZWxhdGlvbiB3YXMgZGVjbGFyZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHRocm91Z2ggbW9kZWwgZm9yIGBkZWNsYXJhdGlvbk1vZGVsTmFtZWAncyBmb3JlaWduIGtleS5cbiAqL1xuZnVuY3Rpb24gbTJtRnJvbUZpZWxkTmFtZShkZWNsYXJhdGlvbk1vZGVsTmFtZSkge1xuICAgIHJldHVybiBgZnJvbSR7ZGVjbGFyYXRpb25Nb2RlbE5hbWV9SWRgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpZWxkbmFtZSB0aGF0IHNhdmVzIGEgZm9yZWlnbiBrZXkgaW4gYSBtYW55LXRvLW1hbnkgdGhyb3VnaCBtb2RlbCB0byB0aGVcbiAqIG1vZGVsIHdoZXJlIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2FzIGRlY2xhcmVkLlxuICpcbiAqIEV4YW1wbGU6IGBCb29rYCA9PiBgdG9Cb29rSWRgXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBvdGhlck1vZGVsTmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBtb2RlbCB0aGF0IHdhcyB0aGUgdGFyZ2V0IG9mIHRoZSBtYW55LXRvLW1hbnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGZpZWxkIG5hbWUgaW4gdGhlIHRocm91Z2ggbW9kZWwgZm9yIGBvdGhlck1vZGVsTmFtZWAncyBmb3JlaWduIGtleS4uXG4gKi9cbmZ1bmN0aW9uIG0ybVRvRmllbGROYW1lKG90aGVyTW9kZWxOYW1lKSB7XG4gICAgcmV0dXJuIGB0byR7b3RoZXJNb2RlbE5hbWV9SWRgO1xufVxuXG4vKiogKi9cbmZ1bmN0aW9uIHJldmVyc2VGaWVsZE5hbWUobW9kZWxOYW1lKSB7XG4gICAgcmV0dXJuIG1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpICsgXCJTZXRcIjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItdGVtcGxhdGVcbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBxdWVyeVNldERlbGVnYXRvckZhY3RvcnkobWV0aG9kTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBxdWVyeVNldERlbGVnYXRvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5U2V0KClbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG4gICAgfTtcbn1cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBxdWVyeVNldEdldHRlckRlbGVnYXRvckZhY3RvcnkoZ2V0dGVyTmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBxdWVyeVNldEdldHRlckRlbGVnYXRvcigpIHtcbiAgICAgICAgY29uc3QgcXMgPSB0aGlzLmdldFF1ZXJ5U2V0KCk7XG4gICAgICAgIHJldHVybiBxc1tnZXR0ZXJOYW1lXTtcbiAgICB9O1xufVxuXG4vKiogQHByaXZhdGUgKi9cbmZ1bmN0aW9uIGZvckVhY2hTdXBlckNsYXNzKHN1YkNsYXNzLCBmdW5jKSB7XG4gICAgbGV0IGN1cnJDbGFzcyA9IHN1YkNsYXNzO1xuICAgIHdoaWxlIChjdXJyQ2xhc3MgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAgICAgICBmdW5jKGN1cnJDbGFzcyk7XG4gICAgICAgIGN1cnJDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyQ2xhc3MpO1xuICAgIH1cbn1cblxuLyoqICovXG5mdW5jdGlvbiBhdHRhY2hRdWVyeVNldE1ldGhvZHMobW9kZWxDbGFzcywgcXVlcnlTZXRDbGFzcykge1xuICAgIGNvbnN0IGxlZnRUb0RlZmluZSA9IHF1ZXJ5U2V0Q2xhc3Muc2hhcmVkTWV0aG9kcy5zbGljZSgpO1xuXG4gICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGdldCBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSB3aG9sZSBwcm90b3R5cGUgY2hhaW47XG4gICAgLy8gb25seSBmcm9tIGFuIG9iamVjdHMgb3duIHByb3BlcnRpZXMuIFRoZXJlZm9yZSB3ZSB0cmF2ZXJzZSB0aGUgd2hvbGUgcHJvdG90eXBlXG4gICAgLy8gY2hhaW4gZm9yIHF1ZXJ5U2V0LlxuICAgIGZvckVhY2hTdXBlckNsYXNzKHF1ZXJ5U2V0Q2xhc3MsIChjbHMpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VG9EZWZpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkZWZpbmVkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gbGVmdFRvRGVmaW5lW2ldO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgY2xzLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICBtZXRob2ROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLmdldCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IHF1ZXJ5U2V0R2V0dGVyRGVsZWdhdG9yRmFjdG9yeShtZXRob2ROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsQ2xhc3MsIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsQ2xhc3NbbWV0aG9kTmFtZV0gPSBxdWVyeVNldERlbGVnYXRvckZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmluZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZWZ0VG9EZWZpbmUuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGBlbnRpdHlgIHRvIGFuIGlkLCB3aGVyZSBgZW50aXR5YCBjYW4gYmUgYW4gaWRcbiAqIG9yIGEgTW9kZWwgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7Kn0gZW50aXR5IC0gZWl0aGVyIGEgTW9kZWwgaW5zdGFuY2Ugb3IgYW4gaWQgdmFsdWVcbiAqIEByZXR1cm4geyp9IHRoZSBpZCB2YWx1ZSBvZiBgZW50aXR5YFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVFbnRpdHkoZW50aXR5KSB7XG4gICAgaWYgKFxuICAgICAgICBlbnRpdHkgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGVudGl0eSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgZW50aXR5LmdldElkID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGVudGl0eS5nZXRJZCgpO1xuICAgIH1cbiAgICByZXR1cm4gZW50aXR5O1xufVxuXG4vKiogKi9cbmZ1bmN0aW9uIHJldmVyc2VGaWVsZEVycm9yTWVzc2FnZShcbiAgICBtb2RlbE5hbWUsXG4gICAgZmllbGROYW1lLFxuICAgIHRvTW9kZWxOYW1lLFxuICAgIGJhY2t3YXJkc0ZpZWxkTmFtZVxuKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYFJldmVyc2UgZmllbGQgJHtiYWNrd2FyZHNGaWVsZE5hbWV9IGFscmVhZHkgZGVmaW5lZGAsXG4gICAgICAgIGAgb24gbW9kZWwgJHt0b01vZGVsTmFtZX0uIFRvIGZpeCwgc2V0IGEgY3VzdG9tIHJlbGF0ZWRgLFxuICAgICAgICBgIG5hbWUgb24gJHttb2RlbE5hbWV9LiR7ZmllbGROYW1lfS5gLFxuICAgIF0uam9pbihcIlwiKTtcbn1cblxuLyoqXG4gKiBGYXN0ZXN0IHdheSB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gKiBPYmplY3QgYW5kIGFycmF5IHZhbHVlcyBoYXZlIHRvIGJlIHJlZmVyZW50aWFsbHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFNoYWxsb3dFcXVhbHMoYSwgYikge1xuICAgIGNvbnN0IGVudHJpZXNJbkEgPSBPYmplY3QuZW50cmllcyhPYmplY3QoYSkpO1xuXG4gICAgaWYgKGVudHJpZXNJbkEubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzSW5BLmV2ZXJ5KFxuICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBiLmhhc093blByb3BlcnR5KGtleSkgJiYgYltrZXldID09PSB2YWx1ZVxuICAgICk7XG59XG5cbi8qKiAqL1xuZnVuY3Rpb24gYXJyYXlEaWZmQWN0aW9ucyhzb3VyY2VBcnIsIHRhcmdldEFycikge1xuICAgIGNvbnN0IGl0ZW1zSW5Cb3RoID0gc291cmNlQXJyLmZpbHRlcigoaXRlbSkgPT4gdGFyZ2V0QXJyLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICBjb25zdCBkZWxldGVJdGVtcyA9IHNvdXJjZUFyci5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtc0luQm90aC5pbmNsdWRlcyhpdGVtKSk7XG4gICAgY29uc3QgYWRkSXRlbXMgPSB0YXJnZXRBcnIuZmlsdGVyKChpdGVtKSA9PiAhaXRlbXNJbkJvdGguaW5jbHVkZXMoaXRlbSkpO1xuXG4gICAgaWYgKGRlbGV0ZUl0ZW1zLmxlbmd0aCB8fCBhZGRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlbGV0ZTogZGVsZXRlSXRlbXMsXG4gICAgICAgICAgICBhZGQ6IGFkZEl0ZW1zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgeyBnZXRCYXRjaFRva2VuIH0gPSBvcHM7XG5cbi8qKlxuICogQHJldHVybiBib29sZWFuXG4gKi9cbmZ1bmN0aW9uIGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZSh7IHR5cGUsIHBheWxvYWQgfSwgYXR0cmlidXRlKSB7XG4gICAgaWYgKHR5cGUgIT09IEZJTFRFUikgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwYXlsb2FkIGNvdWxkIGFsc28gYmUgYSBmdW5jdGlvbiBpbiB3aGljaCBjYXNlXG4gICAgICAgICAqIHdlIHdvdWxkIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hhdCBpdCBkb2VzLFxuICAgICAgICAgKiBzbyB3ZSBkZWZhdWx0IHRvIGZhbHNlIGZvciBub24tb2JqZWN0c1xuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcGF5bG9hZC5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBwYXlsb2FkW2F0dHJpYnV0ZV07XG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEByZXR1cm4gYm9vbGVhblxuICovXG5mdW5jdGlvbiBjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZSh7IHR5cGUgfSkge1xuICAgIHJldHVybiBbRklMVEVSLCBFWENMVURFXS5pbmNsdWRlcyh0eXBlKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIE9iamVjdFxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBmdW5jKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iamVjdCkucmVkdWNlKChuZXdPYmplY3QsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBuZXdPYmplY3Rba2V5XSA9IGZ1bmModmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3T2JqZWN0O1xuICAgIH0sIHt9KTtcbn1cblxuLyoqICovXG5mdW5jdGlvbiBub3JtYWxpemVNb2RlbFJlZmVyZW5jZShtb2RlbE5hbWVPckNsYXNzKSB7XG4gICAgaWYgKCFtb2RlbE5hbWVPckNsYXNzIHx8IHR5cGVvZiBtb2RlbE5hbWVPckNsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBtb2RlbE5hbWVPckNsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxOYW1lT3JDbGFzcy5tb2RlbE5hbWU7XG59XG5cbmV4cG9ydCB7XG4gICAgYXR0YWNoUXVlcnlTZXRNZXRob2RzLFxuICAgIG0ybU5hbWUsXG4gICAgbTJtRnJvbUZpZWxkTmFtZSxcbiAgICBtMm1Ub0ZpZWxkTmFtZSxcbiAgICByZXZlcnNlRmllbGROYW1lLFxuICAgIG5vcm1hbGl6ZUVudGl0eSxcbiAgICByZXZlcnNlRmllbGRFcnJvck1lc3NhZ2UsXG4gICAgb2JqZWN0U2hhbGxvd0VxdWFscyxcbiAgICBvcHMsXG4gICAgYXJyYXlEaWZmQWN0aW9ucyxcbiAgICBnZXRCYXRjaFRva2VuLFxuICAgIGNsYXVzZUZpbHRlcnNCeUF0dHJpYnV0ZSxcbiAgICBjbGF1c2VSZWR1Y2VzUmVzdWx0U2V0U2l6ZSxcbiAgICB3YXJuRGVwcmVjYXRlZCxcbiAgICBtYXBWYWx1ZXMsXG4gICAgbm9ybWFsaXplTW9kZWxSZWZlcmVuY2UsXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utils.js\n");
/***/ })
diff --git a/node_modules/redux-orm/dist/redux-orm.min.js b/node_modules/redux-orm/dist/redux-orm.min.js
index f76f1b4..3b207b3 100644
--- a/node_modules/redux-orm/dist/redux-orm.min.js
+++ b/node_modules/redux-orm/dist/redux-orm.min.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("ReduxOrm",[],t):"object"==typeof exports?exports.ReduxOrm=t():e.ReduxOrm=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=35)}([function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}},function(e,t){e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=n=function(e){return typeof e}:e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(t)}e.exports=n},function(e,t,n){var r=n(15),o=n(16),s=n(17),i=n(18);e.exports=function(e){return r(e)||o(e)||s(e)||i()}},function(e,t,n){"use strict";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,s=null;return function(){return o(t,n,arguments)||(s=e.apply(null,arguments)),n=arguments,s}}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var a=0,c=r.pop(),u=i(r),l=e.apply(void 0,[function(){return a++,c.apply(null,arguments)}].concat(n)),d=s((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return l.apply(null,e)}));return d.resultFunc=c,d.recomputations=function(){return a},d.resetRecomputations=function(){return a=0},d}}t.__esModule=!0,t.defaultMemoize=s,t.createSelectorCreator=a,t.createStructuredSelector=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c;if("object"!=typeof e)throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))};var c=t.createSelector=a(s)},function(e,t,n){!function(e,t){"use strict";function n(e){return"string"==typeof e||"number"==typeof e}var r=function(){function e(){this._cache={}}var t=e.prototype;return t.set=function(e,t){this._cache[e]=t},t.get=function(e){return this._cache[e]},t.remove=function(e){delete this._cache[e]},t.clear=function(){this._cache={}},t.isValidCacheKey=function(e){return n(e)},e}(),o=r,s=function(){return!0};function i(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return function(e,r){if("function"==typeof r)throw new Error('[re-reselect] Second argument "options" must be an object. Please use "options.selectorCreator" to provide a custom selectorCreator.');var i={};"function"==typeof e?Object.assign(i,r,{keySelector:e}):Object.assign(i,e);var a=0,c=n.pop(),u=Array.isArray(n[0])?n[0]:[].concat(n);n.push((function(){return a++,c.apply(void 0,arguments)}));var l=i.cacheObject||new o,d=i.selectorCreator||t.createSelector,h=l.isValidCacheKey||s;i.keySelectorCreator&&(i.keySelector=i.keySelectorCreator({keySelector:i.keySelector,inputSelectors:u,resultFunc:c}));var f=function(){var e=i.keySelector.apply(i,arguments);if(h(e)){var t=l.get(e);return void 0===t&&(t=d.apply(void 0,n),l.set(e,t)),t.apply(void 0,arguments)}console.warn('[re-reselect] Invalid cache key "'+e+'" has been returned by keySelector function.')};return f.getMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);return l.get(e)},f.removeMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);l.remove(e)},f.clearCache=function(){l.clear()},f.resultFunc=c,f.dependencies=u,f.cache=l,f.recomputations=function(){return a},f.resetRecomputations=function(){return a=0},f.keySelector=i.keySelector,f}}function a(e){if(void 0===e)throw new Error('Missing the required property "cacheSize".');if(!Number.isInteger(e)||e<=0)throw new Error('The "cacheSize" property must be a positive integer value.')}var c=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._cacheOrdering.push(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._cache[e]},t.remove=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t.isValidCacheKey=function(e){return n(e)},e}(),u=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._registerCacheHit(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._registerCacheHit(e),this._cache[e]},t.remove=function(e){this._deleteCacheHit(e),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t._registerCacheHit=function(e){this._deleteCacheHit(e),this._cacheOrdering.push(e)},t._deleteCacheHit=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1)},t.isValidCacheKey=function(e){return n(e)},e}(),l=function(){function e(){this._cache=new Map}var t=e.prototype;return t.set=function(e,t){this._cache.set(e,t)},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),d=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),h=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){var t=this._cache.get(e);return this._cache.has(e)&&(this.remove(e),this._cache.set(e,t)),t},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}();e.FifoCacheObject=c,e.FifoMapCache=d,e.FifoObjectCache=c,e.FlatCacheObject=r,e.FlatMapCache=l,e.FlatObjectCache=r,e.LruCacheObject=h,e.LruMapCache=h,e.LruObjectCache=u,e.createStructuredCachedSelector=function(e){return t.createStructuredSelector(e,i)},e.default=i,Object.defineProperty(e,"__esModule",{value:!0})}(t,n(4))},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}},function(e,t,n){var r=n(19),o=n(8),s=n(20),i=n(21),a=n(22),c=n(23),u=n(9);e.exports=function(e,t,n){var l=-1;t=r(t.length?t:[u],a(o));var d=s(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++l,value:e}}));return i(d,(function(e,t){return c(e,t,n)}))}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e){return e}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t,n){var r=n(7),o=n(10);e.exports=function(e,t,n,s){return null==e?[]:(o(t)||(t=null==t?[]:[t]),o(n=s?void 0:n)||(n=null==n?[]:[n]),r(e,t,n))}},function(e,t,n){var r=n(26),o=n(27),s=n(8),i=n(10),a=n(28);e.exports=function(e,t){return(i(e)?r:o)(e,a(s(t,3)))}},function(e,t,n){var r=n(29),o=n(7),s=n(30),i=n(34),a=s((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=a},function(e,t,n){var r=n(6);e.exports=function(e){if(Array.isArray(e))return r(e)}},function(e,t){e.exports=function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}},function(e,t,n){var r=n(6);e.exports=function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){var r=n(24);e.exports=function(e,t,n){for(var o=-1,s=e.criteria,i=t.criteria,a=s.length,c=n.length;++o<a;){var u=r(s[o],i[o]);if(u)return o>=c?u:u*("desc"==n[o]?-1:1)}return e.index-t.index}},function(e,t,n){var r=n(25);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,s=e==e,i=r(e),a=void 0!==t,c=null===t,u=t==t,l=r(t);if(!c&&!l&&!i&&e>t||i&&a&&u&&!c&&!l||o&&a&&u||!n&&u||!s)return 1;if(!o&&!i&&!l&&e<t||l&&n&&s&&!o&&!i||c&&n&&s||!a&&s||!u)return-1}return 0}},function(e,t){e.exports=function(){return!1}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){var n="Expected a function";e.exports=function(e){if("function"!=typeof e)throw new TypeError(n);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}},function(e,t){e.exports=function(e){return e&&e.length?e[0]:void 0}},function(e,t,n){var r=n(9),o=n(31),s=n(33);e.exports=function(e,t){return s(o(e,t,r),e+"")}},function(e,t,n){var r=n(32),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var s=arguments,i=-1,a=o(s.length-t,0),c=Array(a);++i<a;)c[i]=s[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=s[i];return u[t]=n(c),r(e,this,u)}}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(){return!1}},function(e,t,n){"use strict";n.r(t);var r=n(0),o=n.n(r),s=n(3),i=n.n(s),a=n(2),c=n.n(a);function u(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function l(e){return function t(n){return 0===arguments.length||u(n)?t:e.apply(this,arguments)}}function d(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,s){return t.apply(this,arguments)};case 6:return function(e,n,r,o,s,i){return t.apply(this,arguments)};case 7:return function(e,n,r,o,s,i,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,s,i,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,s,i,a,c,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,s,i,a,c,u,l){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function h(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return u(n)?t:l((function(t){return e(n,t)}));default:return u(n)&&u(r)?t:u(n)?l((function(t){return e(t,r)})):u(r)?l((function(t){return e(n,t)})):e(n,r)}}}var f=h((function(e,t){return 1===e?l(t):d(e,function e(t,n,r){return function(){for(var o=[],s=0,i=t,a=0;a<n.length||s<arguments.length;){var c;a<n.length&&(!u(n[a])||s>=arguments.length)?c=n[a]:(c=arguments[s],s+=1),o[a]=c,u(c)||(i-=1),a+=1}return i<=0?r.apply(this,o):d(i,e(t,o,r))}}(e,[],t))})),p=l((function(e){return f(e.length,e)})),m={"@@functional/placeholder":!0};function y(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}var g="@@_______immutableOpsOwnerID";function b(e,t){return!!t&&e[g]===t}var w="function"==typeof Symbol?function(){return Symbol("ownerID")}:function(){return{}};function v(e,t){return t&&function(e,t){Object.defineProperty(e,g,{value:t,configurable:!0,enumerable:!1})}(e,t),e}function _(e){return e instanceof Array?e:[e]}var M=".";function O(e){return"string"==typeof e?-1===e.indexOf(M)?[e]:e.split(M):e}function N(e,t,n){return n[e]=t,n}function S(e,t,n){var r=_(t);return e?r.forEach((function(t){y(t,(function(t,r){var o;e&&n.hasOwnProperty(r)?(o="object"===c()(t)?S(e,[t],n[r]):t,n[r]=o):n[r]=t}))})):Object.assign.apply(Object,[n].concat(i()(r))),n}var k=S.bind(null,!1),E=S.bind(null,!0);function j(e,t){return _(e).forEach((function(e){delete t[e]})),t}function x(e,t,n){return e[n]!==t[n]}function F(e,t,n,r){if(b(r,t))return S(e,n,r);var o=_(n),s=!1,i=r,a=function(){s||(s=!0,v(i=Object.assign({},r),t))};return o.forEach((function(n){y(n,(function(o,s){if(e&&r.hasOwnProperty(s)){var u=i[s];if("object"===c()(o)&&!(o instanceof Array)){if(x(i,n,s)){var l=F(e,t,o,u);l!==u&&(a(),i[s]=l)}return!0}}x(i,n,s)&&(a(),i[s]=o)}))})),i}var A=F.bind(null,!0);function C(e,t,n,r){if(b(r,e))return N(t,n,r);if(r[t]===n)return r;var o=function(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=e[n];return t}(r);return o[t]=n,v(o,e),o}function I(e,t){for(var n=0,r=0;n<t.length;){e(t[n],r)?n++:t.splice(n,1),r++}return t}function R(e,t,n,r){var o=_(n);return r.splice.apply(r,[e,t].concat(i()(o))),r}function D(e,t,n){return R(e,0,t,n)}function $(e,t,n,r,o){if(b(o,e))return R(t,n,r,o);var s=_(r),a=o.slice();return v(a,e),a.splice.apply(a,[t,n].concat(i()(s))),a}function T(e,t,n,r){return b(r,e)?D(t,n,r):$(e,t,0,n,r)}var P={merge:F.bind(null,!1),deepMerge:A,omit:function(e,t,n){if(b(n,e))return j(t,n);var r=_(t).filter((function(e){return n.hasOwnProperty(e)}));if(0===r.length)return n;var o=Object.assign({},n);return r.forEach((function(e){delete o[e]})),v(o,e),o},setIn:function(e,t,n,r){var o=O(t),s=function(e,t){for(var n=O(e),r=t,o=0;o<n.length;o++){var s=r[n[o]];if(o===n.length-1)return s;if("object"!==c()(s))return;r=s}}(o,r);if(n===s)return r;var i,a=o.length,u=i=b(r,e)?r:Object.assign(v({},e),r);return o.forEach((function(t,r){if(r!==a-1){var s=i[t],u=c()(s);if("object"!==u){if("undefined"===u){var l=v({},e);return i[t]=l,void(i=l)}var d="".concat(o[r-1],".").concat(t);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(d,"."))}if(b(s,e))i=s;else{var h=v({},e);i[t]=Object.assign(h,s),i=h}}else i[t]=n})),u},insert:T,push:function(e,t,n){return T(e,n.length,t,n)},filter:function(e,t,n){if(b(n,e))return I(t,n);var r=n.filter(t);return r.length===n.length?n:(v(r,e),r)},splice:$,set:function(e,t,n,r){if(function(e){return e&&"object"===c()(e)&&"number"==typeof e.length&&e.length>=0&&e.length%1==0}(r))return C(e,t,n,r);if(b(r,e))return N(t,n,r);if(r[t]===n)return r;var o=Object.assign({},r);return v(o,e),o[t]=n,o}},B={merge:k,deepMerge:E,omit:j,setIn:function(e,t,n){for(var r=O(e),o=r.length,s=!1,i=0,a=n,u=r[i];!s;)if(i===o-1)a[u]=t,s=!0;else{var l=c()(a[u]);if("undefined"===l){var d={};v(d,null),a[u]=d}else if("object"!==l){var h="".concat(r[i-1],".").concat(u);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(h,"."))}a=a[u],u=r[++i]}return n},insert:D,push:function(e,t){var n=_(e);return t.push.apply(t,i()(n)),t},filter:I,splice:R,set:N};var U=function(){var e=Object.assign({},P);y(e,(function(t,n){e[n]=p(t.bind(null,null))}));var t=Object.assign({},B);y(t,(function(e,n){t[n]=p(e)}));var n=Object.assign({},P);return y(n,(function(e,t){n[t]=p(e)})),Object.assign(e,{mutable:t,batch:n,batched:function(e,t){var n,r;"function"==typeof e?(r=e,n=w()):(n=e,r=t);var o=Object.assign({},P);return y(o,(function(e,t){o[t]=p(e.bind(null,n))})),r(o)},__:m,getBatchToken:w})}();const V="REDUX_ORM_UPDATE",q="REDUX_ORM_DELETE",z="REDUX_ORM_CREATE",L="REDUX_ORM_FILTER",Q="REDUX_ORM_EXCLUDE",X="SUCCESS",H=Symbol("REDUX_ORM_ALL_INSTANCES"),Y=(e,t)=>void 0===t?H:t;function K(e){return("function"==typeof console.warn?console.warn.bind(console):console.log.bind(console))(e)}function G(e,t){return e+((n=t).charAt(0).toUpperCase()+n.slice(1));var n}function J(e){return`from${e}Id`}function W(e){return`to${e}Id`}function Z(e){return function(...t){return this.getQuerySet()[e](...t)}}function ee(e){return function(){return this.getQuerySet()[e]}}function te(e,t){const n=t.sharedMethods.slice();!function(e,t){let n=e;for(;n!==Function.prototype;)t(n),n=Object.getPrototypeOf(n)}(t,t=>{for(let r=0;r<n.length;r++){let o=!1;const s=n[r],i=Object.getOwnPropertyDescriptor(t.prototype,s);void 0!==i&&(void 0!==i.get?(i.get=ee(s),Object.defineProperty(e,s,i)):e[s]=Z(s),o=!0),o&&n.splice(r--,1)}})}function ne(e){return null!=e&&"function"==typeof e.getId?e.getId():e}const{getBatchToken:re}=U;function oe({type:e,payload:t},n){if(e!==L)return!1;if("object"!=typeof t)return!1;if(!t.hasOwnProperty(n))return!1;const r=t[n];return null!==r&&void 0!==r}function se(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=t(r),e),{})}function ie(e){return e&&"string"!=typeof e?e.modelName:e}const ae=function(){function e(e,t,n){Object.assign(this,{modelClass:e,clauses:t||[]}),this._opts=n}e.addSharedMethod=function(e){this.sharedMethods=this.sharedMethods.concat(e)};var t=e.prototype;return t._new=function(e,t){const n={...this._opts,...t};return new this.constructor(this.modelClass,e,n)},t.toString=function(){return this._evaluate(),`QuerySet contents:\n - ${this.rows.map(({id:e})=>this.modelClass.withId(e).toString()).join("\n - ")}`},t.toRefArray=function(){return this._evaluate()},t.toModelArray=function(){const{modelClass:e}=this;return this._evaluate().map(t=>new e(t))},t.count=function(){return this._evaluate(),this.rows.length},t.exists=function(){return Boolean(this.count())},t.at=function(e){const{modelClass:t}=this,n=this._evaluate();if(e>=0&&e<n.length)return new t(n[e])},t.first=function(){return this.at(0)},t.last=function(){const e=this._evaluate();return this.at(e.length-1)},t.all=function(){return this._new(this.clauses)},t.filter=function(e){const t="object"==typeof e?se(e,ne):e,n={type:L,payload:t};return this._new(this.clauses.concat(n))},t.exclude=function(e){const t="object"==typeof e?se(e,ne):e,n={type:Q,payload:t};return this._new(this.clauses.concat(n))},t._evaluate=function(){if(void 0===this.modelClass.session)throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `,"Create a session using `session = orm.session()` and use ",`\`session["${this.modelClass.modelName}"]\` for querying instead.`].join(""));if(!this._evaluated){const{session:e,modelName:t}=this.modelClass,n={table:t,clauses:this.clauses};this.rows=e.query(n).rows,this._evaluated=!0}return this.rows},t.orderBy=function(e,t){const n={type:"REDUX_ORM_ORDER_BY",payload:[e,t]};return this._new(this.clauses.concat(n))},t.update=function(e){const{session:t,modelName:n}=this.modelClass;t.applyUpdate({action:V,query:{table:n,clauses:this.clauses},payload:e}),this._evaluated=!1},t.delete=function(){const{session:e,modelName:t}=this.modelClass;this.toModelArray().forEach(e=>e._onDelete()),e.applyUpdate({action:q,query:{table:t,clauses:this.clauses}}),this._evaluated=!1},t.map=function(){throw new Error("`QuerySet.prototype.map` has been removed. Call `.toModelArray()` or `.toRefArray()` first to map.")},t.forEach=function(){throw new Error("`QuerySet.prototype.forEach` has been removed. Call `.toModelArray()` or `.toRefArray()` first to iterate.")},o()(e,[{key:"withModels",get:function(){throw new Error("`QuerySet.prototype.withModels` has been removed. Use `.toModelArray()` or predicate functions that instantiate Models from refs, e.g. `new Model(ref)`.")}},{key:"withRefs",get:function(){K("`QuerySet.prototype.withRefs` has been deprecated. Query building operates on refs only now.")}}]),e}();ae.sharedMethods=["count","at","all","last","first","filter","exclude","orderBy","update","delete"];var ce=ae;var ue=function(){function e(e,t,n,r,o){this.schema=e,this.db=t,this.state=n||t.getEmptyState(),this.initialState=this.state,this.withMutations=Boolean(r),this.batchToken=o||w(),this.modelData={},this.models=e.getModelClasses(),this.sessionBoundModels=this.models.map(e=>{function t(){return Reflect.construct(e,arguments,t)}return Reflect.setPrototypeOf(t.prototype,e.prototype),Reflect.setPrototypeOf(t,e),Object.defineProperty(this,e.modelName,{get:()=>t}),t.connect(this),t})}var t=e.prototype;return t.getDataForModel=function(e){return this.modelData[e]||(this.modelData[e]={}),this.modelData[e]},t.getModelData=function(){return this.modelData},t.markAccessed=function(e,t){const n=this.getDataForModel(e);n.accessedInstances||(n.accessedInstances={}),t.forEach(e=>{n.accessedInstances[e]=!0})},t.markFullTableScanned=function(e){this.getDataForModel(e).fullTableScanned=!0},t.markAccessedIndexes=function(e){e.forEach(([e,t,n])=>{const r=this.getDataForModel(e);r.accessedIndexes||(r.accessedIndexes={}),r.accessedIndexes[t]=[...r.accessedIndexes[t]||[],n]})},t.applyUpdate=function(e){const t=this._getTransaction(e),n=this.db.update(e,t,this.state),{status:r,state:o,payload:s}=n;if(r!==X)throw new Error(`Applying update failed with status ${r}. Payload: ${s}`);return this.state=o,s},t.query=function(e){const t=this.db.query(e,this.state);return this._markAccessedByQuery(e,t),t},t._getTransaction=function(e){const{withMutations:t}=this,{action:n}=e;let{batchToken:r}=this;return[V,q].includes(n)&&(r=w()),{batchToken:r,withMutations:t}},t._markAccessedByQuery=function(e,t){const{table:n,clauses:r}=e,{rows:o}=t,{idAttribute:s}=this[n],i=new Set(o.map(e=>e[s])),a=r.some(e=>!!oe(e,s)&&(i.add(e.payload[s]),!0)),c=[],{indexes:u}=this.state[n];r.forEach(e=>{Object.keys(u).forEach(t=>{if(!oe(e,t))return;const r=e.payload[t];c.push([n,t,r])})}),a?this.markAccessed(n,i):c.length?(this.markAccessed(n,i),this.markAccessedIndexes(c)):this.markFullTableScanned(n)},t.getNextState=function(){return K("`Session.prototype.getNextState` has been deprecated. Access the `Session.prototype.state` property instead."),this.state},t.reduce=function(){throw new Error("`Session.prototype.reduce` has been removed. The Redux integration API is now decoupled from ORM and Session - see the 0.9 migration guide in the GitHub repo.")},o()(e,[{key:"accessedModelInstances",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedInstances&&(e[t]=n.accessedInstances),e),{})}},{key:"fullTableScannedModels",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.fullTableScanned&&e.push(t),e),[])}},{key:"accessedIndexes",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedIndexes&&(e[t]=n.accessedIndexes),e),{})}}]),e}(),le=n(1),de=n.n(le);var he=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installForwardsVirtualField=function(){this.model.virtualFields[this.fieldName]=this.field.createForwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},n.installBackwardsDescriptor=function(){if(Object.getOwnPropertyDescriptor(this.toModel.prototype,this.backwardsFieldName))throw new Error((e=this.model.modelName,t=this.fieldName,n=this.toModel.modelName,[`Reverse field ${this.backwardsFieldName} already defined`,` on model ${n}. To fix, set a custom related`,` name on ${e}.${t}.`].join("")));var e,t,n;Object.defineProperty(this.toModel.prototype,this.backwardsFieldName,this.field.createBackwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installBackwardsVirtualField=function(){this.toModel.virtualFields[this.backwardsFieldName]=this.field.createBackwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},t}(function(){function e(e){this.field=e.field,this.fieldName=e.fieldName,this.model=e.model,this.orm=e.orm,this.field.references(this.model)&&(this.field.toModelName="this")}return e.prototype.run=function(){this.installForwardsDescriptor(),this.field.installsForwardsVirtualField&&this.installForwardsVirtualField(),this.field.installsBackwardsDescriptor&&this.installBackwardsDescriptor(),this.field.installsBackwardsVirtualField&&this.installBackwardsVirtualField()},o()(e,[{key:"toModel",get:function(){if(void 0===this._toModel){const{toModelName:e}=this.field;this._toModel=e?"this"===e?this.model:this.orm.get(e):null}return this._toModel}},{key:"throughModel",get:function(){if(void 0===this._throughModel){const e=this.field.getThroughModelName(this.fieldName,this.model);this._throughModel=e?this.orm.get(e):null}return this._throughModel}},{key:"backwardsFieldName",get:function(){return this.field.getBackwardsFieldName(this.model)}}]),e}());var fe=function(){function e(){}var t=e.prototype;return t.getClass=function(){return this.constructor},t.references=function(e){return!1},t.getThroughModelName=function(e,t){return null},o()(e,[{key:"installerClass",get:function(){return he}},{key:"installsForwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}},{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"index",get:function(){return!1}}]),e}();function pe(e,t){return{get(){const{session:{[t]:n}}=this.getClass(),{[e]:r}=this._fields;return n.withId(r)},set(t){this.update({[e]:ne(t)})}}}function me(e,t,n,r,o){return{get(){const{session:{[e]:s,[t]:i,[n]:a}}=this.getClass(),c=o?i:s,u=o?s:i,l=o?r.to:r.from,d=o?r.from:r.to,h=this.getId(),f=a.filter({[l]:h}),p=new Set(f.toRefArray().map(e=>e[d])),m=u.filter(e=>p.has(e[u.idAttribute]));return m.add=function(...e){const t=new Set(e.map(ne)),n=f.filter(e=>t.has(e[d]));if(n.exists()){const e=n.toRefArray().map(e=>e[d]);throw new Error(`Tried to add already existing ${u.modelName} id(s) ${e} to the ${c.modelName} instance with id ${h}`)}t.forEach(e=>{a.create({[d]:e,[l]:h})})},m.clear=function(){f.delete()},m.remove=function(...e){const t=new Set(e.map(ne)),n=f.filter(e=>t.has(e[d]));if(n.count()!==t.size){const e=n.toRefArray().map(e=>e[d]),r=[...t].filter(t=>!e.includes(t));throw new Error(`Tried to delete non-existing ${u.modelName} id(s) ${r} from the ${c.modelName} instance with id ${h}`)}n.delete()},m},set(){throw new Error("Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.")}}}var ye=function(e){function t(t){var n;return(n=e.call(this)||this).opts=t||{},n.opts.hasOwnProperty("getDefault")&&(n.getDefault=n.opts.getDefault),n}return de()(t,e),t.prototype.createForwardsDescriptor=function(e,t){return function(e){return{get(){return this._fields[e]},set(t){return this.set(e,t)},enumerable:!0,configurable:!0}}(e)},t}(fe);var ge=function(e){function t(...t){var n;if(n=e.call(this)||this,1===t.length&&"object"==typeof t[0]){const e=t[0];n.toModelName=ie(e.to),n.relatedName=e.relatedName,n.through=ie(e.through),n.throughFields=e.throughFields,n.as=e.as}else[n.toModelName,n.relatedName]=[ie(t[0]),t[1]];return n}de()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()+"Set"},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())(t.modelName,e)},n.references=function(e){return this.toModelName===e.modelName},o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!0}},{key:"installsBackwardsDescriptor",get:function(){return!0}},{key:"installerClass",get:function(){return function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),t.prototype.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.field.as||this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},t}(he)}}]),t}(fe);var be=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.createForwardsDescriptor=function(e,t,n,r){return pe(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.filter({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse many-to-one relation.")}};var o,s},o()(t,[{key:"index",get:function(){return!0}}]),t}(ge);var we=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.getDefault=function(){return[]},n.getThroughModelName=function(e,t){return this.through||G(t.modelName,e)},n.createForwardsDescriptor=function(e,t,n,r){return me(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!1)},n.createBackwardsDescriptor=function(e,t,n,r){return me(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!0)},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:t.modelName,relatedName:e,through:r.modelName,throughFields:this.getThroughFields(e,t,n,r)})},n.createForwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:n.modelName,relatedName:e,through:this.through,throughFields:this.getThroughFields(e,t,n,r),as:this.as})},n.getThroughFields=function(e,t,n,r){if(this.throughFields){const[e,t]=this.throughFields,o=r.fields[e];return{to:o.references(n)?e:t,from:o.references(n)?t:e}}if(t.modelName===n.modelName)return{to:W(n.modelName),from:J(t.modelName)};const o=e=>Object.keys(r.fields).find(t=>r.fields[t].references(e));return{to:o(n),from:o(t)}},o()(t,[{key:"installsForwardsVirtualField",get:function(){return!0}}]),t}(ge);var ve=function(e){function t(){return e.apply(this,arguments)||this}de()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()},n.createForwardsDescriptor=function(e,t,n,r){return function(...e){return pe(...e)}(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.get({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse one-to-one relation.")}};var o,s},t}(ge);function _e(e){return new ye(e)}function Me(...e){return new be(...e)}function Oe(...e){return new we(...e)}function Ne(...e){return new ve(...e)}function Se(e){const t=e.getClass(),{idAttribute:n,modelName:r}=t;return{table:r,clauses:[{type:L,payload:{[n]:e.getId()}}]}}const ke=function(){function e(e){this._initFields(e)}var t=e.prototype;return t._initFields=function(e){const t=Object(e);this._fields={...t},Object.keys(t).forEach(e=>{e in this||Object.defineProperty(this,e,{get:()=>this._fields[e],set:t=>this.set(e,t),configurable:!0,enumerable:!0})})},e.toString=function(){return`ModelClass: ${this.modelName}`},e.options=function(){return{}},e.markAccessed=function(e){if(void 0===this._session)throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessed\` instead.`].join(""));this.session.markAccessed(this.modelName,e)},e.markFullTableScanned=function(){if(void 0===this._session)throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markFullTableScanned\` instead.`].join(""));this.session.markFullTableScanned(this.modelName)},e.markAccessedIndexes=function(e){if(void 0===this._session)throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessedIndexes\` instead.`].join(""));this.session.markAccessedIndexes(e.map(([e,t])=>[this.modelName,e,t]))},e.connect=function(e){if(!(e instanceof ue))throw new Error("A model can only be connected to instances of Session.");this._session=e},e.getQuerySet=function(){const{querySetClass:e}=this;return new e(this)},e.invalidateClassCache=function(){this.isSetUp=void 0,this.virtualFields={}},e.tableOptions=function(){return"function"==typeof this.backend?(K("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend()):this.backend?(K("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend):"function"==typeof this.options?this.options():this.options},e.create=function(e){if(void 0===this._session)throw new Error([`Tried to create a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].create\` instead.`].join(""));const t={...e},n={},r=Object.keys(this.fields),o=Object.keys(this.virtualFields);r.forEach(r=>{const o=this.fields[r],s=e.hasOwnProperty(r);if(o instanceof we)s&&(n[r]=e[r],o.as||delete t[r]);else if(s){const n=e[r];t[r]=ne(n)}else o.getDefault&&(t[r]=o.getDefault())}),o.forEach(r=>{if(!n.hasOwnProperty(r)){const o=this.virtualFields[r];e.hasOwnProperty(r)&&o instanceof we&&(n[r]=e[r],delete t[r])}});const s=new this(this.session.applyUpdate({action:z,table:this.modelName,payload:t}));return s._refreshMany2Many(n),s},e.upsert=function(e){if(void 0===this.session)throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].upsert\` instead.`].join(""));const{idAttribute:t}=this;if(e.hasOwnProperty(t)){const n=e[t];if(this.idExists(n)){const t=this.withId(n);return t.update(e),t}}return this.create(e)},e.withId=function(e){return this.get({[this.idAttribute]:e})},e.idExists=function(e){return this.exists({[this.idAttribute]:e})},e.exists=function(e){if(void 0===this.session)throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].exists\` instead.`].join(""));return Boolean(this._findDatabaseRows(e).length)},e.get=function(e){const t=this._findDatabaseRows(e);if(0===t.length)return null;if(t.length>1)throw new Error(`Expected to find a single row in \`${this.modelName}.get\`. Found ${t.length}.`);return new this(t[0])},t.getClass=function(){return this.constructor},t.getId=function(){return this._fields[this.getClass().idAttribute]},e._findDatabaseRows=function(e){const t={table:this.modelName};return e&&(t.clauses=[{type:L,payload:e}]),this.session.query(t).rows},t.toString=function(){const e=this.getClass();return`${e.modelName}: {${Object.keys(e.fields).map(t=>{if(e.fields[t]instanceof we){return`${t}: [${this[t].toModelArray().map(e=>e.getId()).join(", ")}]`}return`${t}: ${this._fields[t]}`}).join(", ")}}`},t.equals=function(e){return function(e,t){const n=Object.entries(Object(e));return n.length===Object.keys(t).length&&n.every(([e,n])=>t.hasOwnProperty(e)&&t[e]===n)}(this._fields,e._fields)},t.set=function(e,t){this.update({[e]:t})},t.update=function(e){const t=this.getClass();if(void 0===t.session)throw new Error([`Tried to update a ${t.modelName} model instance without a session. `,"You cannot call `.update` on an instance that you did not receive from the database."].join(""));const n={...e},{fields:r,virtualFields:o}=t,s={};for(const e in n){if(r.hasOwnProperty(e)){const t=r[e];t instanceof be||t instanceof ve?n[e]=ne(n[e]):t instanceof we&&(s[e]=n[e],t.as||delete n[e])}else if(o.hasOwnProperty(e)){o[e]instanceof we&&(s[e]=n[e],delete n[e])}}const i={...this._fields,...n},a=new t(i);this.equals(a)||(this._initFields(i),t.session.applyUpdate({action:V,query:Se(this),payload:n})),this._refreshMany2Many(s)},t.refreshFromState=function(){this._initFields(this.ref)},t.delete=function(){const e=this.getClass();if(void 0===e.session)throw new Error([`Tried to delete a ${e.modelName} model instance without a session. `,"You cannot call `.delete` on an instance that you did not receive from the database."].join(""));this._onDelete(),e.session.applyUpdate({action:q,query:Se(this)})},t._refreshMany2Many=function(e){const t=this.getClass(),{fields:n,virtualFields:r,modelName:o}=t;Object.keys(e).forEach(s=>{const i=!n.hasOwnProperty(s),a=r[s],c=e[s];if(!Array.isArray(c))throw new TypeError(`Failed to resolve many-to-many relationship: ${o}[${s}] must be an array (passed: ${c})`);const u=c.map(ne),l=[...new Set(u)];if(u.length!==l.length)throw new Error(`Found duplicate id(s) when passing "${u}" to ${t.modelName}.${s} value`);const d=a.through||G(t.modelName,s),h=t.session[d];let f,p;i?({from:p,to:f}=a.throughFields):({from:f,to:p}=a.throughFields);const m=function(e,t){const n=e.filter(e=>t.includes(e)),r=e.filter(e=>!n.includes(e)),o=t.filter(e=>!n.includes(e));return r.length||o.length?{delete:r,add:o}:null}(h.filter(e=>e[f]===this[t.idAttribute]).toRefArray().map(e=>e[p]),u);if(m){const{delete:e,add:t}=m;e.length>0&&this[a.as||s].remove(...e),t.length>0&&this[a.as||s].add(...t)}})},t._onDelete=function(){const{virtualFields:e}=this.getClass();for(const t in e){const n=e[t];if(n instanceof we){this[n.as||t].clear()}else if(n instanceof be){const e=this[t];e.exists()&&e.update({[n.relatedName]:null})}else n instanceof ve&&null!==this[t]&&(this[t][n.relatedName]=null)}},e.hasId=function(e){return console.warn("`Model.hasId` has been deprecated. Please use `Model.idExists` instead."),this.idExists(e)},t.getNextState=function(){throw new Error("`Model.prototype.getNextState` has been removed. See the 0.9 migration guide on the GitHub repo.")},o()(e,[{key:"ref",get:function(){const e=this.getClass();return e._findDatabaseRows({[e.idAttribute]:this.getId()})[0]}}],[{key:"idAttribute",get:function(){if(void 0===this._session)throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `,"Create a session using `session = orm.session()` and access ",`\`session["${this.modelName}"].idAttribute\` instead.`].join(""));return this.session.db.describe(this.modelName).idAttribute}},{key:"session",get:function(){return this._session}},{key:"query",get:function(){return this.getQuerySet()}}]),e}();ke.fields={id:_e()},ke.virtualFields={},ke.querySetClass=ce;var Ee=ke,je=n(11),xe=n.n(je),Fe=n(12),Ae=n.n(Fe),Ce=n(13),Ie=n.n(Ce),Re=n(14),De=n.n(Re);const $e={idAttribute:"id",arrName:"items",mapName:"itemsById",fields:{}};var Te=function(){function e(e){Object.assign(this,$e,e)}var t=e.prototype;return t.accessId=function(e,t){return e[this.mapName][t]},t.accessIds=function(e,t){const n=e[this.mapName];return t.map(e=>n[e])},t.idExists=function(e,t){return e[this.mapName].hasOwnProperty(t)},t.accessIdList=function(e){return e[this.arrName]},t.accessList=function(e){return this.accessIds(e,this.accessIdList(e))},t.getMaxId=function(e){return this.getMeta(e,"maxId")},t.setMaxId=function(e,t,n){return this.setMeta(e,t,"maxId",n)},t.nextId=function(e){return e+1},t.getEmptyState=function(){return{...{[this.arrName]:[],[this.mapName]:{}},indexes:Object.keys(this.fields).filter(e=>e!==this.idAttribute).filter(e=>this.fields[e].index).reduce((e,t)=>({...e,[t]:{}}),{}),meta:{}}},t.setMeta=function(e,t,n,r){const{batchToken:o,withMutations:s}=e;if(s){return U.mutable.setIn(["meta",n],r,t)}return U.batch.setIn(o,["meta",n],r,t)},t.getMeta=function(e,t){return e.meta[t]},t.query=function(e,t){if(0===t.length)return this.accessList(e);const{idAttribute:n}=this,r=De()(t,e=>oe(e,n)?1:function({type:e}){return[L,Q].includes(e)}(e)?2:3),o=(t,r)=>{const{type:s,payload:i}=r;if(!t){if(oe(r,n)){const t=i[n],s=Object.keys(i).reduce((e,t)=>(t!==n&&(e[t]=i[t]),e),{}),a=this.idExists(e,t)?[t]:[];return Object.keys(s).length?o(this.accessIds(e,a),{...r,payload:s}):this.accessIds(e,a)}if(s===L&&"object"==typeof i){const t=Object.entries(e.indexes),n=[],s=[];if(t.forEach(([e,t])=>{oe(r,e)&&t.hasOwnProperty(i[e])&&(n.push(t[i[e]]),s.push(e))}),n.length){const t=n.pop(),a=n.reduce((e,t)=>{const n=new Set(t);return e.filter(Set.prototype.has,n)},t),c=Object.keys(i).reduce((e,t)=>(s.includes(t)||(e[t]=i[t]),e),{});return Object.keys(c).length?o(this.accessIds(e,a),{...r,payload:c}):this.accessIds(e,a)}}return o(this.accessList(e),r)}switch(s){case L:return xe()(t,i);case Q:return Ie()(t,i);case"REDUX_ORM_ORDER_BY":{const[e,n]=i;return Ae()(t,e,function(e){if(void 0===e)return;const t=e=>["desc",!1].includes(e)?"desc":"asc";return Array.isArray(e)?e.map(t):t(e)}(n))}default:return t}};return r.reduce(o,void 0)},t.insert=function(e,t,n){const{batchToken:r,withMutations:o}=e,s=n.hasOwnProperty(this.idAttribute);let i=t;const[a,c]=function(e,t){let n,r,o=e;return void 0===o&&(o=-1),void 0===t?(n=o+1,r=n):(n=Math.max(o+1,t),r=t),[n,r]}(this.getMaxId(t),n[this.idAttribute]);i=this.setMaxId(e,t,a);const u=s?n:U.batch.set(r,this.idAttribute,c,n),l=Object.keys(i.indexes).filter(e=>n.hasOwnProperty(e)&&null!==n[e]).map(e=>[e,n[e]]);if(o)return U.mutable.push(c,i[this.arrName]),U.mutable.set(c,u,i[this.mapName]),l.forEach(([e,t])=>{const n=i.indexes[e];n.hasOwnProperty(t)?U.mutable.push(c,n[t]):U.mutable.set(t,[c],n)}),{state:i,created:u};const d=U.batch.merge(r,l.reduce((e,[t,n])=>(e[t]=U.batch.merge(r,{[n]:U.batch.push(r,c,e[t][n]||[])},e[t]),e),{...i.indexes}),i.indexes);return{state:U.batch.merge(r,{[this.arrName]:U.batch.push(r,c,i[this.arrName]),[this.mapName]:U.batch.merge(r,{[c]:u},i[this.mapName]),indexes:d},i),created:u}},t.update=function(e,t,n,r){const{batchToken:o,withMutations:s}=e,i=s?U.mutable.set:U.batch.set(o),a=Object.keys(t.indexes).filter(e=>r.hasOwnProperty(e)),c=[],u=[],l=n.reduce((e,t)=>{const n=a.reduce((e,n)=>({...e,[n]:t[n]}),{}),l=(e=>{return(s?U.mutable.merge:U.batch.merge(o))(r,e)})(t),d=a.reduce((e,t)=>({...e,[t]:l[t]}),{}),h=l[this.idAttribute],f=i(h,l,e);return a.forEach(e=>{const{[e]:t}=n,{[e]:r}=d;t!==r&&(null!=t&&u.push([e,t,h]),null!==r&&c.push([e,r,h]))}),f},t[this.mapName]);let d=t.indexes;return s?(u.forEach(([e,t,n])=>{const r=d[e][t],o=r.indexOf(n);U.mutable.splice(o,1,[],r)}),c.forEach(([e,t,n])=>{U.mutable.push(n,d[e][t])})):(c.length&&(d=U.batch.merge(o,c.reduce((e,[t,n,r])=>(e[t]=U.batch.merge(o,{[n]:U.batch.push(o,r,e[t][n]||[])},e[t]),e),{...d}),d)),u.length&&(d=U.batch.merge(o,u.reduce((e,[t,n,r])=>(e[t]=U.batch.merge(o,{[n]:U.batch.filter(o,e=>e!==r,e[t][n])},e[t]),e),{...d}),d))),U.batch.merge(o,{[this.mapName]:l,indexes:d},t)},t.delete=function(e,t,n){const{batchToken:r,withMutations:o}=e,{arrName:s,mapName:i}=this,a=t[s],c=n.map(e=>e[this.idAttribute]);if(o)return c.forEach(e=>{const n=a.indexOf(e);U.mutable.splice(n,1,[],a),U.mutable.omit(e,t[i])}),Object.values(t.indexes).forEach(e=>Object.values(e).forEach(e=>c.forEach(t=>{const n=e.indexOf(t);-1!==n&&U.mutable.splice(n,1,[],e)}))),t;const u=U.batch.merge(r,Object.entries(t.indexes).reduce((e,[t,n])=>(e[t]=U.batch.merge(r,Object.entries(n).reduce((e,[t,n])=>(e[t]=U.batch.filter(r,e=>!c.includes(e),n),e),{...e[t]}),e[t]),e),{...t.indexes}),t.indexes);return U.batch.merge(r,{[s]:U.batch.filter(r,e=>!c.includes(e),t[s]),[i]:U.batch.omit(r,c,t[i]),indexes:U.batch.merge(r,u,t.indexes)},t)},e}();const Pe={};function Be(e,t,n){const{table:r,clauses:o}=t;return{rows:e[r].query(n[r],o)}}function Ue(e,t,n,r){const{action:o,payload:s}=t;let i,a,c;if(o===z){({table:i}=t);const o=e[i],u=r[i],l=o.insert(n,u,s);a=l.state,c=l.created}else{const{query:u}=t;({table:i}=u);const{rows:l}=Be(e,u,r),d=e[i],h=r[i];if(o===V)a=d.update(n,h,l,s),c=Be(e,u,r).rows;else{if(o!==q)throw new Error(`Database received unknown update type: ${o}`);a=d.delete(n,h,l),c=l}}const u=function(e,t,n,r){const{batchToken:o,withMutations:s}=n;return s?(r[e]=t,r):U.batch.set(o,e,t,r)}(i,a,n,r);return{status:X,state:u,payload:c}}Object.defineProperty(Pe,"@@_______REDUX_ORM_STATE_FLAG",{enumerable:!0,value:!0});var Ve=function(e){const{tables:t}=e,n=Object.entries(t).reduce((e,[t,n])=>({...e,[t]:new Te(n)}),{});return{getEmptyState:()=>Object.entries(n).reduce((e,[t,n])=>({...e,[t]:n.getEmptyState()}),Pe),query:Be.bind(null,n),update:Ue.bind(null,n),describe:e=>n[e]}};let qe=function(){function e({parent:e,orm:t}){this._parent=e,this._orm=t,this.keySelector=Y}return o()(e,[{key:"cachePath",get:function(){return[...this._parent?this._parent.cachePath:[],this.key]}},{key:"orm",get:function(){return this._orm}},{key:"parent",get:function(){return this._parent}}]),e}(),ze=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return de()(t,e),o()(t,[{key:"resultFunc",get:function(){return(e,t,...n)=>{const{[this._model.modelName]:r}=e;return void 0===t?r.all().toModelArray().map(t=>this.valueForInstance(t,e,...n)):Array.isArray(t)?t.map(t=>this.valueForInstance(r.withId(t),e,...n)):this.valueForInstance(r.withId(t),e,...n)}}},{key:"model",get:function(){return this._model}}]),t}(qe);function Le(e,t){return t}let Qe=function(e){function t({field:t,selector:n,...r}){var o;return(o=e.call(this,r)||this)._field=t,o._selector=n,o}return de()(t,e),t.prototype.createResultFunc=function(e){const{idAttribute:t}=this._parent.toModel;return(n,...r)=>{const o=e(n,...r),s=Le(n,...r),i=e=>null===e?null:e.map(e=>this._selector(n,e[t]));return void 0===s||Array.isArray(s)?o.map(i):i(o)}},o()(t,[{key:"selector",get:function(){return this._selector},set:function(e){this._selector=e}},{key:"key",get:function(){return this._selector}}]),t}(ze),Xe=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return de()(t,e),o()(t,[{key:"key",get:function(){return this._model.modelName}},{key:"dependencies",get:function(){return[this._orm,Le]}},{key:"resultFunc",get:function(){return({[this._model.modelName]:e},t)=>{if(void 0===t)return e.all().toRefArray();if(Array.isArray(t))return t.map(t=>{const n=e.withId(t);return n?n.ref:null});const n=e.withId(t);return n?n.ref:null}}},{key:"model",get:function(){return this._model}}]),t}(qe),He=function(e){function t({field:t,fieldModel:n,accessorName:r,isVirtual:o,...s}){var i;return(i=e.call(this,s)||this)._field=t,i._fieldModel=n,i._accessorName=r,i._isVirtual=o,i}de()(t,e);var n=t.prototype;return n.valueForInstance=function(e,t){if(!e)return null;let n;if(this._parent instanceof Xe)n=e[this._accessorName];else{const{[this._parent.toModelName]:r}=t,o=this._parent.valueForInstance(e,t),s=o?new r(o):null;n=s?s[this._accessorName]:null}return n instanceof Ee?n.ref:n instanceof ce?n.toRefArray():n},n.map=function(e){if(e instanceof Xe)throw this.toModelName===e.model.modelName?new Error(`Cannot select models in a \`map()\` call. If you just want the \`${this._accessorName}\` as a ref array then you can simply drop the \`map()\`. Otherwise make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`):new Error(`Cannot select \`${e.model.modelName}\` models in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`);if(e instanceof t||e instanceof Qe){if(this.toModelName!==e.model.modelName)throw new Error(`Cannot select fields of the \`${e.model.modelName}\` model in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`)}else if(!e||"function"!=typeof e||!e.recomputations)throw new Error(`\`map()\` requires a selector as an input. Received: ${JSON.stringify(e)} of type ${typeof e}`);if(!(this._field instanceof be||this._field instanceof we))throw new Error("Cannot map selectors for non-collection fields");return new Qe({parent:this,model:this._model,orm:this._orm,field:this._field,selector:e})},o()(t,[{key:"key",get:function(){return this._accessorName}},{key:"dependencies",get:function(){return[this._orm,Le]}},{key:"toModelName",get:function(){return"this"===this._field.toModelName?this._fieldModel.modelName:this._field.toModelName}},{key:"toModel",get:function(){return this._orm.getDatabase().describe(this.toModelName)}}]),t}(ze);function Ye({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i}){const a=new He({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i});if(!(n instanceof ge))return a;if(e instanceof He&&(e._field instanceof be&&e._isVirtual||e._field instanceof we))throw new Error(`Cannot create a selector for \`${e._accessorName}.${o}\` because \`${e._accessorName}\` is a collection field.`);const{toModelName:c}=n,u=s.get("this"===c?t.modelName:c);return Object.entries(u.fields).forEach(([e,n])=>{const r=n.as||e;Object.defineProperty(a,r,{get:()=>Ye({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!1})})}),Object.entries(u.virtualFields).forEach(([e,n])=>{const r=n.as||e;a.hasOwnProperty(r)||Object.defineProperty(a,r,{get:()=>Ye({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!0})})}),a}const Ke={createDatabase:Ve},Ge=["indexes","meta"],Je=e=>Ge.includes(e);let We=function(){function e(e){const{createDatabase:t}={...Ke,...e||{}};this.createDatabase=t,this.registry=[],this.implicitThroughModels=[],this.installedFields={},this.stateSelector=e?e.stateSelector:null}var t=e.prototype;return t.register=function(...e){e.forEach(e=>{if(void 0===e.modelName)throw new Error("A model was passed that doesn't have a modelName set");e.invalidateClassCache(),this.registerManyToManyModelsFor(e),this.registry.push(e),Object.defineProperty(this,e.modelName,{get:()=>(this._setupModelPrototypes(this.registry),function({model:e,orm:t}){const n=new Xe({parent:null,orm:t,model:e});return Object.entries(e.fields).forEach(([r,o])=>{const s=o.as||r;Object.defineProperty(n,s,{get:()=>Ye({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!1})})}),Object.entries(e.virtualFields).forEach(([r,o])=>{const s=o.as||r;n.hasOwnProperty(s)||Object.defineProperty(n,s,{get:()=>Ye({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!0})})}),n}({model:e,orm:this}))})})},t.registerManyToManyModelsFor=function(e){const{fields:t}=e,n=e.modelName;Object.entries(t).forEach(([e,t])=>{if(!(t instanceof we))return;let r;r="this"===t.toModelName?n:t.toModelName;const s=n===r,i=J(n),a=W(r);if(t.through){if(s&&!t.throughFields)throw new Error("Self-referencing many-to-many relationship at "+`"${n}.${e}" using custom `+`model "${t.through}" has no `+"throughFields key. Cannot determine which fields reference the instances partaking in the relationship.")}else{const t=function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),t}(Ee);t.modelName=G(n,e);const c=function(e){function t(){return e.apply(this,arguments)||this}return de()(t,e),o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}}]),t}(be),u=s?c:be;t.fields={id:_e(),[i]:new u(n),[a]:new u(r)},t.invalidateClassCache(),this.implicitThroughModels.push(t)}})},t.get=function(e){const t=this.registry.concat(this.implicitThroughModels),n=Object.values(t).find(t=>t.modelName===e);if(void 0===n)throw new Error(`Did not find model ${e} from registry.`);return n},t.getModelClasses=function(){return this._setupModelPrototypes(this.registry),this._setupModelPrototypes(this.implicitThroughModels),this.registry.concat(this.implicitThroughModels)},t.generateSchemaSpec=function(){return{tables:this.getModelClasses().reduce((e,t)=>{const n=t.modelName,r=t.tableOptions();return Object.keys(r).filter(Je).forEach(e=>{throw new Error(`Reserved keyword \`${e}\` used in ${n}.options.`)}),e[n]={fields:{...t.fields},...r},e},{})}},t.getDatabase=function(){return this.db||(this.db=this.createDatabase(this.generateSchemaSpec())),this.db},t.getEmptyState=function(){return this.getDatabase().getEmptyState()},t.session=function(e){return new ue(this,this.getDatabase(),e)},t.mutableSession=function(e){return new ue(this,this.getDatabase(),e,!0)},t._setupModelPrototypes=function(e){e.filter(e=>!e.isSetUp).forEach(e=>{const{fields:t,modelName:n,querySetClass:r}=e;Object.entries(t).forEach(([t,r])=>{if(!(r instanceof fe))throw new Error(`${n}.${t} is of type "${typeof r}" `+"but must be an instance of Field. Please use the `attr`, `fk`, `oneToOne` and `many` functions to define fields.");this._isFieldInstalled(n,t)||(this._installField(r,t,e),this._setFieldInstalled(n,t))}),te(e,r),e.isSetUp=!0})},t._isFieldInstalled=function(e,t){return!!this.installedFields.hasOwnProperty(e)&&!!this.installedFields[e][t]},t._setFieldInstalled=function(e,t){this.installedFields.hasOwnProperty(e)||(this.installedFields[e]={}),this.installedFields[e][t]=!0},t._installField=function(e,t,n){new(0,e.installerClass)({field:e,fieldName:t,model:n,orm:this}).run()},t.withMutations=function(e){return K("`ORM.prototype.withMutations` has been deprecated. Use `ORM.prototype.mutableSession` instead."),this.mutableSession(e)},t.from=function(e){return K("`ORM.prototype.from` has been deprecated. Use `ORM.prototype.session` instead."),this.session(e)},t.getDefaultState=function(){return K("`ORM.prototype.getDefaultState` has been deprecated. Use `ORM.prototype.getEmptyState` instead."),this.getEmptyState()},t.define=function(){throw new Error("`ORM.prototype.define` has been removed. Please define a Model class.")},e}();var Ze=n(4),et=n(5),tt=n.n(et);const nt=(e,t)=>e===t,rt=e=>e&&"object"==typeof e&&e.hasOwnProperty("@@_______REDUX_ORM_STATE_FLAG"),ot=(e,t,n)=>t.every((t,r)=>rt(t)&&rt(e[r])||n(t,e[r])),st=(e,t,n)=>{const{accessedInstances:r}=e;return Object.entries(r).every(([r,o])=>{if(e.ormState[r]===t[r])return!0;const{mapName:s}=n.getDatabase().describe(r),{[s]:i}=e.ormState[r],{[s]:a}=t[r];return((e,t,n)=>e.every(e=>t[e]===n[e]))(Object.keys(o),i,a)})},it=(e,t)=>{const{accessedIndexes:n}=e;return Object.entries(n).every(([n,r])=>Object.entries(r).every(([r,o])=>o.every(o=>e.ormState[n].indexes[r][o]===t[n].indexes[r][o])))},at=(e,t)=>e.fullTableScannedModels.every(n=>e.ormState[n]===t[n]);function ct(e,t=nt,n){let r={result:null,args:null,ormState:null,fullTableScannedModels:[],accessedInstances:{},accessedIndexes:{}};return(...o)=>{const[s,...i]=o;if(Boolean(r.args)&&ot(r.args,i,t)&&at(r,s)&&it(r,s)&&st(r,s,n))return r.result;const a=n.session(s),c=i.map(e=>rt(e)?a:e),u=e.apply(null,c);return r={args:i,result:u,ormState:s,accessedInstances:a.accessedModelInstances,accessedIndexes:a.accessedIndexes,fullTableScannedModels:a.fullTableScannedModels},u}}function ut(e,t){e.sessionBoundModels.forEach(n=>{"function"==typeof n.reducer&&n.reducer(t,n,e)})}function lt(e,t=ut){return(n,r)=>{const o=e.session(n||e.getEmptyState());return t(o,r),o.state}}function dt(e){return e instanceof We?e:e instanceof qe&&e._orm}const ht=new Map,ft=Symbol.for("REDUX_ORM_SELECTOR");function pt(e){if("function"==typeof e)return e;if(e instanceof We)return e.stateSelector;if(e instanceof Qe&&(e.selector=pt(e.selector)),e instanceof qe){const{orm:t,cachePath:n}=e;let r;ht.has(t)||ht.set(t,new Map),r=ht.get(t);for(let e=0;e<n.length;++e){const t=n[e];r.has(t)||r.set(t,new Map),r=r.get(t)}if(r&&r.has(ft))return r.get(ft);const o=function e(t){if(t instanceof Qe){const n=e(t.parent);return t.createResultFunc(n)}return tt()(t.dependencies,t.resultFunc)({keySelector:t.keySelector,cacheObject:new et.FlatMapCache,selectorCreator:mt})}(e);return r.set(ft,o),o}throw new Error(`Failed to interpret selector argument: ${JSON.stringify(e)} of type ${typeof e}`)}function mt(...e){if(!e.length)throw new Error("Cannot create a selector without arguments.");const t=e.pop(),n=Array.isArray(e[0])?e[0]:e,r=n.map(dt).find(Boolean),o=n.map(pt);if("function"==typeof t){if(!r)throw new Error("Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.");if(!r.stateSelector)throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");if("function"!=typeof r.stateSelector)throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(r.stateSelector)} of type ${typeof r.stateSelector}`);return Object(Ze.createSelectorCreator)(ct,void 0,r)([r.stateSelector,...o],t)}if(t instanceof We)throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.");return o.length&&console.warn("Your input selectors will be ignored: the passed result function does not require any input."),pt(t)}n.d(t,"Schema",(function(){return yt})),n.d(t,"Backend",(function(){return gt})),n.d(t,"Attribute",(function(){return ye})),n.d(t,"QuerySet",(function(){return ce})),n.d(t,"Model",(function(){return Ee})),n.d(t,"ORM",(function(){return We})),n.d(t,"Session",(function(){return ue})),n.d(t,"ForeignKey",(function(){return be})),n.d(t,"ManyToMany",(function(){return we})),n.d(t,"OneToOne",(function(){return ve})),n.d(t,"fk",(function(){return Me})),n.d(t,"many",(function(){return Oe})),n.d(t,"attr",(function(){return _e})),n.d(t,"oneToOne",(function(){return Ne})),n.d(t,"createReducer",(function(){return lt})),n.d(t,"createSelector",(function(){return mt}));const yt=function(){throw new Error("Schema has been renamed to ORM. Please import ORM instead of Schema from Redux-ORM.")},gt=function(){throw new Error("Having a custom Backend instance is now unsupported. Documentation for database customization is upcoming, for now please look at the db folder in the source.")};t.default=Ee}])}));
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("ReduxOrm",[],t):"object"==typeof exports?exports.ReduxOrm=t():e.ReduxOrm=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=37)}([function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(15);e.exports=function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?(e.exports=n=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),n(t)}e.exports=n,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(16),o=n(17),s=n(18),i=n(19);e.exports=function(e){return r(e)||o(e)||s(e)||i()},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";function r(e,t){return e===t}function o(e,t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,o=0;o<r;o++)if(!e(t[o],n[o]))return!1;return!0}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r,n=null,s=null;return function(){return o(t,n,arguments)||(s=e.apply(null,arguments)),n=arguments,s}}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return function(){for(var t=arguments.length,r=Array(t),o=0;o<t;o++)r[o]=arguments[o];var a=0,c=r.pop(),u=i(r),l=e.apply(void 0,[function(){return a++,c.apply(null,arguments)}].concat(n)),d=s((function(){for(var e=[],t=u.length,n=0;n<t;n++)e.push(u[n].apply(null,arguments));return l.apply(null,e)}));return d.resultFunc=c,d.recomputations=function(){return a},d.resetRecomputations=function(){return a=0},d}}t.__esModule=!0,t.defaultMemoize=s,t.createSelectorCreator=a,t.createStructuredSelector=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c;if("object"!=typeof e)throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))};var c=t.createSelector=a(s)},function(e,t,n){!function(e,t){"use strict";function n(e){return"string"==typeof e||"number"==typeof e}var r=function(){function e(){this._cache={}}var t=e.prototype;return t.set=function(e,t){this._cache[e]=t},t.get=function(e){return this._cache[e]},t.remove=function(e){delete this._cache[e]},t.clear=function(){this._cache={}},t.isValidCacheKey=function(e){return n(e)},e}(),o=r,s=function(){return!0};function i(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return function(e,r){if(r)throw new Error('[re-reselect] "options" as second argument is not supported anymore. Please provide an option object as single argument.');var i="function"==typeof e?{keySelector:e}:Object.assign({},e),a=0,c=n.pop(),u=Array.isArray(n[0])?n[0]:[].concat(n);n.push((function(){return a++,c.apply(void 0,arguments)}));var l=i.cacheObject||new o,d=i.selectorCreator||t.createSelector,h=l.isValidCacheKey||s;i.keySelectorCreator&&(i.keySelector=i.keySelectorCreator({keySelector:i.keySelector,inputSelectors:u,resultFunc:c}));var f=function(){var e=i.keySelector.apply(i,arguments);if(h(e)){var t=l.get(e);return void 0===t&&(t=d.apply(void 0,n),l.set(e,t)),t.apply(void 0,arguments)}console.warn('[re-reselect] Invalid cache key "'+e+'" has been returned by keySelector function.')};return f.getMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);return l.get(e)},f.removeMatchingSelector=function(){var e=i.keySelector.apply(i,arguments);l.remove(e)},f.clearCache=function(){l.clear()},f.resultFunc=c,f.dependencies=u,f.cache=l,f.recomputations=function(){return a},f.resetRecomputations=function(){return a=0},f.keySelector=i.keySelector,f}}function a(e){if(void 0===e)throw new Error('Missing the required property "cacheSize".');if(!Number.isInteger(e)||e<=0)throw new Error('The "cacheSize" property must be a positive integer value.')}var c=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._cacheOrdering.push(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._cache[e]},t.remove=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t.isValidCacheKey=function(e){return n(e)},e}(),u=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache={},this._cacheOrdering=[],this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache[e]=t,this._registerCacheHit(e),this._cacheOrdering.length>this._cacheSize){var n=this._cacheOrdering[0];this.remove(n)}},t.get=function(e){return this._registerCacheHit(e),this._cache[e]},t.remove=function(e){this._deleteCacheHit(e),delete this._cache[e]},t.clear=function(){this._cache={},this._cacheOrdering=[]},t._registerCacheHit=function(e){this._deleteCacheHit(e),this._cacheOrdering.push(e)},t._deleteCacheHit=function(e){var t=this._cacheOrdering.indexOf(e);t>-1&&this._cacheOrdering.splice(t,1)},t.isValidCacheKey=function(e){return n(e)},e}(),l=function(){function e(){this._cache=new Map}var t=e.prototype;return t.set=function(e,t){this._cache.set(e,t)},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),d=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){return this._cache.get(e)},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}(),h=function(){function e(e){var t=(void 0===e?{}:e).cacheSize;a(t),this._cache=new Map,this._cacheSize=t}var t=e.prototype;return t.set=function(e,t){if(this._cache.set(e,t),this._cache.size>this._cacheSize){var n=this._cache.keys().next().value;this.remove(n)}},t.get=function(e){var t=this._cache.get(e);return this._cache.has(e)&&(this.remove(e),this._cache.set(e,t)),t},t.remove=function(e){this._cache.delete(e)},t.clear=function(){this._cache.clear()},e}();e.FifoMapCache=d,e.FifoObjectCache=c,e.FlatMapCache=l,e.FlatObjectCache=r,e.LruMapCache=h,e.LruObjectCache=u,e.createCachedSelector=i,e.createStructuredCachedSelector=function(e){return t.createStructuredSelector(e,i)},e.default=i,Object.defineProperty(e,"__esModule",{value:!0})}(t,n(5))},function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(20),o=n(21),s=n(9),i=n(22),a=n(23),c=n(24),u=n(25),l=n(10),d=n(4);e.exports=function(e,t,n){t=t.length?r(t,(function(e){return d(e)?function(t){return o(t,1===e.length?e[0]:e)}:e})):[l];var h=-1;t=r(t,c(s));var f=i(e,(function(e,n,o){return{criteria:r(t,(function(t){return t(e)})),index:++h,value:e}}));return a(f,(function(e,t){return u(e,t,n)}))}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t,n){var r=n(8),o=n(4);e.exports=function(e,t,n,s){return null==e?[]:(o(t)||(t=null==t?[]:[t]),o(n=s?void 0:n)||(n=null==n?[]:[n]),r(e,t,n))}},function(e,t,n){var r=n(28),o=n(29),s=n(9),i=n(4),a=n(30);e.exports=function(e,t){return(i(e)?r:o)(e,a(s(t,3)))}},function(e,t,n){var r=n(31),o=n(8),s=n(32),i=n(36),a=s((function(e,t){if(null==e)return[];var n=t.length;return n>1&&i(e,t[0],t[1])?t=[]:n>2&&i(t[0],t[1],t[2])&&(t=[t[0]]),o(e,r(t,1),[])}));e.exports=a},function(e,t){function n(t,r){return e.exports=n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e.exports.default=e.exports,e.exports.__esModule=!0,n(t,r)}e.exports=n,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(7);e.exports=function(e){if(Array.isArray(e))return r(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(7);e.exports=function(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}},function(e,t){e.exports=function(e,t){var n=e.length;for(e.sort(t);n--;)e[n]=e[n].value;return e}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){var r=n(26);e.exports=function(e,t,n){for(var o=-1,s=e.criteria,i=t.criteria,a=s.length,c=n.length;++o<a;){var u=r(s[o],i[o]);if(u)return o>=c?u:u*("desc"==n[o]?-1:1)}return e.index-t.index}},function(e,t,n){var r=n(27);e.exports=function(e,t){if(e!==t){var n=void 0!==e,o=null===e,s=e==e,i=r(e),a=void 0!==t,c=null===t,u=t==t,l=r(t);if(!c&&!l&&!i&&e>t||i&&a&&u&&!c&&!l||o&&a&&u||!n&&u||!s)return 1;if(!o&&!i&&!l&&e<t||l&&n&&s&&!o&&!i||c&&n&&s||!a&&s||!u)return-1}return 0}},function(e,t){e.exports=function(){return!1}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,s=[];++n<r;){var i=e[n];t(i,n,e)&&(s[o++]=i)}return s}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}},function(e,t){e.exports=function(e){return e&&e.length?e[0]:void 0}},function(e,t,n){var r=n(10),o=n(33),s=n(35);e.exports=function(e,t){return s(o(e,t,r),e+"")}},function(e,t,n){var r=n(34),o=Math.max;e.exports=function(e,t,n){return t=o(void 0===t?e.length-1:t,0),function(){for(var s=arguments,i=-1,a=o(s.length-t,0),c=Array(a);++i<a;)c[i]=s[t+i];i=-1;for(var u=Array(t+1);++i<t;)u[i]=s[i];return u[t]=n(c),r(e,this,u)}}},function(e,t){e.exports=function(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}},function(e,t){e.exports=function(e){return e}},function(e,t){e.exports=function(){return!1}},function(e,t,n){"use strict";n.r(t),n.d(t,"Attribute",(function(){return he})),n.d(t,"QuerySet",(function(){return oe})),n.d(t,"Model",(function(){return Oe})),n.d(t,"ORM",(function(){return Ye})),n.d(t,"Schema",(function(){return ct})),n.d(t,"Backend",(function(){return ut})),n.d(t,"Session",(function(){return se})),n.d(t,"ForeignKey",(function(){return pe})),n.d(t,"ManyToMany",(function(){return me})),n.d(t,"OneToOne",(function(){return ye})),n.d(t,"fk",(function(){return be})),n.d(t,"many",(function(){return we})),n.d(t,"attr",(function(){return ge})),n.d(t,"oneToOne",(function(){return ve})),n.d(t,"createReducer",(function(){return nt})),n.d(t,"createSelector",(function(){return at}));var r=n(0),o=n.n(r),s=n(3),i=n.n(s),a=n(2),c=n.n(a);function u(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function l(e){return function t(n){return 0===arguments.length||u(n)?t:e.apply(this,arguments)}}function d(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,s){return t.apply(this,arguments)};case 6:return function(e,n,r,o,s,i){return t.apply(this,arguments)};case 7:return function(e,n,r,o,s,i,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,s,i,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,s,i,a,c,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,s,i,a,c,u,l){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function h(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return u(n)?t:l((function(t){return e(n,t)}));default:return u(n)&&u(r)?t:u(n)?l((function(t){return e(t,r)})):u(r)?l((function(t){return e(n,t)})):e(n,r)}}}var f=h((function(e,t){return 1===e?l(t):d(e,function e(t,n,r){return function(){for(var o=[],s=0,i=t,a=0;a<n.length||s<arguments.length;){var c;a<n.length&&(!u(n[a])||s>=arguments.length)?c=n[a]:(c=arguments[s],s+=1),o[a]=c,u(c)||(i-=1),a+=1}return i<=0?r.apply(this,o):d(i,e(t,o,r))}}(e,[],t))})),p=l((function(e){return f(e.length,e)})),m={"@@functional/placeholder":!0};function y(e,t){for(var n in e)e.hasOwnProperty(n)&&t(e[n],n)}function g(e,t){return!!t&&e["@@_______immutableOpsOwnerID"]===t}var b="function"==typeof Symbol?function(){return Symbol("ownerID")}:function(){return{}};function w(e,t){return t&&function(e,t){Object.defineProperty(e,"@@_______immutableOpsOwnerID",{value:t,configurable:!0,enumerable:!1})}(e,t),e}function v(e){return e instanceof Array?e:[e]}function _(e){return"string"==typeof e?-1===e.indexOf(".")?[e]:e.split("."):e}function M(e,t,n){return n[e]=t,n}function O(e,t,n){var r=v(t);return e?r.forEach((function(t){y(t,(function(t,r){var o;e&&n.hasOwnProperty(r)?(o="object"===c()(t)?O(e,[t],n[r]):t,n[r]=o):n[r]=t}))})):Object.assign.apply(Object,[n].concat(i()(r))),n}var x=O.bind(null,!1),N=O.bind(null,!0);function S(e,t){return v(e).forEach((function(e){delete t[e]})),t}function k(e,t,n){return e[n]!==t[n]}function E(e,t,n,r){if(g(r,t))return O(e,n,r);var o=v(n),s=!1,i=r,a=function(){s||(s=!0,w(i=Object.assign({},r),t))};return o.forEach((function(n){y(n,(function(o,s){if(e&&r.hasOwnProperty(s)){var u=i[s];if("object"===c()(o)&&!(o instanceof Array)){if(k(i,n,s)){var l=E(e,t,o,u);l!==u&&(a(),i[s]=l)}return!0}}k(i,n,s)&&(a(),i[s]=o)}))})),i}var j=E.bind(null,!0);function F(e,t,n,r){if(g(r,e))return M(t,n,r);if(r[t]===n)return r;var o=function(e){for(var t=new Array(e.length),n=0;n<e.length;n++)t[n]=e[n];return t}(r);return o[t]=n,w(o,e),o}function A(e,t){for(var n=0,r=0;n<t.length;){e(t[n],r)?n++:t.splice(n,1),r++}return t}function C(e,t,n,r){var o=v(n);return r.splice.apply(r,[e,t].concat(i()(o))),r}function I(e,t,n){return C(e,0,t,n)}function R(e,t,n,r,o){if(g(o,e))return C(t,n,r,o);var s=v(r),a=o.slice();return w(a,e),a.splice.apply(a,[t,n].concat(i()(s))),a}function D(e,t,n,r){return g(r,e)?I(t,n,r):R(e,t,0,n,r)}var T={merge:E.bind(null,!1),deepMerge:j,omit:function(e,t,n){if(g(n,e))return S(t,n);var r=v(t).filter((function(e){return n.hasOwnProperty(e)}));if(0===r.length)return n;var o=Object.assign({},n);return r.forEach((function(e){delete o[e]})),w(o,e),o},setIn:function(e,t,n,r){var o=_(t),s=function(e,t){for(var n=_(e),r=t,o=0;o<n.length;o++){var s=r[n[o]];if(o===n.length-1)return s;if("object"!==c()(s))return;r=s}}(o,r);if(n===s)return r;var i,a=o.length,u=i=g(r,e)?r:Object.assign(w({},e),r);return o.forEach((function(t,r){if(r!==a-1){var s=i[t],u=c()(s);if("object"!==u){if("undefined"===u){var l=w({},e);return i[t]=l,void(i=l)}var d="".concat(o[r-1],".").concat(t);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(d,"."))}if(g(s,e))i=s;else{var h=w({},e);i[t]=Object.assign(h,s),i=h}}else i[t]=n})),u},insert:D,push:function(e,t,n){return D(e,n.length,t,n)},filter:function(e,t,n){if(g(n,e))return A(t,n);var r=n.filter(t);return r.length===n.length?n:(w(r,e),r)},splice:R,set:function(e,t,n,r){if(function(e){return e&&"object"===c()(e)&&"number"==typeof e.length&&e.length>=0&&e.length%1==0}(r))return F(e,t,n,r);if(g(r,e))return M(t,n,r);if(r[t]===n)return r;var o=Object.assign({},r);return w(o,e),o[t]=n,o}},$={merge:x,deepMerge:N,omit:S,setIn:function(e,t,n){for(var r=_(e),o=r.length,s=!1,i=0,a=n,u=r[i];!s;)if(i===o-1)a[u]=t,s=!0;else{var l=c()(a[u]);if("undefined"===l){var d={};w(d,null),a[u]=d}else if("object"!==l){var h="".concat(r[i-1],".").concat(u);throw new Error("A non-object value was encountered when traversing setIn path at ".concat(h,"."))}a=a[u],u=r[++i]}return n},insert:I,push:function(e,t){var n=v(e);return t.push.apply(t,i()(n)),t},filter:A,splice:C,set:M};var P=function(){var e=Object.assign({},T);y(e,(function(t,n){e[n]=p(t.bind(null,null))}));var t=Object.assign({},$);y(t,(function(e,n){t[n]=p(e)}));var n=Object.assign({},T);return y(n,(function(e,t){n[t]=p(e)})),Object.assign(e,{mutable:t,batch:n,batched:function(e,t){var n,r;"function"==typeof e?(r=e,n=b()):(n=e,r=t);var o=Object.assign({},T);return y(o,(function(e,t){o[t]=p(e.bind(null,n))})),r(o)},__:m,getBatchToken:b})}();const B="REDUX_ORM_UPDATE",U="REDUX_ORM_DELETE",V="REDUX_ORM_FILTER",q="REDUX_ORM_EXCLUDE",z=Symbol("REDUX_ORM_ALL_INSTANCES"),L=(e,t)=>void 0===t?z:t;function Q(e){return("function"==typeof console.warn?console.warn.bind(console):console.log.bind(console))(e)}function X(e,t){return e+((n=t).charAt(0).toUpperCase()+n.slice(1));var n}function H(e){return`from${e}Id`}function Y(e){return`to${e}Id`}function K(e){return function(...t){return this.getQuerySet()[e](...t)}}function G(e){return function(){return this.getQuerySet()[e]}}function J(e,t){const n=t.sharedMethods.slice();!function(e,t){let n=e;for(;n!==Function.prototype;)t(n),n=Object.getPrototypeOf(n)}(t,t=>{for(let r=0;r<n.length;r++){let o=!1;const s=n[r],i=Object.getOwnPropertyDescriptor(t.prototype,s);void 0!==i&&(void 0!==i.get?(i.get=G(s),Object.defineProperty(e,s,i)):e[s]=K(s),o=!0),o&&n.splice(r--,1)}})}function W(e){return null!=e&&"function"==typeof e.getId?e.getId():e}const{getBatchToken:Z}=P;function ee({type:e,payload:t},n){if(e!==V)return!1;if("object"!=typeof t)return!1;if(!t.hasOwnProperty(n))return!1;const r=t[n];return null!==r&&void 0!==r}function te(e,t){return Object.entries(e).reduce((e,[n,r])=>(e[n]=t(r),e),{})}function ne(e){return e&&"string"!=typeof e?e.modelName:e}const re=function(){function e(e,t,n){Object.assign(this,{modelClass:e,clauses:t||[]}),this._opts=n}e.addSharedMethod=function(e){this.sharedMethods=this.sharedMethods.concat(e)};var t=e.prototype;return t._new=function(e,t){const n={...this._opts,...t};return new this.constructor(this.modelClass,e,n)},t.toString=function(){this._evaluate();return"QuerySet contents:\n - "+this.rows.map(({id:e})=>this.modelClass.withId(e).toString()).join("\n - ")},t.toRefArray=function(){return this._evaluate()},t.toModelArray=function(){const{modelClass:e}=this;return this._evaluate().map(t=>new e(t))},t.count=function(){return this._evaluate(),this.rows.length},t.exists=function(){return Boolean(this.count())},t.at=function(e){const{modelClass:t}=this,n=this._evaluate();if(e>=0&&e<n.length)return new t(n[e])},t.first=function(){return this.at(0)},t.last=function(){const e=this._evaluate();return this.at(e.length-1)},t.all=function(){return this._new(this.clauses)},t.filter=function(e){const t="object"==typeof e?te(e,W):e,n={type:V,payload:t};return this._new(this.clauses.concat(n))},t.exclude=function(e){const t="object"==typeof e?te(e,W):e,n={type:q,payload:t};return this._new(this.clauses.concat(n))},t._evaluate=function(){if(void 0===this.modelClass.session)throw new Error([`Tried to query the ${this.modelClass.modelName} model's table without a session. `,"Create a session using `session = orm.session()` and use ",`\`session["${this.modelClass.modelName}"]\` for querying instead.`].join(""));if(!this._evaluated){const{session:e,modelName:t}=this.modelClass,n={table:t,clauses:this.clauses};this.rows=e.query(n).rows,this._evaluated=!0}return this.rows},t.orderBy=function(e,t){const n={type:"REDUX_ORM_ORDER_BY",payload:[e,t]};return this._new(this.clauses.concat(n))},t.update=function(e){const{session:t,modelName:n}=this.modelClass;t.applyUpdate({action:B,query:{table:n,clauses:this.clauses},payload:e}),this._evaluated=!1},t.delete=function(){const{session:e,modelName:t}=this.modelClass;this.toModelArray().forEach(e=>e._onDelete()),e.applyUpdate({action:U,query:{table:t,clauses:this.clauses}}),this._evaluated=!1},t.map=function(){throw new Error("`QuerySet.prototype.map` has been removed. Call `.toModelArray()` or `.toRefArray()` first to map.")},t.forEach=function(){throw new Error("`QuerySet.prototype.forEach` has been removed. Call `.toModelArray()` or `.toRefArray()` first to iterate.")},o()(e,[{key:"withModels",get:function(){throw new Error("`QuerySet.prototype.withModels` has been removed. Use `.toModelArray()` or predicate functions that instantiate Models from refs, e.g. `new Model(ref)`.")}},{key:"withRefs",get:function(){Q("`QuerySet.prototype.withRefs` has been deprecated. Query building operates on refs only now.")}}]),e}();re.sharedMethods=["count","at","all","last","first","filter","exclude","orderBy","update","delete"];var oe=re;var se=function(){function e(e,t,n,r,o){this.schema=e,this.db=t,this.state=n||t.getEmptyState(),this.initialState=this.state,this.withMutations=Boolean(r),this.batchToken=o||b(),this.modelData={},this.models=e.getModelClasses(),this.sessionBoundModels=this.models.map(e=>{function t(){return Reflect.construct(e,arguments,t)}return Reflect.setPrototypeOf(t.prototype,e.prototype),Reflect.setPrototypeOf(t,e),Object.defineProperty(this,e.modelName,{get:()=>t}),t.connect(this),t})}var t=e.prototype;return t.getDataForModel=function(e){return this.modelData[e]||(this.modelData[e]={}),this.modelData[e]},t.getModelData=function(){return this.modelData},t.markAccessed=function(e,t){const n=this.getDataForModel(e);n.accessedInstances||(n.accessedInstances={}),t.forEach(e=>{n.accessedInstances[e]=!0})},t.markFullTableScanned=function(e){this.getDataForModel(e).fullTableScanned=!0},t.markAccessedIndexes=function(e){e.forEach(([e,t,n])=>{const r=this.getDataForModel(e);r.accessedIndexes||(r.accessedIndexes={}),r.accessedIndexes[t]=[...r.accessedIndexes[t]||[],n]})},t.applyUpdate=function(e){const t=this._getTransaction(e),n=this.db.update(e,t,this.state),{status:r,state:o,payload:s}=n;if("SUCCESS"!==r)throw new Error(`Applying update failed with status ${r}. Payload: ${s}`);return this.state=o,s},t.query=function(e){const t=this.db.query(e,this.state);return this._markAccessedByQuery(e,t),t},t._getTransaction=function(e){const{withMutations:t}=this,{action:n}=e;let{batchToken:r}=this;return[B,U].includes(n)&&(r=b()),{batchToken:r,withMutations:t}},t._markAccessedByQuery=function(e,t){const{table:n,clauses:r}=e,{rows:o}=t,{idAttribute:s}=this[n],i=new Set(o.map(e=>e[s])),a=r.some(e=>!!ee(e,s)&&(i.add(e.payload[s]),!0)),c=[],{indexes:u}=this.state[n];r.forEach(e=>{Object.keys(u).forEach(t=>{if(!ee(e,t))return;const r=e.payload[t];c.push([n,t,r])})}),a?this.markAccessed(n,i):c.length?(this.markAccessed(n,i),this.markAccessedIndexes(c)):this.markFullTableScanned(n)},t.getNextState=function(){return Q("`Session.prototype.getNextState` has been deprecated. Access the `Session.prototype.state` property instead."),this.state},t.reduce=function(){throw new Error("`Session.prototype.reduce` has been removed. The Redux integration API is now decoupled from ORM and Session - see the 0.9 migration guide in the GitHub repo.")},o()(e,[{key:"accessedModelInstances",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedInstances&&(e[t]=n.accessedInstances),e),{})}},{key:"fullTableScannedModels",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.fullTableScanned&&e.push(t),e),[])}},{key:"accessedIndexes",get:function(){return Object.entries(this.getModelData()).reduce((e,[t,n])=>(n.accessedIndexes&&(e[t]=n.accessedIndexes),e),{})}}]),e}(),ie=n(1),ae=n.n(ie);var ce=function(e){function t(){return e.apply(this,arguments)||this}ae()(t,e);var n=t.prototype;return n.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installForwardsVirtualField=function(){this.model.virtualFields[this.fieldName]=this.field.createForwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},n.installBackwardsDescriptor=function(){if(Object.getOwnPropertyDescriptor(this.toModel.prototype,this.backwardsFieldName))throw new Error((e=this.model.modelName,t=this.fieldName,n=this.toModel.modelName,[`Reverse field ${this.backwardsFieldName} already defined`,` on model ${n}. To fix, set a custom related`,` name on ${e}.${t}.`].join("")));var e,t,n;Object.defineProperty(this.toModel.prototype,this.backwardsFieldName,this.field.createBackwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},n.installBackwardsVirtualField=function(){this.toModel.virtualFields[this.backwardsFieldName]=this.field.createBackwardsVirtualField(this.fieldName,this.model,this.toModel,this.throughModel)},t}(function(){function e(e){this.field=e.field,this.fieldName=e.fieldName,this.model=e.model,this.orm=e.orm,this.field.references(this.model)&&(this.field.toModelName="this")}return e.prototype.run=function(){this.installForwardsDescriptor(),this.field.installsForwardsVirtualField&&this.installForwardsVirtualField(),this.field.installsBackwardsDescriptor&&this.installBackwardsDescriptor(),this.field.installsBackwardsVirtualField&&this.installBackwardsVirtualField()},o()(e,[{key:"toModel",get:function(){if(void 0===this._toModel){const{toModelName:e}=this.field;this._toModel=e?"this"===e?this.model:this.orm.get(e):null}return this._toModel}},{key:"throughModel",get:function(){if(void 0===this._throughModel){const e=this.field.getThroughModelName(this.fieldName,this.model);this._throughModel=e?this.orm.get(e):null}return this._throughModel}},{key:"backwardsFieldName",get:function(){return this.field.getBackwardsFieldName(this.model)}}]),e}());var ue=function(){function e(){}var t=e.prototype;return t.getClass=function(){return this.constructor},t.references=function(e){return!1},t.getThroughModelName=function(e,t){return null},o()(e,[{key:"installerClass",get:function(){return ce}},{key:"installsForwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}},{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"index",get:function(){return!1}}]),e}();function le(e,t){return{get(){const{session:{[t]:n}}=this.getClass(),{[e]:r}=this._fields;return n.withId(r)},set(t){this.update({[e]:W(t)})}}}function de(e,t,n,r,o){return{get(){const{session:{[e]:s,[t]:i,[n]:a}}=this.getClass(),c=o?i:s,u=o?s:i,l=o?r.to:r.from,d=o?r.from:r.to,h=this.getId(),f=a.filter({[l]:h}),p=new Set(f.toRefArray().map(e=>e[d])),m=u.filter(e=>p.has(e[u.idAttribute]));return m.add=function(...e){const t=new Set(e.map(W)),n=f.filter(e=>t.has(e[d]));if(n.exists()){const e=n.toRefArray().map(e=>e[d]);throw new Error(`Tried to add already existing ${u.modelName} id(s) ${e} to the ${c.modelName} instance with id ${h}`)}t.forEach(e=>{a.create({[d]:e,[l]:h})})},m.clear=function(){f.delete()},m.remove=function(...e){const t=new Set(e.map(W)),n=f.filter(e=>t.has(e[d]));if(n.count()!==t.size){const e=n.toRefArray().map(e=>e[d]),r=[...t].filter(t=>!e.includes(t));throw new Error(`Tried to delete non-existing ${u.modelName} id(s) ${r} from the ${c.modelName} instance with id ${h}`)}n.delete()},m},set(){throw new Error("Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.")}}}var he=function(e){function t(t){var n;return(n=e.call(this)||this).opts=t||{},n.opts.hasOwnProperty("getDefault")&&(n.getDefault=n.opts.getDefault),n}return ae()(t,e),t.prototype.createForwardsDescriptor=function(e,t){return function(e){return{get(){return this._fields[e]},set(t){return this.set(e,t)},enumerable:!0,configurable:!0}}(e)},t}(ue);var fe=function(e){function t(...t){var n;if(n=e.call(this)||this,1===t.length&&"object"==typeof t[0]){const e=t[0];n.toModelName=ne(e.to),n.relatedName=e.relatedName,n.through=ne(e.through),n.throughFields=e.throughFields,n.as=e.as}else[n.toModelName,n.relatedName]=[ne(t[0]),t[1]];return n}ae()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()+"Set"},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())(t.modelName,e)},n.references=function(e){return this.toModelName===e.modelName},o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!0}},{key:"installsBackwardsDescriptor",get:function(){return!0}},{key:"installerClass",get:function(){return function(e){function t(){return e.apply(this,arguments)||this}return ae()(t,e),t.prototype.installForwardsDescriptor=function(){Object.defineProperty(this.model.prototype,this.field.as||this.fieldName,this.field.createForwardsDescriptor(this.fieldName,this.model,this.toModel,this.throughModel))},t}(ce)}}]),t}(ue);var pe=function(e){function t(){return e.apply(this,arguments)||this}ae()(t,e);var n=t.prototype;return n.createForwardsDescriptor=function(e,t,n,r){return le(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.filter({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse many-to-one relation.")}};var o,s},o()(t,[{key:"index",get:function(){return!0}}]),t}(fe);var me=function(e){function t(){return e.apply(this,arguments)||this}ae()(t,e);var n=t.prototype;return n.getDefault=function(){return[]},n.getThroughModelName=function(e,t){return this.through||X(t.modelName,e)},n.createForwardsDescriptor=function(e,t,n,r){return de(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!1)},n.createBackwardsDescriptor=function(e,t,n,r){return de(t.modelName,n.modelName,r.modelName,this.getThroughFields(e,t,n,r),!0)},n.createBackwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:t.modelName,relatedName:e,through:r.modelName,throughFields:this.getThroughFields(e,t,n,r)})},n.createForwardsVirtualField=function(e,t,n,r){return new(this.getClass())({to:n.modelName,relatedName:e,through:this.through,throughFields:this.getThroughFields(e,t,n,r),as:this.as})},n.getThroughFields=function(e,t,n,r){if(this.throughFields){const[e,t]=this.throughFields,o=r.fields[e];return{to:o.references(n)?e:t,from:o.references(n)?t:e}}if(t.modelName===n.modelName)return{to:Y(n.modelName),from:H(t.modelName)};const o=e=>Object.keys(r.fields).find(t=>r.fields[t].references(e));return{to:o(n),from:o(t)}},o()(t,[{key:"installsForwardsVirtualField",get:function(){return!0}}]),t}(fe);var ye=function(e){function t(){return e.apply(this,arguments)||this}ae()(t,e);var n=t.prototype;return n.getBackwardsFieldName=function(e){return this.relatedName||e.modelName.toLowerCase()},n.createForwardsDescriptor=function(e,t,n,r){return function(...e){return le(...e)}(e,n.modelName)},n.createBackwardsDescriptor=function(e,t,n,r){return o=e,s=t.modelName,{get(){const{session:{[s]:e}}=this.getClass();return e.get({[o]:this.getId()})},set(){throw new Error("Can't mutate a reverse one-to-one relation.")}};var o,s},t}(fe);function ge(e){return new he(e)}function be(...e){return new pe(...e)}function we(...e){return new me(...e)}function ve(...e){return new ye(...e)}function _e(e){const t=e.getClass(),{idAttribute:n,modelName:r}=t;return{table:r,clauses:[{type:V,payload:{[n]:e.getId()}}]}}const Me=function(){function e(e){this._initFields(e)}var t=e.prototype;return t._initFields=function(e){const t=Object(e);this._fields={...t},Object.keys(t).forEach(e=>{e in this||Object.defineProperty(this,e,{get:()=>this._fields[e],set:t=>this.set(e,t),configurable:!0,enumerable:!0})})},e.toString=function(){return"ModelClass: "+this.modelName},e.options=function(){return{}},e.markAccessed=function(e){if(void 0===this._session)throw new Error([`Tried to mark rows of the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessed\` instead.`].join(""));this.session.markAccessed(this.modelName,e)},e.markFullTableScanned=function(){if(void 0===this._session)throw new Error([`Tried to mark the ${this.modelName} model as full table scanned without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markFullTableScanned\` instead.`].join(""));this.session.markFullTableScanned(this.modelName)},e.markAccessedIndexes=function(e){if(void 0===this._session)throw new Error([`Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].markAccessedIndexes\` instead.`].join(""));this.session.markAccessedIndexes(e.map(([e,t])=>[this.modelName,e,t]))},e.connect=function(e){if(!(e instanceof se))throw new Error("A model can only be connected to instances of Session.");this._session=e},e.getQuerySet=function(){const{querySetClass:e}=this;return new e(this)},e.invalidateClassCache=function(){this.isSetUp=void 0,this.virtualFields={}},e.tableOptions=function(){return"function"==typeof this.backend?(Q("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend()):this.backend?(Q("`Model.backend` has been deprecated. Please rename to `.options`."),this.backend):"function"==typeof this.options?this.options():this.options},e.create=function(e){if(void 0===this._session)throw new Error([`Tried to create a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].create\` instead.`].join(""));const t={...e},n={},r=Object.keys(this.fields),o=Object.keys(this.virtualFields);r.forEach(r=>{const o=this.fields[r],s=e.hasOwnProperty(r);if(o instanceof me)s&&(n[r]=e[r],o.as||delete t[r]);else if(s){const n=e[r];t[r]=W(n)}else o.getDefault&&(t[r]=o.getDefault(e))}),o.forEach(r=>{if(!n.hasOwnProperty(r)){const o=this.virtualFields[r];e.hasOwnProperty(r)&&o instanceof me&&(n[r]=e[r],delete t[r])}});const s=new this(this.session.applyUpdate({action:"REDUX_ORM_CREATE",table:this.modelName,payload:t}));return s._refreshMany2Many(n),s},e.upsert=function(e){if(void 0===this.session)throw new Error([`Tried to upsert a ${this.modelName} model instance without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].upsert\` instead.`].join(""));const{idAttribute:t}=this;if(e.hasOwnProperty(t)){const n=e[t];if(this.idExists(n)){const t=this.withId(n);return t.update(e),t}}return this.create(e)},e.withId=function(e){return this.get({[this.idAttribute]:e})},e.idExists=function(e){return this.exists({[this.idAttribute]:e})},e.exists=function(e){if(void 0===this.session)throw new Error([`Tried to check if a ${this.modelName} model instance exists without a session. `,"Create a session using `session = orm.session()` and call ",`\`session["${this.modelName}"].exists\` instead.`].join(""));return Boolean(this._findDatabaseRows(e).length)},e.get=function(e){const t=this._findDatabaseRows(e);if(0===t.length)return null;if(t.length>1)throw new Error(`Expected to find a single row in \`${this.modelName}.get\`. Found ${t.length}.`);return new this(t[0])},t.getClass=function(){return this.constructor},t.getId=function(){return this._fields[this.getClass().idAttribute]},e._findDatabaseRows=function(e){const t={table:this.modelName};return e&&(t.clauses=[{type:V,payload:e}]),this.session.query(t).rows},t.toString=function(){const e=this.getClass();return`${e.modelName}: {${Object.keys(e.fields).map(t=>{if(e.fields[t]instanceof me){return`${t}: [${this[t].toModelArray().map(e=>e.getId()).join(", ")}]`}return`${t}: ${this._fields[t]}`}).join(", ")}}`},t.equals=function(e){return function(e,t){const n=Object.entries(Object(e));return n.length===Object.keys(t).length&&n.every(([e,n])=>t.hasOwnProperty(e)&&t[e]===n)}(this._fields,e._fields)},t.set=function(e,t){this.update({[e]:t})},t.update=function(e){const t=this.getClass();if(void 0===t.session)throw new Error([`Tried to update a ${t.modelName} model instance without a session. `,"You cannot call `.update` on an instance that you did not receive from the database."].join(""));const n={...e},{fields:r,virtualFields:o}=t,s={};for(const e in n){if(r.hasOwnProperty(e)){const t=r[e];t instanceof pe||t instanceof ye?n[e]=W(n[e]):t instanceof me&&(s[e]=n[e],t.as||delete n[e])}else if(o.hasOwnProperty(e)){o[e]instanceof me&&(s[e]=n[e],delete n[e])}}const i={...this._fields,...n},a=new t(i);this.equals(a)||(this._initFields(i),t.session.applyUpdate({action:B,query:_e(this),payload:n})),this._refreshMany2Many(s)},t.refreshFromState=function(){this._initFields(this.ref)},t.delete=function(){const e=this.getClass();if(void 0===e.session)throw new Error([`Tried to delete a ${e.modelName} model instance without a session. `,"You cannot call `.delete` on an instance that you did not receive from the database."].join(""));this._onDelete(),e.session.applyUpdate({action:U,query:_e(this)})},t._refreshMany2Many=function(e){const t=this.getClass(),{fields:n,virtualFields:r,modelName:o}=t;Object.keys(e).forEach(s=>{const i=!n.hasOwnProperty(s),a=r[s],c=e[s];if(!Array.isArray(c))throw new TypeError(`Failed to resolve many-to-many relationship: ${o}[${s}] must be an array (passed: ${c})`);const u=c.map(W),l=[...new Set(u)];if(u.length!==l.length)throw new Error(`Found duplicate id(s) when passing "${u}" to ${t.modelName}.${s} value`);const d=a.through||X(t.modelName,s),h=t.session[d];let f,p;i?({from:p,to:f}=a.throughFields):({from:f,to:p}=a.throughFields);const m=function(e,t){const n=e.filter(e=>t.includes(e)),r=e.filter(e=>!n.includes(e)),o=t.filter(e=>!n.includes(e));return r.length||o.length?{delete:r,add:o}:null}(h.filter(e=>e[f]===this[t.idAttribute]).toRefArray().map(e=>e[p]),u);if(m){const{delete:e,add:t}=m;e.length>0&&this[a.as||s].remove(...e),t.length>0&&this[a.as||s].add(...t)}})},t._onDelete=function(){const{virtualFields:e}=this.getClass();for(const t in e){const n=e[t];if(n instanceof me){this[n.as||t].clear()}else if(n instanceof pe){const e=this[t];e.exists()&&e.update({[n.relatedName]:null})}else n instanceof ye&&null!==this[t]&&(this[t][n.relatedName]=null)}},e.hasId=function(e){return console.warn("`Model.hasId` has been deprecated. Please use `Model.idExists` instead."),this.idExists(e)},t.getNextState=function(){throw new Error("`Model.prototype.getNextState` has been removed. See the 0.9 migration guide on the GitHub repo.")},o()(e,[{key:"ref",get:function(){const e=this.getClass();return e._findDatabaseRows({[e.idAttribute]:this.getId()})[0]}}],[{key:"idAttribute",get:function(){if(void 0===this._session)throw new Error([`Tried to get the ${this.modelName} model's id attribute without a session. `,"Create a session using `session = orm.session()` and access ",`\`session["${this.modelName}"].idAttribute\` instead.`].join(""));return this.session.db.describe(this.modelName).idAttribute}},{key:"session",get:function(){return this._session}},{key:"query",get:function(){return this.getQuerySet()}}]),e}();Me.fields={id:ge()},Me.virtualFields={},Me.querySetClass=oe;var Oe=Me,xe=n(11),Ne=n.n(xe),Se=n(12),ke=n.n(Se),Ee=n(13),je=n.n(Ee),Fe=n(14),Ae=n.n(Fe);const Ce={idAttribute:"id",arrName:"items",mapName:"itemsById",fields:{}};var Ie=function(){function e(e){Object.assign(this,Ce,e)}var t=e.prototype;return t.accessId=function(e,t){return e[this.mapName][t]},t.accessIds=function(e,t){const n=e[this.mapName];return t.map(e=>n[e])},t.idExists=function(e,t){return e[this.mapName].hasOwnProperty(t)},t.accessIdList=function(e){return e[this.arrName]},t.accessList=function(e){return this.accessIds(e,this.accessIdList(e))},t.getMaxId=function(e){return this.getMeta(e,"maxId")},t.setMaxId=function(e,t,n){return this.setMeta(e,t,"maxId",n)},t.nextId=function(e){return e+1},t.getEmptyState=function(){return{...{[this.arrName]:[],[this.mapName]:{}},indexes:Object.keys(this.fields).filter(e=>e!==this.idAttribute).filter(e=>this.fields[e].index).reduce((e,t)=>({...e,[t]:{}}),{}),meta:{}}},t.setMeta=function(e,t,n,r){const{batchToken:o,withMutations:s}=e;if(s){return P.mutable.setIn(["meta",n],r,t)}return P.batch.setIn(o,["meta",n],r,t)},t.getMeta=function(e,t){return e.meta[t]},t.query=function(e,t){if(0===t.length)return this.accessList(e);const{idAttribute:n}=this,r=Ae()(t,e=>ee(e,n)?1:function({type:e}){return[V,q].includes(e)}(e)?2:3),o=(t,r)=>{const{type:s,payload:i}=r;if(!t){if(ee(r,n)){const t=i[n],s=Object.keys(i).reduce((e,t)=>(t!==n&&(e[t]=i[t]),e),{}),a=this.idExists(e,t)?[t]:[];return Object.keys(s).length?o(this.accessIds(e,a),{...r,payload:s}):this.accessIds(e,a)}if(s===V&&"object"==typeof i){const t=Object.entries(e.indexes),n=[],s=[];if(t.forEach(([e,t])=>{ee(r,e)&&t.hasOwnProperty(i[e])&&(n.push(t[i[e]]),s.push(e))}),n.length){const t=n.pop(),a=n.reduce((e,t)=>{const n=new Set(t);return e.filter(Set.prototype.has,n)},t),c=Object.keys(i).reduce((e,t)=>(s.includes(t)||(e[t]=i[t]),e),{});return Object.keys(c).length?o(this.accessIds(e,a),{...r,payload:c}):this.accessIds(e,a)}}return o(this.accessList(e),r)}switch(s){case V:return Ne()(t,i);case q:return je()(t,i);case"REDUX_ORM_ORDER_BY":{const[e,n]=i;return ke()(t,e,function(e){if(void 0===e)return;const t=e=>["desc",!1].includes(e)?"desc":"asc";return Array.isArray(e)?e.map(t):t(e)}(n))}default:return t}};return r.reduce(o,void 0)},t.insert=function(e,t,n){const{batchToken:r,withMutations:o}=e,s=n.hasOwnProperty(this.idAttribute);let i=t;const[a,c]=function(e,t){let n,r,o=e;return void 0===o&&(o=-1),void 0===t?(n=o+1,r=n):(n=Math.max(o+1,t),r=t),[n,r]}(this.getMaxId(t),n[this.idAttribute]);i=this.setMaxId(e,t,a);const u=s?n:P.batch.set(r,this.idAttribute,c,n),l=Object.keys(i.indexes).filter(e=>n.hasOwnProperty(e)&&null!==n[e]).map(e=>[e,n[e]]);if(o)return P.mutable.push(c,i[this.arrName]),P.mutable.set(c,u,i[this.mapName]),l.forEach(([e,t])=>{const n=i.indexes[e];n.hasOwnProperty(t)?P.mutable.push(c,n[t]):P.mutable.set(t,[c],n)}),{state:i,created:u};const d=P.batch.merge(r,l.reduce((e,[t,n])=>(e[t]=P.batch.merge(r,{[n]:P.batch.push(r,c,e[t][n]||[])},e[t]),e),{...i.indexes}),i.indexes);return{state:P.batch.merge(r,{[this.arrName]:P.batch.push(r,c,i[this.arrName]),[this.mapName]:P.batch.merge(r,{[c]:u},i[this.mapName]),indexes:d},i),created:u}},t.update=function(e,t,n,r){const{batchToken:o,withMutations:s}=e,i=s?P.mutable.set:P.batch.set(o),a=Object.keys(t.indexes).filter(e=>r.hasOwnProperty(e)),c=[],u=[],l=n.reduce((e,t)=>{const n=a.reduce((e,n)=>({...e,[n]:t[n]}),{}),l=(e=>(s?P.mutable.merge:P.batch.merge(o))(r,e))(t),d=a.reduce((e,t)=>({...e,[t]:l[t]}),{}),h=l[this.idAttribute],f=i(h,l,e);return a.forEach(e=>{const{[e]:t}=n,{[e]:r}=d;t!==r&&(null!=t&&u.push([e,t,h]),null!==r&&c.push([e,r,h]))}),f},t[this.mapName]);let d=t.indexes;return s?(u.forEach(([e,t,n])=>{const r=d[e][t],o=r.indexOf(n);P.mutable.splice(o,1,[],r)}),c.forEach(([e,t,n])=>{P.mutable.push(n,d[e][t])})):(c.length&&(d=P.batch.merge(o,c.reduce((e,[t,n,r])=>(e[t]=P.batch.merge(o,{[n]:P.batch.push(o,r,e[t][n]||[])},e[t]),e),{...d}),d)),u.length&&(d=P.batch.merge(o,u.reduce((e,[t,n,r])=>(e[t]=P.batch.merge(o,{[n]:P.batch.filter(o,e=>e!==r,e[t][n])},e[t]),e),{...d}),d))),P.batch.merge(o,{[this.mapName]:l,indexes:d},t)},t.delete=function(e,t,n){const{batchToken:r,withMutations:o}=e,{arrName:s,mapName:i}=this,a=t[s],c=n.map(e=>e[this.idAttribute]);if(o)return c.forEach(e=>{const n=a.indexOf(e);P.mutable.splice(n,1,[],a),P.mutable.omit(e,t[i])}),Object.values(t.indexes).forEach(e=>Object.values(e).forEach(e=>c.forEach(t=>{const n=e.indexOf(t);-1!==n&&P.mutable.splice(n,1,[],e)}))),t;const u=P.batch.merge(r,Object.entries(t.indexes).reduce((e,[t,n])=>(e[t]=P.batch.merge(r,Object.entries(n).reduce((e,[t,n])=>(e[t]=P.batch.filter(r,e=>!c.includes(e),n),e),{...e[t]}),e[t]),e),{...t.indexes}),t.indexes);return P.batch.merge(r,{[s]:P.batch.filter(r,e=>!c.includes(e),t[s]),[i]:P.batch.omit(r,c,t[i]),indexes:P.batch.merge(r,u,t.indexes)},t)},e}();const Re={};function De(e,t,n){const{table:r,clauses:o}=t;return{rows:e[r].query(n[r],o)}}function Te(e,t,n,r){const{action:o,payload:s}=t;let i,a,c;if("REDUX_ORM_CREATE"===o){({table:i}=t);const o=e[i],u=r[i],l=o.insert(n,u,s);a=l.state,c=l.created}else{const{query:u}=t;({table:i}=u);const{rows:l}=De(e,u,r),d=e[i],h=r[i];if(o===B)a=d.update(n,h,l,s),c=De(e,u,r).rows;else{if(o!==U)throw new Error("Database received unknown update type: "+o);a=d.delete(n,h,l),c=l}}return{status:"SUCCESS",state:function(e,t,n,r){const{batchToken:o,withMutations:s}=n;return s?(r[e]=t,r):P.batch.set(o,e,t,r)}(i,a,n,r),payload:c}}Object.defineProperty(Re,"@@_______REDUX_ORM_STATE_FLAG",{enumerable:!0,value:!0});var $e=function(e){const{tables:t}=e,n=Object.entries(t).reduce((e,[t,n])=>({...e,[t]:new Ie(n)}),{});return{getEmptyState:()=>Object.entries(n).reduce((e,[t,n])=>({...e,[t]:n.getEmptyState()}),Re),query:De.bind(null,n),update:Te.bind(null,n),describe:e=>n[e]}};let Pe=function(){function e({parent:e,orm:t}){this._parent=e,this._orm=t,this.keySelector=L}return o()(e,[{key:"cachePath",get:function(){return[...this._parent?this._parent.cachePath:[],this.key]}},{key:"orm",get:function(){return this._orm}},{key:"parent",get:function(){return this._parent}}]),e}(),Be=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return ae()(t,e),o()(t,[{key:"resultFunc",get:function(){return(e,t,...n)=>{const{[this._model.modelName]:r}=e;return void 0===t?r.all().toModelArray().map(t=>this.valueForInstance(t,e,...n)):Array.isArray(t)?t.map(t=>this.valueForInstance(r.withId(t),e,...n)):this.valueForInstance(r.withId(t),e,...n)}}},{key:"model",get:function(){return this._model}}]),t}(Pe);function Ue(e,t){return t}let Ve=function(e){function t({field:t,selector:n,...r}){var o;return(o=e.call(this,r)||this)._field=t,o._selector=n,o}return ae()(t,e),t.prototype.createResultFunc=function(e){const{idAttribute:t}=this._parent.toModel;return(n,...r)=>{const o=e(n,...r),s=Ue(n,...r),i=e=>null===e?null:e.map(e=>this._selector(n,e[t]));return void 0===s||Array.isArray(s)?o.map(i):i(o)}},o()(t,[{key:"selector",get:function(){return this._selector},set:function(e){this._selector=e}},{key:"key",get:function(){return this._selector}}]),t}(Be),qe=function(e){function t({model:t,...n}){var r;return(r=e.call(this,n)||this)._model=t,r}return ae()(t,e),o()(t,[{key:"key",get:function(){return this._model.modelName}},{key:"dependencies",get:function(){return[this._orm,Ue]}},{key:"resultFunc",get:function(){return({[this._model.modelName]:e},t)=>{if(void 0===t)return e.all().toRefArray();if(Array.isArray(t))return t.map(t=>{const n=e.withId(t);return n?n.ref:null});const n=e.withId(t);return n?n.ref:null}}},{key:"model",get:function(){return this._model}}]),t}(Pe),ze=function(e){function t({field:t,fieldModel:n,accessorName:r,isVirtual:o,...s}){var i;return(i=e.call(this,s)||this)._field=t,i._fieldModel=n,i._accessorName=r,i._isVirtual=o,i}ae()(t,e);var n=t.prototype;return n.valueForInstance=function(e,t){if(!e)return null;let n;if(this._parent instanceof qe)n=e[this._accessorName];else{const{[this._parent.toModelName]:r}=t,o=this._parent.valueForInstance(e,t),s=o?new r(o):null;n=s?s[this._accessorName]:null}return n instanceof Oe?n.ref:n instanceof oe?n.toRefArray():n},n.map=function(e){if(e instanceof qe)throw this.toModelName===e.model.modelName?new Error(`Cannot select models in a \`map()\` call. If you just want the \`${this._accessorName}\` as a ref array then you can simply drop the \`map()\`. Otherwise make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`):new Error(`Cannot select \`${e.model.modelName}\` models in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`);if(e instanceof t||e instanceof Ve){if(this.toModelName!==e.model.modelName)throw new Error(`Cannot select fields of the \`${e.model.modelName}\` model in this \`map()\` call. Make sure you're passing a field selector of the form \`${this.toModelName}.<field>\` or a custom selector instead.`)}else if(!e||"function"!=typeof e||!e.recomputations)throw new Error(`\`map()\` requires a selector as an input. Received: ${JSON.stringify(e)} of type ${typeof e}`);if(!(this._field instanceof pe||this._field instanceof me))throw new Error("Cannot map selectors for non-collection fields");return new Ve({parent:this,model:this._model,orm:this._orm,field:this._field,selector:e})},o()(t,[{key:"key",get:function(){return this._accessorName}},{key:"dependencies",get:function(){return[this._orm,Ue]}},{key:"toModelName",get:function(){return"this"===this._field.toModelName?this._fieldModel.modelName:this._field.toModelName}},{key:"toModel",get:function(){return this._orm.getDatabase().describe(this.toModelName)}}]),t}(Be);function Le({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i}){const a=new ze({parent:e,model:t,field:n,fieldModel:r,accessorName:o,orm:s,isVirtual:i});if(!(n instanceof fe))return a;if(e instanceof ze&&(e._field instanceof pe&&e._isVirtual||e._field instanceof me))throw new Error(`Cannot create a selector for \`${e._accessorName}.${o}\` because \`${e._accessorName}\` is a collection field.`);const{toModelName:c}=n,u=s.get("this"===c?t.modelName:c);return Object.entries(u.fields).forEach(([e,n])=>{const r=n.as||e;Object.defineProperty(a,r,{get:()=>Le({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!1})})}),Object.entries(u.virtualFields).forEach(([e,n])=>{const r=n.as||e;a.hasOwnProperty(r)||Object.defineProperty(a,r,{get:()=>Le({parent:a,model:t,fieldModel:u,field:n,accessorName:r,orm:s,isVirtual:!0})})}),a}const Qe={createDatabase:$e},Xe=["indexes","meta"],He=e=>Xe.includes(e);let Ye=function(){function e(e){const{createDatabase:t}={...Qe,...e||{}};this.createDatabase=t,this.registry=[],this.implicitThroughModels=[],this.installedFields={},this.stateSelector=e?e.stateSelector:null}var t=e.prototype;return t.register=function(...e){e.forEach(e=>{if(void 0===e.modelName)throw new Error("A model was passed that doesn't have a modelName set");e.invalidateClassCache(),this.registerManyToManyModelsFor(e),this.registry.push(e),Object.defineProperty(this,e.modelName,{get:()=>(this._setupModelPrototypes(this.registry),function({model:e,orm:t}){const n=new qe({parent:null,orm:t,model:e});return Object.entries(e.fields).forEach(([r,o])=>{const s=o.as||r;Object.defineProperty(n,s,{get:()=>Le({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!1})})}),Object.entries(e.virtualFields).forEach(([r,o])=>{const s=o.as||r;n.hasOwnProperty(s)||Object.defineProperty(n,s,{get:()=>Le({parent:n,model:e,fieldModel:e,field:o,accessorName:s,orm:t,isVirtual:!0})})}),n}({model:e,orm:this}))})})},t.registerManyToManyModelsFor=function(e){const{fields:t}=e,n=e.modelName;Object.entries(t).forEach(([e,t])=>{if(!(t instanceof me))return;let r;r="this"===t.toModelName?n:t.toModelName;const s=n===r,i=H(n),a=Y(r);if(t.through){if(s&&!t.throughFields)throw new Error(`Self-referencing many-to-many relationship at "${n}.${e}" using custom model "${t.through}" has no throughFields key. Cannot determine which fields reference the instances partaking in the relationship.`)}else{const t=function(e){function t(){return e.apply(this,arguments)||this}return ae()(t,e),t}(Oe);t.modelName=X(n,e);const c=function(e){function t(){return e.apply(this,arguments)||this}return ae()(t,e),o()(t,[{key:"installsBackwardsVirtualField",get:function(){return!1}},{key:"installsBackwardsDescriptor",get:function(){return!1}}]),t}(pe),u=s?c:pe;t.fields={id:ge(),[i]:new u(n),[a]:new u(r)},t.invalidateClassCache(),this.implicitThroughModels.push(t)}})},t.get=function(e){const t=this.registry.concat(this.implicitThroughModels),n=Object.values(t).find(t=>t.modelName===e);if(void 0===n)throw new Error(`Did not find model ${e} from registry.`);return n},t.getModelClasses=function(){return this._setupModelPrototypes(this.registry),this._setupModelPrototypes(this.implicitThroughModels),this.registry.concat(this.implicitThroughModels)},t.generateSchemaSpec=function(){return{tables:this.getModelClasses().reduce((e,t)=>{const n=t.modelName,r=t.tableOptions();return Object.keys(r).filter(He).forEach(e=>{throw new Error(`Reserved keyword \`${e}\` used in ${n}.options.`)}),e[n]={fields:{...t.fields},...r},e},{})}},t.getDatabase=function(){return this.db||(this.db=this.createDatabase(this.generateSchemaSpec())),this.db},t.getEmptyState=function(){return this.getDatabase().getEmptyState()},t.session=function(e){return new se(this,this.getDatabase(),e)},t.mutableSession=function(e){return new se(this,this.getDatabase(),e,!0)},t._setupModelPrototypes=function(e){e.filter(e=>!e.isSetUp).forEach(e=>{const{fields:t,modelName:n,querySetClass:r}=e;Object.entries(t).forEach(([t,r])=>{if(!(r instanceof ue))throw new Error(`${n}.${t} is of type "${typeof r}" but must be an instance of Field. Please use the \`attr\`, \`fk\`, \`oneToOne\` and \`many\` functions to define fields.`);this._isFieldInstalled(n,t)||(this._installField(r,t,e),this._setFieldInstalled(n,t))}),J(e,r),e.isSetUp=!0})},t._isFieldInstalled=function(e,t){return!!this.installedFields.hasOwnProperty(e)&&!!this.installedFields[e][t]},t._setFieldInstalled=function(e,t){this.installedFields.hasOwnProperty(e)||(this.installedFields[e]={}),this.installedFields[e][t]=!0},t._installField=function(e,t,n){new(0,e.installerClass)({field:e,fieldName:t,model:n,orm:this}).run()},t.withMutations=function(e){return Q("`ORM.prototype.withMutations` has been deprecated. Use `ORM.prototype.mutableSession` instead."),this.mutableSession(e)},t.from=function(e){return Q("`ORM.prototype.from` has been deprecated. Use `ORM.prototype.session` instead."),this.session(e)},t.getDefaultState=function(){return Q("`ORM.prototype.getDefaultState` has been deprecated. Use `ORM.prototype.getEmptyState` instead."),this.getEmptyState()},t.define=function(){throw new Error("`ORM.prototype.define` has been removed. Please define a Model class.")},e}();var Ke=n(5),Ge=n(6),Je=n.n(Ge);const We=(e,t)=>e===t,Ze=e=>e&&"object"==typeof e&&e.hasOwnProperty("@@_______REDUX_ORM_STATE_FLAG");function et(e,t=We,n){let r={result:null,args:null,ormState:null,fullTableScannedModels:[],accessedInstances:{},accessedIndexes:{}};return(...o)=>{const[s,...i]=o;if(Boolean(r.args)&&(a=r.args,c=t,i.every((e,t)=>Ze(e)&&Ze(a[t])||c(e,a[t])))&&((e,t)=>e.fullTableScannedModels.every(n=>e.ormState[n]===t[n]))(r,s)&&((e,t)=>{const{accessedIndexes:n}=e;return Object.entries(n).every(([n,r])=>Object.entries(r).every(([r,o])=>o.every(o=>e.ormState[n].indexes[r][o]===t[n].indexes[r][o])))})(r,s)&&((e,t,n)=>{const{accessedInstances:r}=e;return Object.entries(r).every(([r,o])=>{if(e.ormState[r]===t[r])return!0;const{mapName:s}=n.getDatabase().describe(r),{[s]:i}=e.ormState[r],{[s]:a}=t[r],c=Object.keys(o);return u=i,l=a,c.every(e=>u[e]===l[e]);var u,l})})(r,s,n))return r.result;var a,c;const u=n.session(s),l=i.map(e=>Ze(e)?u:e),d=e.apply(null,l);return r={args:i,result:d,ormState:s,accessedInstances:u.accessedModelInstances,accessedIndexes:u.accessedIndexes,fullTableScannedModels:u.fullTableScannedModels},d}}function tt(e,t){e.sessionBoundModels.forEach(n=>{"function"==typeof n.reducer&&n.reducer(t,n,e)})}function nt(e,t=tt){return(n,r)=>{const o=e.session(n||e.getEmptyState());return t(o,r),o.state}}function rt(e){return e instanceof Ye?e:e instanceof Pe&&e._orm}const ot=new Map,st=Symbol.for("REDUX_ORM_SELECTOR");function it(e){if("function"==typeof e)return e;if(e instanceof Ye)return e.stateSelector;if(e instanceof Ve&&(e.selector=it(e.selector)),e instanceof Pe){const{orm:t,cachePath:n}=e;let r;ot.has(t)||ot.set(t,new Map);r=ot.get(t);for(let e=0;e<n.length;++e){const t=n[e];r.has(t)||r.set(t,new Map),r=r.get(t)}if(r&&r.has(st))return r.get(st);const o=function e(t){if(t instanceof Ve){const n=e(t.parent);return t.createResultFunc(n)}return Je()(t.dependencies,t.resultFunc)({keySelector:t.keySelector,cacheObject:new Ge.FlatMapCache,selectorCreator:at})}(e);return r.set(st,o),o}throw new Error(`Failed to interpret selector argument: ${JSON.stringify(e)} of type ${typeof e}`)}function at(...e){if(!e.length)throw new Error("Cannot create a selector without arguments.");const t=e.pop(),n=Array.isArray(e[0])?e[0]:e,r=n.map(rt).find(Boolean),o=n.map(it);if("function"==typeof t){if(!r)throw new Error("Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.");if(!r.stateSelector)throw new Error("Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.");if("function"!=typeof r.stateSelector)throw new Error(`Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \`stateSelector\`. Received: ${JSON.stringify(r.stateSelector)} of type ${typeof r.stateSelector}`);return Object(Ke.createSelectorCreator)(et,void 0,r)([r.stateSelector,...o],t)}if(t instanceof Ye)throw new Error("ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.");return o.length&&console.warn("Your input selectors will be ignored: the passed result function does not require any input."),it(t)}const ct=function(){throw new Error("Schema has been renamed to ORM. Please import ORM instead of Schema from Redux-ORM.")},ut=function(){throw new Error("Having a custom Backend instance is now unsupported. Documentation for database customization is upcoming, for now please look at the db folder in the source.")};t.default=Oe}])}));
//# sourceMappingURL=redux-orm.min.js.map
\ No newline at end of file
diff --git a/node_modules/redux-orm/dist/redux-orm.min.js.map b/node_modules/redux-orm/dist/redux-orm.min.js.map
index d45294a..8fa3298 100644
--- a/node_modules/redux-orm/dist/redux-orm.min.js.map
+++ b/node_modules/redux-orm/dist/redux-orm.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack://ReduxOrm/webpack/universalModuleDefinition","webpack://ReduxOrm/webpack/bootstrap","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/createClass.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/typeof.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack://ReduxOrm/./node_modules/reselect/lib/index.js","webpack://ReduxOrm/./node_modules/re-reselect/dist/index.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://ReduxOrm/./node_modules/lodash/_baseOrderBy.js","webpack://ReduxOrm/./node_modules/lodash/_baseIteratee.js","webpack://ReduxOrm/./node_modules/lodash/identity.js","webpack://ReduxOrm/./node_modules/lodash/isArray.js","webpack://ReduxOrm/./node_modules/lodash/filter.js","webpack://ReduxOrm/./node_modules/lodash/orderBy.js","webpack://ReduxOrm/./node_modules/lodash/reject.js","webpack://ReduxOrm/./node_modules/lodash/sortBy.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/iterableToArray.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack://ReduxOrm/./node_modules/lodash/_arrayMap.js","webpack://ReduxOrm/./node_modules/lodash/_baseMap.js","webpack://ReduxOrm/./node_modules/lodash/_baseSortBy.js","webpack://ReduxOrm/./node_modules/lodash/_baseUnary.js","webpack://ReduxOrm/./node_modules/lodash/_compareMultiple.js","webpack://ReduxOrm/./node_modules/lodash/_compareAscending.js","webpack://ReduxOrm/./node_modules/lodash/isSymbol.js","webpack://ReduxOrm/./node_modules/lodash/_arrayFilter.js","webpack://ReduxOrm/./node_modules/lodash/_baseFilter.js","webpack://ReduxOrm/./node_modules/lodash/negate.js","webpack://ReduxOrm/./node_modules/lodash/_baseFlatten.js","webpack://ReduxOrm/./node_modules/lodash/_baseRest.js","webpack://ReduxOrm/./node_modules/lodash/_overRest.js","webpack://ReduxOrm/./node_modules/lodash/_apply.js","webpack://ReduxOrm/./node_modules/lodash/_setToString.js","webpack://ReduxOrm/./node_modules/lodash/_isIterateeCall.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_isPlaceholder.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curry1.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_arity.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curry2.js","webpack://ReduxOrm/./node_modules/ramda/es/curryN.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curryN.js","webpack://ReduxOrm/./node_modules/ramda/es/curry.js","webpack://ReduxOrm/./node_modules/ramda/es/__.js","webpack://ReduxOrm/./node_modules/immutable-ops/es/index.js","webpack://ReduxOrm/./src/constants.js","webpack://ReduxOrm/./src/utils.js","webpack://ReduxOrm/./src/QuerySet.js","webpack://ReduxOrm/./src/Session.js","webpack://ReduxOrm/./src/fields/DefaultFieldInstaller.js","webpack://ReduxOrm/./src/fields/FieldInstallerTemplate.js","webpack://ReduxOrm/./src/fields/Field.js","webpack://ReduxOrm/./src/descriptors.js","webpack://ReduxOrm/./src/fields/Attribute.js","webpack://ReduxOrm/./src/fields/RelationalField.js","webpack://ReduxOrm/./src/fields/ForeignKey.js","webpack://ReduxOrm/./src/fields/ManyToMany.js","webpack://ReduxOrm/./src/fields/OneToOne.js","webpack://ReduxOrm/./src/fields/index.js","webpack://ReduxOrm/./src/Model.js","webpack://ReduxOrm/./src/db/Table.js","webpack://ReduxOrm/./src/db/Database.js","webpack://ReduxOrm/./src/selectors/SelectorSpec.js","webpack://ReduxOrm/./src/selectors/ModelBasedSelectorSpec.js","webpack://ReduxOrm/./src/selectors/idArgSelector.js","webpack://ReduxOrm/./src/selectors/MapSelectorSpec.js","webpack://ReduxOrm/./src/selectors/ModelSelectorSpec.js","webpack://ReduxOrm/./src/selectors/FieldSelectorSpec.js","webpack://ReduxOrm/./src/selectors/index.js","webpack://ReduxOrm/./src/ORM.js","webpack://ReduxOrm/./src/memoize.js","webpack://ReduxOrm/./src/redux.js","webpack://ReduxOrm/./src/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_defineProperties","target","props","length","descriptor","configurable","writable","Constructor","protoProps","staticProps","subClass","superClass","constructor","__proto__","_typeof","obj","iterator","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","arr","defaultEqualityCheck","a","b","areArgumentsShallowlyEqual","equalityCheck","prev","next","defaultMemoize","func","arguments","undefined","lastArgs","lastResult","apply","getDependencies","funcs","dependencies","Array","isArray","every","dep","dependencyTypes","map","join","Error","createSelectorCreator","memoize","_len","memoizeOptions","_key","_len2","_key2","recomputations","resultFunc","pop","memoizedResultFunc","concat","selector","params","push","resetRecomputations","createStructuredSelector","selectors","selectorCreator","createSelector","objectKeys","keys","_len3","values","_key3","reduce","composition","index","reselect","isStringOrNumber","FlatObjectCache","this","_cache","_proto","set","selectorFn","remove","clear","isValidCacheKey","cacheKey","defaultCacheCreator","defaultCacheKeyValidator","createCachedSelector","polymorphicOptions","legacyOptions","options","assign","keySelector","cache","cacheObject","keySelectorCreator","inputSelectors","cacheResponse","console","warn","getMatchingSelector","removeMatchingSelector","clearCache","validateCacheSize","cacheSize","Number","isInteger","FifoObjectCache","_temp","_cacheOrdering","_cacheSize","earliest","indexOf","splice","LruObjectCache","_registerCacheHit","_deleteCacheHit","FlatMapCache","Map","FifoMapCache","size","LruMapCache","has","FifoCacheObject","FlatCacheObject","LruCacheObject","createStructuredCachedSelector","default","len","arr2","arrayMap","baseIteratee","baseMap","baseSortBy","baseUnary","compareMultiple","identity","collection","iteratees","orders","result","iteratee","other","array","predicate","resIndex","baseOrderBy","guard","arrayFilter","baseFilter","negate","baseFlatten","baseRest","isIterateeCall","sortBy","arrayLikeToArray","iter","from","minLen","toString","slice","test","TypeError","comparer","sort","compareAscending","objCriteria","criteria","othCriteria","ordersLength","isSymbol","valIsDefined","valIsNull","valIsReflexive","valIsSymbol","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","FUNC_ERROR_TEXT","args","overRest","setToString","start","nativeMax","Math","max","transform","otherArgs","thisArg","_isPlaceholder","_curry1","fn","f1","_arity","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","_curry2","f2","_b","_a","_curryN","received","combined","argsIdx","left","combinedIdx","forOwn","OWNER_ID_TAG","canMutate","ownerID","getBatchToken","prepareNewObject","instance","addOwnerID","forceArray","arg","PATH_SEPARATOR","normalizePath","pathArg","split","mutableSet","mutableMerge","isDeep","_mergeObjs","baseObj","mergeObjs","forEach","mergeObj","assignValue","mutableShallowMerge","mutableDeepMerge","mutableOmit","_keys","shouldMergeKey","immutableMerge","hasChanges","nextObject","willChange","mergeValue","currentValue","recursiveMergeResult","immutableDeepMerge","immutableArrSet","newArr","copied","fastArrayCopy","mutableArrFilter","currIndex","originalIndex","mutableArrSplice","deleteCount","_vals","vals","mutableArrInsert","immutableArrSplice","immutableArrInsert","immutableOperations","merge","deepMerge","omit","keysInObj","filter","newObj","setIn","_pathArg","acc","currRef","valueInPath","pathLen","rootObj","curr","idx","currType","_newObj","pathRepr","insert","isArrayLike","mutableOperations","originalPathArg","done","immutableOps","mutableOps","batchOps","mutable","batch","batched","_token","_fn","token","immutableOpsBoundToToken","__","getImmutableOps","UPDATE","DELETE","CREATE","FILTER","EXCLUDE","SUCCESS","ALL_INSTANCES","ID_ARG_KEY_SELECTOR","_state","idArg","warnDeprecated","msg","log","m2mName","declarationModelName","fieldName","string","charAt","toUpperCase","m2mFromFieldName","m2mToFieldName","otherModelName","querySetDelegatorFactory","methodName","getQuerySet","querySetGetterDelegatorFactory","getterName","attachQuerySetMethods","modelClass","querySetClass","leftToDefine","sharedMethods","currClass","Function","getPrototypeOf","forEachSuperClass","cls","defined","getOwnPropertyDescriptor","normalizeEntity","entity","getId","ops","clauseFiltersByAttribute","type","payload","attribute","attributeValue","mapValues","entries","newObject","normalizeModelReference","modelNameOrClass","modelName","QuerySet","clauses","opts","_opts","addSharedMethod","_new","userOpts","_evaluate","rows","id","withId","toRefArray","toModelArray","ModelClass","count","exists","Boolean","at","first","last","all","lookupObj","normalizedLookupObj","filterDescriptor","exclude","excludeDescriptor","session","_evaluated","table","querySpec","query","orderBy","orderByDescriptor","update","applyUpdate","action","delete","model","_onDelete","Session","schema","db","state","withMutations","batchToken","getEmptyState","initialState","modelData","models","getModelClasses","sessionBoundModels","SessionBoundModel","Reflect","construct","setPrototypeOf","connect","getDataForModel","getModelData","markAccessed","modelIds","data","accessedInstances","markFullTableScanned","fullTableScanned","markAccessedIndexes","indexes","attr","accessedIndexes","updateSpec","tx","_getTransaction","status","_markAccessedByQuery","includes","idAttribute","accessedIds","Set","row","anyClauseFilteredByPk","some","clause","add","getNextState","DefaultFieldInstaller","installForwardsDescriptor","field","createForwardsDescriptor","toModel","throughModel","installForwardsVirtualField","virtualFields","createForwardsVirtualField","installBackwardsDescriptor","backwardsFieldName","toModelName","createBackwardsDescriptor","installBackwardsVirtualField","createBackwardsVirtualField","orm","references","run","installsForwardsVirtualField","installsBackwardsDescriptor","installsBackwardsVirtualField","_toModel","_throughModel","throughModelName","getThroughModelName","getBackwardsFieldName","Field","getClass","forwardsManyToOneDescriptor","declaredToModelName","DeclaredToModel","toId","_fields","manyToManyDescriptor","declaredFromModelName","throughFields","reverse","DeclaredFromModel","ThroughModel","ThisModel","OtherModel","thisReferencingField","to","otherReferencingField","thisId","throughQs","referencedOtherIds","qs","otherModelInstance","entities","idsToAdd","existingQs","through","existingIds","idsToRemove","entitiesToDelete","entitiesToDeleteIds","unexistingIds","Attribute","getDefault","attrDescriptor","RelationalField","relatedName","as","toLowerCase","ForeignKey","declaredFieldName","ManyToMany","getThroughFields","fieldAName","fieldBName","fieldA","fields","throughModelFieldReferencing","otherModel","find","someFieldName","OneToOne","forwardsOneToOneDescriptor","fk","many","oneToOne","getByIdQuery","modelInstance","Model","_initFields","propsObj","ids","_session","QuerySetClass","invalidateClassCache","isSetUp","tableOptions","backend","userProps","m2mRelations","declaredFieldNames","declaredVirtualFieldNames","valuePassed","_refreshMany2Many","upsert","idExists","_findDatabaseRows","equals","entriesInA","objectShallowEquals","propertyName","userMergeObj","mergeKey","mergedFields","updatedModel","refreshFromState","ref","relations","normalizedNewIds","uniqueIds","fromField","toField","diffActions","sourceArr","targetArr","itemsInBoth","item","deleteItems","addItems","arrayDiffActions","idsToDelete","relatedQs","hasId","describe","DEFAULT_TABLE_OPTIONS","arrName","mapName","Table","accessId","branch","accessIds","accessIdList","accessList","getMaxId","getMeta","setMaxId","newMaxId","setMeta","nextId","meta","optimallyOrderedClauses","clauseReducesResultSetSize","reducer","remainingPayload","withoutPkAttr","filterAttr","indexAttrs","lastIndex","indexedIds","indexSet","withoutIndexAttrs","reject","convert","order","normalizeOrders","entry","workingState","_currMax","userPassedId","newMax","newId","currMax","idSequencer","finalEntry","indexesToAppendTo","fkAttr","attrIndex","created","nextIndexes","indexMap","indexedAttrs","indexIdsToAdd","indexIdsToDelete","nextMap","prevAttrValues","valueMap","mergeObjInto","nextAttrValues","nextRow","prevValue","nextValue","rowId","valueIndex","attrIndexMap","BASE_EMPTY_STATE","tables","tableName","nextTableState","resultPayload","currTableState","nextDBState","newTableState","replaceTableState","createDatabase","schemaSpec","tableSpecs","tableSpec","SelectorSpec","parent","_parent","_orm","cachePath","ModelBasedSelectorSpec","_model","valueForInstance","idArgSelector","MapSelectorSpec","_field","_selector","createResultFunc","parentSelector","parentResult","single","refArray","ModelSelectorSpec","FieldSelectorSpec","fieldModel","accessorName","isVirtual","_fieldModel","_accessorName","_isVirtual","ParentToModel","parentRef","parentInstance","JSON","stringify","getDatabase","createFieldSelectorSpec","fieldSelectorSpec","relatedFieldName","relatedField","fieldAccessorName","ORM_DEFAULTS","defaultCreateDatabase","RESERVED_TABLE_OPTIONS","isReservedTableOption","word","ORM","registry","implicitThroughModels","installedFields","stateSelector","register","registerManyToManyModelsFor","_setupModelPrototypes","modelSelectorSpec","createModelSelectorSpec","thisModelName","fieldInstance","selfReferencing","fromFieldName","toFieldName","Through","PlainForeignKey","ForeignKeyClass","allModels","found","generateSchemaSpec","spec","mutableSession","_isFieldInstalled","_installField","_setFieldInstalled","FieldInstaller","installerClass","getDefaultState","isOrmState","argsAreEqual","nextArgs","accessedModelInstancesAreEqual","previous","ormState","instances","previousRows","rowsA","rowsB","rowsAreEqual","accessedIndexesAreEqual","column","fullTableScannedModelsAreEqual","fullTableScannedModels","argEqualityCheck","stateAndArgs","argsWithSession","accessedModelInstances","defaultUpdater","createReducer","updater","toORM","selectorCache","SELECTOR_KEY","for","toSelector","level","storageKey","createSelectorFromSpec","resultArg","inputFuncs","Schema","Backend"],"mappings":"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","file":"redux-orm.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"ReduxOrm\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReduxOrm\"] = factory();\n\telse\n\t\troot[\"ReduxOrm\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 35);\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","var arrayWithoutHoles = require(\"./arrayWithoutHoles\");\n\nvar iterableToArray = require(\"./iterableToArray\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;","'use strict';\n\nexports.__esModule = true;\nexports.defaultMemoize = defaultMemoize;\nexports.createSelectorCreator = createSelectorCreator;\nexports.createStructuredSelector = createStructuredSelector;\nfunction defaultEqualityCheck(a, b) {\n return a === b;\n}\n\nfunction areArgumentsShallowlyEqual(equalityCheck, prev, next) {\n if (prev === null || next === null || prev.length !== next.length) {\n return false;\n }\n\n // Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible.\n var length = prev.length;\n for (var i = 0; i < length; i++) {\n if (!equalityCheck(prev[i], next[i])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction defaultMemoize(func) {\n var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;\n\n var lastArgs = null;\n var lastResult = null;\n // we reference arguments instead of spreading them for performance reasons\n return function () {\n if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {\n // apply arguments instead of spreading for performance.\n lastResult = func.apply(null, arguments);\n }\n\n lastArgs = arguments;\n return lastResult;\n };\n}\n\nfunction getDependencies(funcs) {\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;\n\n if (!dependencies.every(function (dep) {\n return typeof dep === 'function';\n })) {\n var dependencyTypes = dependencies.map(function (dep) {\n return typeof dep;\n }).join(', ');\n throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));\n }\n\n return dependencies;\n}\n\nfunction createSelectorCreator(memoize) {\n for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n memoizeOptions[_key - 1] = arguments[_key];\n }\n\n return function () {\n for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n funcs[_key2] = arguments[_key2];\n }\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = getDependencies(funcs);\n\n var memoizedResultFunc = memoize.apply(undefined, [function () {\n recomputations++;\n // apply arguments instead of spreading for performance.\n return resultFunc.apply(null, arguments);\n }].concat(memoizeOptions));\n\n // If a selector is called with the exact same arguments we don't need to traverse our dependencies again.\n var selector = defaultMemoize(function () {\n var params = [];\n var length = dependencies.length;\n\n for (var i = 0; i < length; i++) {\n // apply arguments instead of spreading and mutate a local list of params for performance.\n params.push(dependencies[i].apply(null, arguments));\n }\n\n // apply arguments instead of spreading for performance.\n return memoizedResultFunc.apply(null, params);\n });\n\n selector.resultFunc = resultFunc;\n selector.recomputations = function () {\n return recomputations;\n };\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n return selector;\n };\n}\n\nvar createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);\n\nfunction createStructuredSelector(selectors) {\n var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;\n\n if (typeof selectors !== 'object') {\n throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));\n }\n var objectKeys = Object.keys(selectors);\n return selectorCreator(objectKeys.map(function (key) {\n return selectors[key];\n }), function () {\n for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n values[_key3] = arguments[_key3];\n }\n\n return values.reduce(function (composition, value, index) {\n composition[objectKeys[index]] = value;\n return composition;\n }, {});\n });\n}","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('reselect')) :\n typeof define === 'function' && define.amd ? define(['exports', 'reselect'], factory) :\n (global = global || self, factory(global['Re-reselect'] = {}, global.Reselect));\n}(this, function (exports, reselect) { 'use strict';\n\n function isStringOrNumber(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n\n var FlatObjectCache =\n /*#__PURE__*/\n function () {\n function FlatObjectCache() {\n this._cache = {};\n }\n\n var _proto = FlatObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FlatObjectCache;\n }();\n\n var defaultCacheCreator = FlatObjectCache;\n\n var defaultCacheKeyValidator = function defaultCacheKeyValidator() {\n return true;\n };\n\n function createCachedSelector() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return function (polymorphicOptions, legacyOptions) {\n // @NOTE Versions 0.x/1.x accepted \"options\" as a function\n if (typeof legacyOptions === 'function') {\n throw new Error('[re-reselect] Second argument \"options\" must be an object. Please use \"options.selectorCreator\" to provide a custom selectorCreator.');\n }\n\n var options = {};\n\n if (typeof polymorphicOptions === 'function') {\n Object.assign(options, legacyOptions, {\n keySelector: polymorphicOptions\n }); // @TODO add legacyOptions deprecation notice in next major release\n } else {\n Object.assign(options, polymorphicOptions);\n } // https://github.com/reduxjs/reselect/blob/v4.0.0/src/index.js#L54\n\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : [].concat(funcs);\n\n var resultFuncWithRecomputations = function resultFuncWithRecomputations() {\n recomputations++;\n return resultFunc.apply(void 0, arguments);\n };\n\n funcs.push(resultFuncWithRecomputations);\n var cache = options.cacheObject || new defaultCacheCreator();\n var selectorCreator = options.selectorCreator || reselect.createSelector;\n var isValidCacheKey = cache.isValidCacheKey || defaultCacheKeyValidator;\n\n if (options.keySelectorCreator) {\n options.keySelector = options.keySelectorCreator({\n keySelector: options.keySelector,\n inputSelectors: dependencies,\n resultFunc: resultFunc\n });\n } // Application receives this function\n\n\n var selector = function selector() {\n var cacheKey = options.keySelector.apply(options, arguments);\n\n if (isValidCacheKey(cacheKey)) {\n var cacheResponse = cache.get(cacheKey);\n\n if (cacheResponse === undefined) {\n cacheResponse = selectorCreator.apply(void 0, funcs);\n cache.set(cacheKey, cacheResponse);\n }\n\n return cacheResponse.apply(void 0, arguments);\n }\n\n console.warn(\"[re-reselect] Invalid cache key \\\"\" + cacheKey + \"\\\" has been returned by keySelector function.\");\n return undefined;\n }; // Further selector methods\n\n\n selector.getMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments); // @NOTE It might update cache hit count in LRU-like caches\n\n return cache.get(cacheKey);\n };\n\n selector.removeMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments);\n cache.remove(cacheKey);\n };\n\n selector.clearCache = function () {\n cache.clear();\n };\n\n selector.resultFunc = resultFunc;\n selector.dependencies = dependencies;\n selector.cache = cache;\n\n selector.recomputations = function () {\n return recomputations;\n };\n\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n\n selector.keySelector = options.keySelector;\n return selector;\n };\n }\n\n function createStructuredCachedSelector(selectors) {\n return reselect.createStructuredSelector(selectors, createCachedSelector);\n }\n\n function validateCacheSize(cacheSize) {\n if (cacheSize === undefined) {\n throw new Error('Missing the required property \"cacheSize\".');\n }\n\n if (!Number.isInteger(cacheSize) || cacheSize <= 0) {\n throw new Error('The \"cacheSize\" property must be a positive integer value.');\n }\n }\n\n var FifoObjectCache =\n /*#__PURE__*/\n function () {\n function FifoObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._cacheOrdering.push(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FifoObjectCache;\n }();\n\n var LruObjectCache =\n /*#__PURE__*/\n function () {\n function LruObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._registerCacheHit(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n this._registerCacheHit(key);\n\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n this._deleteCacheHit(key);\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto._registerCacheHit = function _registerCacheHit(key) {\n this._deleteCacheHit(key);\n\n this._cacheOrdering.push(key);\n };\n\n _proto._deleteCacheHit = function _deleteCacheHit(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return LruObjectCache;\n }();\n\n var FlatMapCache =\n /*#__PURE__*/\n function () {\n function FlatMapCache() {\n this._cache = new Map();\n }\n\n var _proto = FlatMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FlatMapCache;\n }();\n\n var FifoMapCache =\n /*#__PURE__*/\n function () {\n function FifoMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FifoMapCache;\n }();\n\n var LruMapCache =\n /*#__PURE__*/\n function () {\n function LruMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n var value = this._cache.get(key); // Register cache hit\n\n\n if (this._cache.has(key)) {\n this.remove(key);\n\n this._cache.set(key, value);\n }\n\n return value;\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return LruMapCache;\n }();\n\n exports.FifoCacheObject = FifoObjectCache;\n exports.FifoMapCache = FifoMapCache;\n exports.FifoObjectCache = FifoObjectCache;\n exports.FlatCacheObject = FlatObjectCache;\n exports.FlatMapCache = FlatMapCache;\n exports.FlatObjectCache = FlatObjectCache;\n exports.LruCacheObject = LruMapCache;\n exports.LruMapCache = LruMapCache;\n exports.LruObjectCache = LruObjectCache;\n exports.createStructuredCachedSelector = createStructuredCachedSelector;\n exports.default = createCachedSelector;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=index.js.map\n","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseOrderBy = require('./_baseOrderBy'),\n isArray = require('./isArray');\n\n/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\nfunction orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n}\n\nmodule.exports = orderBy;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;","function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableSpread;","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nmodule.exports = head;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","import _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","export default function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}","import _curry1 from './_curry1.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _arity from './internal/_arity.js';\nimport _curry1 from './internal/_curry1.js';\nimport _curry2 from './internal/_curry2.js';\nimport _curryN from './internal/_curryN.js';\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * const sumArgs = (...args) => R.sum(args);\n *\n * const curriedAddFourNumbers = R.curryN(4, sumArgs);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nexport default curryN;","import _arity from './_arity.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));\n };\n}","import _curry1 from './internal/_curry1.js';\nimport curryN from './curryN.js';\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN, R.partial\n * @example\n *\n * const addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * const curriedAddFourNumbers = R.curry(addFourNumbers);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curry = /*#__PURE__*/_curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\nexport default curry;","/**\n * A special placeholder value used to specify \"gaps\" within curried functions,\n * allowing partial application of any combination of arguments, regardless of\n * their positions.\n *\n * If `g` is a curried ternary function and `_` is `R.__`, the following are\n * equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2, _)(1, 3)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @name __\n * @constant\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @example\n *\n * const greet = R.replace('{name}', R.__, 'Hello, {name}!');\n * greet('Alice'); //=> 'Hello, Alice!'\n */\nexport default { '@@functional/placeholder': true };","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\nimport { curry, __ as placeholder } from 'ramda';\n\nfunction forOwn(obj, fn) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn(obj[key], key);\n }\n }\n}\n\nfunction isArrayLike(value) {\n return value && _typeof(value) === 'object' && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0;\n}\n\nvar OWNER_ID_TAG = '@@_______immutableOpsOwnerID';\n\nfunction fastArrayCopy(arr) {\n var copied = new Array(arr.length);\n\n for (var i = 0; i < arr.length; i++) {\n copied[i] = arr[i];\n }\n\n return copied;\n}\n\nexport function canMutate(obj, ownerID) {\n if (!ownerID) return false;\n return obj[OWNER_ID_TAG] === ownerID;\n}\nvar newOwnerID = typeof Symbol === 'function' ? function () {\n return Symbol('ownerID');\n} : function () {\n return {};\n};\nexport var getBatchToken = newOwnerID;\n\nfunction addOwnerID(obj, ownerID) {\n Object.defineProperty(obj, OWNER_ID_TAG, {\n value: ownerID,\n configurable: true,\n enumerable: false\n });\n return obj;\n}\n\nfunction prepareNewObject(instance, ownerID) {\n if (ownerID) {\n addOwnerID(instance, ownerID);\n }\n\n return instance;\n}\n\nfunction forceArray(arg) {\n if (!(arg instanceof Array)) {\n return [arg];\n }\n\n return arg;\n}\n\nvar PATH_SEPARATOR = '.';\n\nfunction normalizePath(pathArg) {\n if (typeof pathArg === 'string') {\n if (pathArg.indexOf(PATH_SEPARATOR) === -1) {\n return [pathArg];\n }\n\n return pathArg.split(PATH_SEPARATOR);\n }\n\n return pathArg;\n}\n\nfunction mutableSet(key, value, obj) {\n obj[key] = value;\n return obj;\n}\n\nfunction mutableSetIn(_pathArg, value, obj) {\n var originalPathArg = normalizePath(_pathArg);\n var pathLen = originalPathArg.length;\n var done = false;\n var idx = 0;\n var acc = obj;\n var curr = originalPathArg[idx];\n\n while (!done) {\n if (idx === pathLen - 1) {\n acc[curr] = value;\n done = true;\n } else {\n var currType = _typeof(acc[curr]);\n\n if (currType === 'undefined') {\n var newObj = {};\n prepareNewObject(newObj, null);\n acc[curr] = newObj;\n } else if (currType !== 'object') {\n var pathRepr = \"\".concat(originalPathArg[idx - 1], \".\").concat(curr);\n throw new Error(\"A non-object value was encountered when traversing setIn path at \".concat(pathRepr, \".\"));\n }\n\n acc = acc[curr];\n idx++;\n curr = originalPathArg[idx];\n }\n }\n\n return obj;\n}\n\nfunction valueInPath(_pathArg, obj) {\n var pathArg = normalizePath(_pathArg);\n var acc = obj;\n\n for (var i = 0; i < pathArg.length; i++) {\n var curr = pathArg[i];\n var currRef = acc[curr];\n\n if (i === pathArg.length - 1) {\n return currRef;\n }\n\n if (_typeof(currRef) === 'object') {\n acc = currRef;\n } else {\n return undefined;\n }\n }\n\n return undefined;\n}\n\nfunction immutableSetIn(ownerID, _pathArg, value, obj) {\n var pathArg = normalizePath(_pathArg);\n var currentValue = valueInPath(pathArg, obj);\n if (value === currentValue) return obj;\n var pathLen = pathArg.length;\n var acc;\n\n if (canMutate(obj, ownerID)) {\n acc = obj;\n } else {\n acc = Object.assign(prepareNewObject({}, ownerID), obj);\n }\n\n var rootObj = acc;\n pathArg.forEach(function (curr, idx) {\n if (idx === pathLen - 1) {\n acc[curr] = value;\n return;\n }\n\n var currRef = acc[curr];\n\n var currType = _typeof(currRef);\n\n if (currType === 'object') {\n if (canMutate(currRef, ownerID)) {\n acc = currRef;\n } else {\n var newObj = prepareNewObject({}, ownerID);\n acc[curr] = Object.assign(newObj, currRef);\n acc = newObj;\n }\n\n return;\n }\n\n if (currType === 'undefined') {\n var _newObj = prepareNewObject({}, ownerID);\n\n acc[curr] = _newObj;\n acc = _newObj;\n return;\n }\n\n var pathRepr = \"\".concat(pathArg[idx - 1], \".\").concat(curr);\n throw new Error(\"A non-object value was encountered when traversing setIn path at \".concat(pathRepr, \".\"));\n });\n return rootObj;\n}\n\nfunction mutableMerge(isDeep, _mergeObjs, baseObj) {\n var mergeObjs = forceArray(_mergeObjs);\n\n if (isDeep) {\n mergeObjs.forEach(function (mergeObj) {\n forOwn(mergeObj, function (value, key) {\n if (isDeep && baseObj.hasOwnProperty(key)) {\n var assignValue;\n\n if (_typeof(value) === 'object') {\n assignValue = mutableMerge(isDeep, [value], baseObj[key]);\n } else {\n assignValue = value;\n }\n\n baseObj[key] = assignValue;\n } else {\n baseObj[key] = value;\n }\n });\n });\n } else {\n Object.assign.apply(Object, [baseObj].concat(_toConsumableArray(mergeObjs)));\n }\n\n return baseObj;\n}\n\nvar mutableShallowMerge = mutableMerge.bind(null, false);\nvar mutableDeepMerge = mutableMerge.bind(null, true);\n\nfunction mutableOmit(_keys, obj) {\n var keys = forceArray(_keys);\n keys.forEach(function (key) {\n delete obj[key];\n });\n return obj;\n}\n\nfunction shouldMergeKey(obj, other, key) {\n return obj[key] !== other[key];\n}\n\nfunction immutableMerge(isDeep, ownerID, _mergeObjs, obj) {\n if (canMutate(obj, ownerID)) return mutableMerge(isDeep, _mergeObjs, obj);\n var mergeObjs = forceArray(_mergeObjs);\n var hasChanges = false;\n var nextObject = obj;\n\n var willChange = function willChange() {\n if (!hasChanges) {\n hasChanges = true;\n nextObject = Object.assign({}, obj);\n prepareNewObject(nextObject, ownerID);\n }\n };\n\n mergeObjs.forEach(function (mergeObj) {\n forOwn(mergeObj, function (mergeValue, key) {\n if (isDeep && obj.hasOwnProperty(key)) {\n var currentValue = nextObject[key];\n\n if (_typeof(mergeValue) === 'object' && !(mergeValue instanceof Array)) {\n if (shouldMergeKey(nextObject, mergeObj, key)) {\n var recursiveMergeResult = immutableMerge(isDeep, ownerID, mergeValue, currentValue);\n\n if (recursiveMergeResult !== currentValue) {\n willChange();\n nextObject[key] = recursiveMergeResult;\n }\n }\n\n return true; // continue forOwn\n }\n }\n\n if (shouldMergeKey(nextObject, mergeObj, key)) {\n willChange();\n nextObject[key] = mergeValue;\n }\n\n return undefined;\n });\n });\n return nextObject;\n}\n\nvar immutableDeepMerge = immutableMerge.bind(null, true);\nvar immutableShallowMerge = immutableMerge.bind(null, false);\n\nfunction immutableArrSet(ownerID, index, value, arr) {\n if (canMutate(arr, ownerID)) return mutableSet(index, value, arr);\n if (arr[index] === value) return arr;\n var newArr = fastArrayCopy(arr);\n newArr[index] = value;\n prepareNewObject(newArr, ownerID);\n return newArr;\n}\n\nfunction immutableSet(ownerID, key, value, obj) {\n if (isArrayLike(obj)) return immutableArrSet(ownerID, key, value, obj);\n if (canMutate(obj, ownerID)) return mutableSet(key, value, obj);\n if (obj[key] === value) return obj;\n var newObj = Object.assign({}, obj);\n prepareNewObject(newObj, ownerID);\n newObj[key] = value;\n return newObj;\n}\n\nfunction immutableOmit(ownerID, _keys, obj) {\n if (canMutate(obj, ownerID)) return mutableOmit(_keys, obj);\n var keys = forceArray(_keys);\n var keysInObj = keys.filter(function (key) {\n return obj.hasOwnProperty(key);\n }); // None of the keys were in the object, so we can return `obj`.\n\n if (keysInObj.length === 0) return obj;\n var newObj = Object.assign({}, obj);\n keysInObj.forEach(function (key) {\n delete newObj[key];\n });\n prepareNewObject(newObj, ownerID);\n return newObj;\n}\n\nfunction mutableArrPush(_vals, arr) {\n var vals = forceArray(_vals);\n arr.push.apply(arr, _toConsumableArray(vals));\n return arr;\n}\n\nfunction mutableArrFilter(func, arr) {\n var currIndex = 0;\n var originalIndex = 0;\n\n while (currIndex < arr.length) {\n var item = arr[currIndex];\n\n if (!func(item, originalIndex)) {\n arr.splice(currIndex, 1);\n } else {\n currIndex++;\n }\n\n originalIndex++;\n }\n\n return arr;\n}\n\nfunction mutableArrSplice(index, deleteCount, _vals, arr) {\n var vals = forceArray(_vals);\n arr.splice.apply(arr, [index, deleteCount].concat(_toConsumableArray(vals)));\n return arr;\n}\n\nfunction mutableArrInsert(index, _vals, arr) {\n return mutableArrSplice(index, 0, _vals, arr);\n}\n\nfunction immutableArrSplice(ownerID, index, deleteCount, _vals, arr) {\n if (canMutate(arr, ownerID)) return mutableArrSplice(index, deleteCount, _vals, arr);\n var vals = forceArray(_vals);\n var newArr = arr.slice();\n prepareNewObject(newArr, ownerID);\n newArr.splice.apply(newArr, [index, deleteCount].concat(_toConsumableArray(vals)));\n return newArr;\n}\n\nfunction immutableArrInsert(ownerID, index, _vals, arr) {\n if (canMutate(arr, ownerID)) return mutableArrInsert(index, _vals, arr);\n return immutableArrSplice(ownerID, index, 0, _vals, arr);\n}\n\nfunction immutableArrPush(ownerID, vals, arr) {\n return immutableArrInsert(ownerID, arr.length, vals, arr);\n}\n\nfunction immutableArrFilter(ownerID, func, arr) {\n if (canMutate(arr, ownerID)) return mutableArrFilter(func, arr);\n var newArr = arr.filter(func);\n if (newArr.length === arr.length) return arr;\n prepareNewObject(newArr, ownerID);\n return newArr;\n}\n\nvar immutableOperations = {\n // object operations\n merge: immutableShallowMerge,\n deepMerge: immutableDeepMerge,\n omit: immutableOmit,\n setIn: immutableSetIn,\n // array operations\n insert: immutableArrInsert,\n push: immutableArrPush,\n filter: immutableArrFilter,\n splice: immutableArrSplice,\n // both\n set: immutableSet\n};\nvar mutableOperations = {\n // object operations\n merge: mutableShallowMerge,\n deepMerge: mutableDeepMerge,\n omit: mutableOmit,\n setIn: mutableSetIn,\n // array operations\n insert: mutableArrInsert,\n push: mutableArrPush,\n filter: mutableArrFilter,\n splice: mutableArrSplice,\n // both\n set: mutableSet\n};\nexport function getImmutableOps() {\n var immutableOps = Object.assign({}, immutableOperations);\n forOwn(immutableOps, function (value, key) {\n immutableOps[key] = curry(value.bind(null, null));\n });\n var mutableOps = Object.assign({}, mutableOperations);\n forOwn(mutableOps, function (value, key) {\n mutableOps[key] = curry(value);\n });\n var batchOps = Object.assign({}, immutableOperations);\n forOwn(batchOps, function (value, key) {\n batchOps[key] = curry(value);\n });\n\n function batched(_token, _fn) {\n var token;\n var fn;\n\n if (typeof _token === 'function') {\n fn = _token;\n token = getBatchToken();\n } else {\n token = _token;\n fn = _fn;\n }\n\n var immutableOpsBoundToToken = Object.assign({}, immutableOperations);\n forOwn(immutableOpsBoundToToken, function (value, key) {\n immutableOpsBoundToToken[key] = curry(value.bind(null, token));\n });\n return fn(immutableOpsBoundToToken);\n }\n\n return Object.assign(immutableOps, {\n mutable: mutableOps,\n batch: batchOps,\n batched: batched,\n __: placeholder,\n getBatchToken: getBatchToken\n });\n}\nexport var ops = getImmutableOps();\nexport default ops;","export const UPDATE = \"REDUX_ORM_UPDATE\";\nexport const DELETE = \"REDUX_ORM_DELETE\";\nexport const CREATE = \"REDUX_ORM_CREATE\";\n\nexport const FILTER = \"REDUX_ORM_FILTER\";\nexport const EXCLUDE = \"REDUX_ORM_EXCLUDE\";\nexport const ORDER_BY = \"REDUX_ORM_ORDER_BY\";\n\nexport const SUCCESS = \"SUCCESS\";\nexport const FAILURE = \"FAILURE\";\n\n// for detecting ORM state objects\nexport const STATE_FLAG = \"@@_______REDUX_ORM_STATE_FLAG\";\n\n// for caching selectors based on their ID argument\nexport const ALL_INSTANCES = Symbol(\"REDUX_ORM_ALL_INSTANCES\");\nexport const ID_ARG_KEY_SELECTOR = (_state, idArg) =>\n typeof idArg === \"undefined\" ? ALL_INSTANCES : idArg;\n","import ops from \"immutable-ops\";\nimport { FILTER, EXCLUDE } from \"./constants\";\n\n/**\n * @module utils\n * @private\n */\n\n/** @private */\nfunction warnDeprecated(msg) {\n const logger =\n typeof console.warn === \"function\"\n ? console.warn.bind(console)\n : console.log.bind(console);\n return logger(msg);\n}\n\n/** @private */\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Returns the branch name for a many-to-many relation.\n * The name is the combination of the model name and the field name the relation\n * was declared. The field name's first letter is capitalized.\n *\n * Example: model `Author` has a many-to-many relation to the model `Book`, defined\n * in the `Author` field `books`. The many-to-many branch name will be `AuthorBooks`.\n *\n * @param {string} declarationModelName - the name of the model the many-to-many relation was declared on\n * @param {string} fieldName - the field name where the many-to-many relation was declared on\n * @return {string} The branch name for the many-to-many relation.\n */\nfunction m2mName(declarationModelName, fieldName) {\n return declarationModelName + capitalize(fieldName);\n}\n\n/**\n * Returns the fieldname that saves a foreign key to the\n * model id where the many-to-many relation was declared.\n *\n * Example: `Author` => `fromAuthorId`\n *\n * @param {string} declarationModelName - the name of the model where the relation was declared\n * @return {string} the field name in the through model for `declarationModelName`'s foreign key.\n */\nfunction m2mFromFieldName(declarationModelName) {\n return `from${declarationModelName}Id`;\n}\n\n/**\n * Returns the fieldname that saves a foreign key in a many-to-many through model to the\n * model where the many-to-many relation was declared.\n *\n * Example: `Book` => `toBookId`\n *\n * @param {string} otherModelName - the name of the model that was the target of the many-to-many\n * declaration.\n * @return {string} the field name in the through model for `otherModelName`'s foreign key..\n */\nfunction m2mToFieldName(otherModelName) {\n return `to${otherModelName}Id`;\n}\n\n/** */\nfunction reverseFieldName(modelName) {\n return modelName.toLowerCase() + \"Set\"; // eslint-disable-line prefer-template\n}\n\n/** @private */\nfunction querySetDelegatorFactory(methodName) {\n return function querySetDelegator(...args) {\n return this.getQuerySet()[methodName](...args);\n };\n}\n\n/** @private */\nfunction querySetGetterDelegatorFactory(getterName) {\n return function querySetGetterDelegator() {\n const qs = this.getQuerySet();\n return qs[getterName];\n };\n}\n\n/** @private */\nfunction forEachSuperClass(subClass, func) {\n let currClass = subClass;\n while (currClass !== Function.prototype) {\n func(currClass);\n currClass = Object.getPrototypeOf(currClass);\n }\n}\n\n/** */\nfunction attachQuerySetMethods(modelClass, querySetClass) {\n const leftToDefine = querySetClass.sharedMethods.slice();\n\n // There is no way to get a property descriptor for the whole prototype chain;\n // only from an objects own properties. Therefore we traverse the whole prototype\n // chain for querySet.\n forEachSuperClass(querySetClass, cls => {\n for (let i = 0; i < leftToDefine.length; i++) {\n let defined = false;\n const methodName = leftToDefine[i];\n const descriptor = Object.getOwnPropertyDescriptor(\n cls.prototype,\n methodName\n );\n if (typeof descriptor !== \"undefined\") {\n if (typeof descriptor.get !== \"undefined\") {\n descriptor.get = querySetGetterDelegatorFactory(methodName);\n Object.defineProperty(modelClass, methodName, descriptor);\n } else {\n modelClass[methodName] = querySetDelegatorFactory(\n methodName\n );\n }\n defined = true;\n }\n if (defined) {\n leftToDefine.splice(i--, 1);\n }\n }\n });\n}\n\n/**\n * Normalizes `entity` to an id, where `entity` can be an id\n * or a Model instance.\n *\n * @param {*} entity - either a Model instance or an id value\n * @return {*} the id value of `entity`\n */\nfunction normalizeEntity(entity) {\n if (\n entity !== null &&\n typeof entity !== \"undefined\" &&\n typeof entity.getId === \"function\"\n ) {\n return entity.getId();\n }\n return entity;\n}\n\n/** */\nfunction reverseFieldErrorMessage(\n modelName,\n fieldName,\n toModelName,\n backwardsFieldName\n) {\n return [\n `Reverse field ${backwardsFieldName} already defined`,\n ` on model ${toModelName}. To fix, set a custom related`,\n ` name on ${modelName}.${fieldName}.`,\n ].join(\"\");\n}\n\n/**\n * Fastest way to check if two objects are equal.\n * Object and array values have to be referentially equal.\n */\nfunction objectShallowEquals(a, b) {\n const entriesInA = Object.entries(Object(a));\n\n if (entriesInA.length !== Object.keys(b).length) {\n return false;\n }\n\n return entriesInA.every(\n ([key, value]) => b.hasOwnProperty(key) && b[key] === value\n );\n}\n\n/** */\nfunction arrayDiffActions(sourceArr, targetArr) {\n const itemsInBoth = sourceArr.filter(item => targetArr.includes(item));\n const deleteItems = sourceArr.filter(item => !itemsInBoth.includes(item));\n const addItems = targetArr.filter(item => !itemsInBoth.includes(item));\n\n if (deleteItems.length || addItems.length) {\n return {\n delete: deleteItems,\n add: addItems,\n };\n }\n return null;\n}\n\nconst { getBatchToken } = ops;\n\n/**\n * @return boolean\n */\nfunction clauseFiltersByAttribute({ type, payload }, attribute) {\n if (type !== FILTER) return false;\n\n if (typeof payload !== \"object\") {\n /**\n * payload could also be a function in which case\n * we would have no way of knowing what it does,\n * so we default to false for non-objects\n */\n return false;\n }\n\n if (!payload.hasOwnProperty(attribute)) return false;\n const attributeValue = payload[attribute];\n if (attributeValue === null) return false;\n if (attributeValue === undefined) return false;\n\n return true;\n}\n\n/**\n * @return boolean\n */\nfunction clauseReducesResultSetSize({ type }) {\n return [FILTER, EXCLUDE].includes(type);\n}\n\n/**\n * @param {Object} object\n * @return Object\n */\nfunction mapValues(object, func) {\n return Object.entries(object).reduce((newObject, [key, value]) => {\n newObject[key] = func(value);\n return newObject;\n }, {});\n}\n\n/** */\nfunction normalizeModelReference(modelNameOrClass) {\n if (!modelNameOrClass || typeof modelNameOrClass === \"string\") {\n return modelNameOrClass;\n }\n return modelNameOrClass.modelName;\n}\n\nexport {\n attachQuerySetMethods,\n m2mName,\n m2mFromFieldName,\n m2mToFieldName,\n reverseFieldName,\n normalizeEntity,\n reverseFieldErrorMessage,\n objectShallowEquals,\n ops,\n arrayDiffActions,\n getBatchToken,\n clauseFiltersByAttribute,\n clauseReducesResultSetSize,\n warnDeprecated,\n mapValues,\n normalizeModelReference,\n};\n","import { normalizeEntity, warnDeprecated, mapValues } from \"./utils\";\n\nimport { UPDATE, DELETE, FILTER, EXCLUDE, ORDER_BY } from \"./constants\";\n\n/**\n * This class is used to build and make queries to the database\n * and operating the resulting set (such as updating attributes\n * or deleting the records).\n *\n * The queries are built lazily. For example:\n *\n * ```javascript\n * const qs = Book.all()\n * .filter(book => book.releaseYear > 1999)\n * .orderBy('name');\n * ```\n *\n * Doesn't execute a query. The query is executed only when\n * you need information from the query result, such as {@link QuerySet#count},\n * {@link QuerySet#toRefArray}. After the query is executed, the resulting\n * set is cached in the QuerySet instance.\n *\n * QuerySet instances also return copies, so chaining filters doesn't\n * mutate the previous instances.\n */\nconst QuerySet = class QuerySet {\n /**\n * Creates a QuerySet. The constructor is mainly for internal use;\n * You should access QuerySet instances from {@link Model}.\n *\n * @param {Model} modelClass - the model class of objects in this QuerySet.\n * @param {any[]} clauses - query clauses needed to evaluate the set.\n * @param {Object} [opts] - additional options\n */\n constructor(modelClass, clauses, opts) {\n Object.assign(this, {\n modelClass,\n clauses: clauses || [],\n });\n\n this._opts = opts;\n }\n\n static addSharedMethod(methodName) {\n this.sharedMethods = this.sharedMethods.concat(methodName);\n }\n\n _new(clauses, userOpts) {\n const opts = { ...this._opts, ...userOpts };\n return new this.constructor(this.modelClass, clauses, opts);\n }\n\n toString() {\n this._evaluate();\n const contents = this.rows\n .map(({ id }) => this.modelClass.withId(id).toString())\n .join(\"\\n - \");\n return `QuerySet contents:\\n - ${contents}`;\n }\n\n /**\n * Returns an array of the plain objects represented by the QuerySet.\n * The plain objects are direct references to the store.\n *\n * @return {Object[]} references to the plain JS objects represented by\n * the QuerySet\n */\n toRefArray() {\n return this._evaluate();\n }\n\n /**\n * Returns an array of {@link Model} instances represented by the QuerySet.\n * @return {Model[]} model instances represented by the QuerySet\n */\n toModelArray() {\n const { modelClass: ModelClass } = this;\n return this._evaluate().map(props => new ModelClass(props));\n }\n\n /**\n * Returns the number of {@link Model} instances represented by the QuerySet.\n *\n * @return {number} length of the QuerySet\n */\n count() {\n this._evaluate();\n return this.rows.length;\n }\n\n /**\n * Checks if the {@link QuerySet} instance has any records matching the query\n * in the database.\n *\n * @return {Boolean} `true` if the {@link QuerySet} instance contains entities, else `false`.\n */\n exists() {\n return Boolean(this.count());\n }\n\n /**\n * Returns the {@link Model} instance at index `index` in the {@link QuerySet} instance if\n * `withRefs` flag is set to `false`, or a reference to the plain JavaScript\n * object in the model state if `true`.\n *\n * @param {number} index - index of the model instance to get\n * @return {Model|undefined} a {@link Model} instance at index\n * `index` in the {@link QuerySet} instance,\n * or undefined if the index is out of bounds.\n */\n at(index) {\n const { modelClass: ModelClass } = this;\n\n const rows = this._evaluate();\n if (index >= 0 && index < rows.length) {\n return new ModelClass(rows[index]);\n }\n\n return undefined;\n }\n\n /**\n * Returns the {@link Model} instance at index 0 in the {@link QuerySet} instance.\n * @return {Model}\n */\n first() {\n return this.at(0);\n }\n\n /**\n * Returns the {@link Model} instance at index `QuerySet.count() - 1`\n * @return {Model}\n */\n last() {\n const rows = this._evaluate();\n return this.at(rows.length - 1);\n }\n\n /**\n * Returns a new {@link QuerySet} instance with the same entities.\n * @return {QuerySet} a new QuerySet with the same entities.\n */\n all() {\n return this._new(this.clauses);\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities that match properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to match objects with. Can also be a function.\n * It works the same as [Lodash filter](https://lodash.com/docs/#filter).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that passed the filter.\n */\n filter(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj =\n typeof lookupObj === \"object\"\n ? mapValues(lookupObj, normalizeEntity)\n : lookupObj;\n\n const filterDescriptor = {\n type: FILTER,\n payload: normalizedLookupObj,\n };\n /**\n * create a new QuerySet\n * including only rows matching the lookupObj\n */\n return this._new(this.clauses.concat(filterDescriptor));\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities that do not match\n * properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to unmatch objects with. Can also be a function.\n * It works the same as [Lodash reject](https://lodash.com/docs/#reject).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that did not pass the filter.\n */\n exclude(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj =\n typeof lookupObj === \"object\"\n ? mapValues(lookupObj, normalizeEntity)\n : lookupObj;\n const excludeDescriptor = {\n type: EXCLUDE,\n payload: normalizedLookupObj,\n };\n\n /**\n * create a new QuerySet\n * excluding all rows matching the lookupObj\n */\n return this._new(this.clauses.concat(excludeDescriptor));\n }\n\n /**\n * Performs the actual database query.\n * @private\n * @return {Array} rows corresponding to the QuerySet's clauses\n */\n _evaluate() {\n if (typeof this.modelClass.session === \"undefined\") {\n throw new Error(\n [\n `Tried to query the ${this.modelClass.modelName} model's table without a session. `,\n \"Create a session using `session = orm.session()` and use \",\n `\\`session[\"${this.modelClass.modelName}\"]\\` for querying instead.`,\n ].join(\"\")\n );\n }\n if (!this._evaluated) {\n const { session, modelName: table } = this.modelClass;\n const querySpec = {\n table,\n clauses: this.clauses,\n };\n this.rows = session.query(querySpec).rows;\n this._evaluated = true;\n }\n return this.rows;\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending\n * order, unless otherwise specified. Delegates to [Lodash orderBy](https://lodash.com/docs/#orderBy).\n *\n * @param {string[]|Function[]} iteratees - an array where each item can be a string or a\n * function. If a string is supplied, it should\n * correspond to property on the entity that will\n * determine the order. If a function is supplied,\n * it should return the value to order by.\n * @param {Array<Boolean|'asc'|'desc'>} [orders] - the sort orders of `iteratees`. If unspecified, all iteratees\n * will be sorted in ascending order. `true` and `'asc'`\n * correspond to ascending order, and `false` and `'desc'`\n * to descending order.\n * @return {QuerySet} a new {@link QuerySet} with objects ordered by `iteratees`.\n */\n orderBy(iteratees, orders) {\n const orderByDescriptor = {\n type: ORDER_BY,\n payload: [iteratees, orders],\n };\n\n /**\n * create a new QuerySet\n * sorting all rows according to the passed arguments\n */\n return this._new(this.clauses.concat(orderByDescriptor));\n }\n\n /**\n * Records an update specified with `mergeObj` to all the objects\n * in the {@link QuerySet} instance.\n *\n * @param {Object} mergeObj - an object to merge with all the objects in this\n * queryset.\n * @return {undefined}\n */\n update(mergeObj) {\n const { session, modelName: table } = this.modelClass;\n\n session.applyUpdate({\n action: UPDATE,\n query: {\n table,\n clauses: this.clauses,\n },\n payload: mergeObj,\n });\n\n this._evaluated = false;\n }\n\n /**\n * Records a deletion of all the objects in this {@link QuerySet} instance.\n * @return {undefined}\n */\n delete() {\n const { session, modelName: table } = this.modelClass;\n\n this.toModelArray().forEach(\n model => model._onDelete() // eslint-disable-line no-underscore-dangle\n );\n\n session.applyUpdate({\n action: DELETE,\n query: {\n table,\n clauses: this.clauses,\n },\n });\n\n this._evaluated = false;\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated\n * Use {@link QuerySet#toModelArray} or predicate functions that\n * instantiate Models from refs, e.g. `new Model(ref)`.\n */\n get withModels() {\n throw new Error(\n \"`QuerySet.prototype.withModels` has been removed. \" +\n \"Use `.toModelArray()` or predicate functions that \" +\n \"instantiate Models from refs, e.g. `new Model(ref)`.\"\n );\n }\n\n /**\n * @deprecated Query building operates on refs only now.\n */\n get withRefs() {\n warnDeprecated(\n \"`QuerySet.prototype.withRefs` has been deprecated. \" +\n \"Query building operates on refs only now.\"\n );\n return undefined;\n }\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to map.\n */\n map() {\n throw new Error(\n \"`QuerySet.prototype.map` has been removed. \" +\n \"Call `.toModelArray()` or `.toRefArray()` first to map.\"\n );\n }\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to iterate.\n */\n forEach() {\n throw new Error(\n \"`QuerySet.prototype.forEach` has been removed. \" +\n \"Call `.toModelArray()` or `.toRefArray()` first to iterate.\"\n );\n }\n};\n\nQuerySet.sharedMethods = [\n \"count\",\n \"at\",\n \"all\",\n \"last\",\n \"first\",\n \"filter\",\n \"exclude\",\n \"orderBy\",\n \"update\",\n \"delete\",\n];\n\nexport default QuerySet;\n","import { getBatchToken } from \"immutable-ops\";\n\nimport { SUCCESS, UPDATE, DELETE } from \"./constants\";\nimport { warnDeprecated, clauseFiltersByAttribute } from \"./utils\";\n\nconst Session = class Session {\n /**\n * Creates a new Session.\n *\n * @param {Database} db - a {@link Database} instance\n * @param {Object} state - the database state\n * @param {Boolean} [withMutations] - whether the session should mutate data\n * @param {Object} [batchToken] - used by the backend to identify objects that can be\n * mutated.\n */\n constructor(schema, db, state, withMutations, batchToken) {\n this.schema = schema;\n this.db = db;\n this.state = state || db.getEmptyState();\n this.initialState = this.state;\n\n this.withMutations = Boolean(withMutations);\n this.batchToken = batchToken || getBatchToken();\n\n this.modelData = {};\n\n this.models = schema.getModelClasses();\n\n this.sessionBoundModels = this.models.map(modelClass => {\n function SessionBoundModel() {\n return Reflect.construct(\n modelClass,\n arguments,\n SessionBoundModel\n ); // eslint-disable-line prefer-rest-params\n }\n Reflect.setPrototypeOf(\n SessionBoundModel.prototype,\n modelClass.prototype\n );\n Reflect.setPrototypeOf(SessionBoundModel, modelClass);\n\n Object.defineProperty(this, modelClass.modelName, {\n get: () => SessionBoundModel,\n });\n\n SessionBoundModel.connect(this);\n return SessionBoundModel;\n });\n }\n\n getDataForModel(modelName) {\n if (!this.modelData[modelName]) {\n this.modelData[modelName] = {};\n }\n return this.modelData[modelName];\n }\n\n getModelData() {\n return this.modelData;\n }\n\n markAccessed(modelName, modelIds) {\n const data = this.getDataForModel(modelName);\n if (!data.accessedInstances) {\n data.accessedInstances = {};\n }\n modelIds.forEach(id => {\n data.accessedInstances[id] = true;\n });\n }\n\n get accessedModelInstances() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.accessedInstances) {\n result[key] = value.accessedInstances;\n }\n return result;\n },\n {}\n );\n }\n\n markFullTableScanned(modelName) {\n const data = this.getDataForModel(modelName);\n data.fullTableScanned = true;\n }\n\n get fullTableScannedModels() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.fullTableScanned) {\n result.push(key);\n }\n return result;\n },\n []\n );\n }\n\n markAccessedIndexes(indexes) {\n indexes.forEach(([table, attr, value]) => {\n const data = this.getDataForModel(table);\n if (!data.accessedIndexes) {\n data.accessedIndexes = {};\n }\n data.accessedIndexes[attr] = [\n ...(data.accessedIndexes[attr] || []),\n value,\n ];\n });\n }\n\n get accessedIndexes() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.accessedIndexes) {\n result[key] = value.accessedIndexes;\n }\n return result;\n },\n {}\n );\n }\n\n /**\n * Applies update to a model state.\n *\n * @private\n * @param {Object} update - the update object. Must have keys\n * `type`, `payload`.\n */\n applyUpdate(updateSpec) {\n const tx = this._getTransaction(updateSpec);\n const result = this.db.update(updateSpec, tx, this.state);\n const { status, state, payload } = result;\n\n if (status !== SUCCESS) {\n throw new Error(\n `Applying update failed with status ${status}. Payload: ${payload}`\n );\n }\n\n this.state = state;\n\n return payload;\n }\n\n query(querySpec) {\n const result = this.db.query(querySpec, this.state);\n\n this._markAccessedByQuery(querySpec, result);\n\n return result;\n }\n\n _getTransaction(updateSpec) {\n const { withMutations } = this;\n const { action } = updateSpec;\n let { batchToken } = this;\n if ([UPDATE, DELETE].includes(action)) {\n batchToken = getBatchToken();\n }\n return { batchToken, withMutations };\n }\n\n _markAccessedByQuery(querySpec, result) {\n const { table, clauses } = querySpec;\n const { rows } = result;\n\n const { idAttribute } = this[table];\n const accessedIds = new Set(rows.map(row => row[idAttribute]));\n\n const anyClauseFilteredByPk = clauses.some(clause => {\n if (!clauseFiltersByAttribute(clause, idAttribute)) {\n return false;\n }\n /**\n * We previously knew which row we wanted to access,\n * so there was no need to scan the entire table.\n */\n accessedIds.add(clause.payload[idAttribute]);\n return true;\n });\n\n const accessedIndexes = [];\n const { indexes } = this.state[table];\n clauses.forEach(clause => {\n Object.keys(indexes).forEach(attr => {\n if (!clauseFiltersByAttribute(clause, attr)) {\n return;\n }\n const value = clause.payload[attr];\n accessedIndexes.push([table, attr, value]);\n });\n });\n\n if (anyClauseFilteredByPk) {\n /**\n * The clauses have been ordered so that an indexed one was\n * the first to have been evaluated, and thus only the row\n * with the specified PK value has actually been accessed.\n */\n this.markAccessed(table, accessedIds);\n } else if (accessedIndexes.length) {\n /**\n * At least one clause was optimized using indexes.\n */\n this.markAccessed(table, accessedIds);\n this.markAccessedIndexes(accessedIndexes);\n } else {\n /**\n * At least one clause could not be efficiently optimized\n * or no clause was specified at all.\n */\n this.markFullTableScanned(table);\n }\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Access {@link Session#state} instead.\n */\n getNextState() {\n warnDeprecated(\n \"`Session.prototype.getNextState` has been deprecated. Access \" +\n \"the `Session.prototype.state` property instead.\"\n );\n return this.state;\n }\n\n /**\n * @deprecated\n * The Redux integration API is now decoupled from ORM and Session.<br>\n * See the 0.9 migration guide in the GitHub repo.\n */\n reduce() {\n throw new Error(\n \"`Session.prototype.reduce` has been removed. The Redux integration API \" +\n \"is now decoupled from ORM and Session - see the 0.9 migration guide \" +\n \"in the GitHub repo.\"\n );\n }\n};\n\nexport default Session;\n","import FieldInstallerTemplate from \"./FieldInstallerTemplate\";\n\nimport { reverseFieldErrorMessage } from \"../utils\";\n\n/**\n * Default implementation for the template method in FieldInstallerTemplate.\n * @private\n * @memberof module:fields\n */\nexport class DefaultFieldInstaller extends FieldInstallerTemplate {\n installForwardsDescriptor() {\n Object.defineProperty(\n this.model.prototype,\n this.fieldName,\n this.field.createForwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n\n installForwardsVirtualField() {\n this.model.virtualFields[\n this.fieldName\n ] = this.field.createForwardsVirtualField(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n );\n }\n\n installBackwardsDescriptor() {\n const backwardsDescriptor = Object.getOwnPropertyDescriptor(\n this.toModel.prototype,\n this.backwardsFieldName\n );\n if (backwardsDescriptor) {\n throw new Error(\n reverseFieldErrorMessage(\n this.model.modelName,\n this.fieldName,\n this.toModel.modelName,\n this.backwardsFieldName\n )\n );\n }\n\n // install backwards descriptor\n Object.defineProperty(\n this.toModel.prototype,\n this.backwardsFieldName,\n this.field.createBackwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n\n installBackwardsVirtualField() {\n this.toModel.virtualFields[\n this.backwardsFieldName\n ] = this.field.createBackwardsVirtualField(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n );\n }\n}\n\nexport default DefaultFieldInstaller;\n","/**\n * Defines algorithm for installing a field onto a model and related models.\n * Conforms to the template method behavioral design pattern.\n * @private\n * @memberof module:fields\n */\nexport class FieldInstallerTemplate {\n constructor(opts) {\n this.field = opts.field;\n this.fieldName = opts.fieldName;\n this.model = opts.model;\n this.orm = opts.orm;\n /**\n * the field itself has no knowledge of the model\n * it is being installed upon; we need to inform it\n * that it is a self-referencing field for the field\n * to be able to make better informed decisions\n */\n if (this.field.references(this.model)) {\n this.field.toModelName = \"this\";\n }\n }\n\n get toModel() {\n if (typeof this._toModel === \"undefined\") {\n const { toModelName } = this.field;\n if (!toModelName) {\n this._toModel = null;\n } else if (toModelName === \"this\") {\n this._toModel = this.model;\n } else {\n this._toModel = this.orm.get(toModelName);\n }\n }\n return this._toModel;\n }\n\n get throughModel() {\n if (typeof this._throughModel === \"undefined\") {\n const throughModelName = this.field.getThroughModelName(\n this.fieldName,\n this.model\n );\n if (!throughModelName) {\n this._throughModel = null;\n } else {\n this._throughModel = this.orm.get(throughModelName);\n }\n }\n return this._throughModel;\n }\n\n get backwardsFieldName() {\n return this.field.getBackwardsFieldName(this.model);\n }\n\n run() {\n this.installForwardsDescriptor();\n if (this.field.installsForwardsVirtualField) {\n this.installForwardsVirtualField();\n }\n /**\n * Install a backwards field on a model as a consequence\n * of having installed the forwards field on another model.\n */\n if (this.field.installsBackwardsDescriptor) {\n this.installBackwardsDescriptor();\n }\n if (this.field.installsBackwardsVirtualField) {\n this.installBackwardsVirtualField();\n }\n }\n}\n\nexport default FieldInstallerTemplate;\n","import DefaultFieldInstaller from \"./DefaultFieldInstaller\";\n\n/**\n * @private\n * @memberof module:fields\n */\nexport class Field {\n get installerClass() {\n return DefaultFieldInstaller;\n }\n\n getClass() {\n return this.constructor;\n }\n\n references(model) {\n return false;\n }\n\n getThroughModelName(fieldName, model) {\n return null;\n }\n\n get installsForwardsVirtualField() {\n return false;\n }\n\n get installsBackwardsDescriptor() {\n return false;\n }\n\n get installsBackwardsVirtualField() {\n return false;\n }\n\n get index() {\n return false;\n }\n}\n\nexport default Field;\n","import { normalizeEntity } from \"./utils\";\n\n/**\n * The functions in this file return custom JS property descriptors\n * that are supposed to be assigned to Model fields.\n *\n * Some include the logic to look up models using foreign keys and\n * to add or remove relationships between models.\n *\n * @module descriptors\n * @private\n */\n\n/**\n * Defines a basic non-key attribute.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n */\nfunction attrDescriptor(fieldName) {\n return {\n get() {\n return this._fields[fieldName];\n },\n\n set(value) {\n return this.set(fieldName, value);\n },\n\n enumerable: true,\n configurable: true,\n };\n}\n\n/**\n * Forwards direction of a Foreign Key: returns one object.\n * Also works as {@link .forwardsOneToOneDescriptor|forwardsOneToOneDescriptor}.\n *\n * For `book.author` referencing an `Author` model instance,\n * `fieldName` would be `'author'` and `declaredToModelName` would be `'Author'`.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n * @param {string} declaredToModelName - the name of the model that the field references.\n */\nfunction forwardsManyToOneDescriptor(fieldName, declaredToModelName) {\n return {\n get() {\n const {\n session: { [declaredToModelName]: DeclaredToModel },\n } = this.getClass();\n const { [fieldName]: toId } = this._fields;\n\n return DeclaredToModel.withId(toId);\n },\n set(value) {\n this.update({\n [fieldName]: normalizeEntity(value),\n });\n },\n };\n}\n\n/**\n * Dereferencing foreign keys in {@link module:fields.oneToOne|oneToOne}\n * relationships works the same way as in many-to-one relationships:\n * just look up the related model.\n *\n * For example, a human face tends to have a single nose.\n * So if we want to resolve `face.nose`, we need to\n * look up the `Nose` that has the primary key that `face` references.\n *\n * @see {@link module:descriptors~forwardsManyToOneDescriptor|forwardsManyToOneDescriptor}\n */\nfunction forwardsOneToOneDescriptor(...args) {\n return forwardsManyToOneDescriptor(...args);\n}\n\n/**\n * Here we resolve 1-to-1 relationships starting at the model on which the\n * field was not installed. This means we need to find the instance of the\n * other model whose {@link module:fields.oneToOne|oneToOne} FK field contains the current model's primary key.\n *\n * @param {string} declaredFieldName - the name of the field referencing the current model.\n * @param {string} declaredFromModelName - the name of the other model.\n */\nfunction backwardsOneToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: { [declaredFromModelName]: DeclaredFromModel },\n } = this.getClass();\n\n return DeclaredFromModel.get({\n [declaredFieldName]: this.getId(),\n });\n },\n set() {\n throw new Error(\"Can't mutate a reverse one-to-one relation.\");\n },\n };\n}\n\n/**\n * The backwards direction of a n-to-1 relationship (i.e. 1-to-n),\n * meaning this will return an a collection (`QuerySet`) of model instances.\n *\n * An example would be `author.books` referencing all instances of\n * the `Book` model that reference the author using `fk()`.\n */\nfunction backwardsManyToOneDescriptor(\n declaredFieldName,\n declaredFromModelName\n) {\n return {\n get() {\n const {\n session: { [declaredFromModelName]: DeclaredFromModel },\n } = this.getClass();\n\n return DeclaredFromModel.filter({\n [declaredFieldName]: this.getId(),\n });\n },\n set() {\n throw new Error(\"Can't mutate a reverse many-to-one relation.\");\n },\n };\n}\n\n/**\n * This descriptor is assigned to both sides of a many-to-many relationship.\n * To indicate the backwards direction pass `true` for `reverse`.\n */\nfunction manyToManyDescriptor(\n declaredFromModelName,\n declaredToModelName,\n throughModelName,\n throughFields,\n reverse\n) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel,\n [declaredToModelName]: DeclaredToModel,\n [throughModelName]: ThroughModel,\n },\n } = this.getClass();\n\n const ThisModel = reverse ? DeclaredToModel : DeclaredFromModel;\n const OtherModel = reverse ? DeclaredFromModel : DeclaredToModel;\n\n const thisReferencingField = reverse\n ? throughFields.to\n : throughFields.from;\n const otherReferencingField = reverse\n ? throughFields.from\n : throughFields.to;\n\n const thisId = this.getId();\n\n const throughQs = ThroughModel.filter({\n [thisReferencingField]: thisId,\n });\n\n /**\n * all IDs of instances of the other model that are\n * referenced by any instance of the current model\n */\n const referencedOtherIds = new Set(\n throughQs.toRefArray().map(obj => obj[otherReferencingField])\n );\n\n /**\n * selects all instances of other model that are referenced\n * by any instance of the current model\n */\n const qs = OtherModel.filter(otherModelInstance =>\n referencedOtherIds.has(\n otherModelInstance[OtherModel.idAttribute]\n )\n );\n\n /**\n * Allows adding OtherModel instances to be referenced by the current instance.\n *\n * E.g. Book.first().authors.add(1, 2) would add the authors with IDs 1 and 2\n * to the first book's list of referenced authors.\n *\n * @return undefined\n */\n qs.add = function add(...entities) {\n const idsToAdd = new Set(entities.map(normalizeEntity));\n\n const existingQs = throughQs.filter(through =>\n idsToAdd.has(through[otherReferencingField])\n );\n\n if (existingQs.exists()) {\n const existingIds = existingQs\n .toRefArray()\n .map(through => through[otherReferencingField]);\n\n throw new Error(\n `Tried to add already existing ${OtherModel.modelName} id(s) ${existingIds} to the ${ThisModel.modelName} instance with id ${thisId}`\n );\n }\n\n idsToAdd.forEach(id => {\n ThroughModel.create({\n [otherReferencingField]: id,\n [thisReferencingField]: thisId,\n });\n });\n };\n\n /**\n * Removes references to all OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.clear() would cause the first book's list\n * of referenced authors to become empty.\n *\n * @return undefined\n */\n qs.clear = function clear() {\n throughQs.delete();\n };\n\n /**\n * Removes references to all passed OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.remove(1, 2) would cause the authors with\n * IDs 1 and 2 to no longer be referenced by the first book.\n *\n * @return undefined\n */\n qs.remove = function remove(...entities) {\n const idsToRemove = new Set(entities.map(normalizeEntity));\n\n const entitiesToDelete = throughQs.filter(through =>\n idsToRemove.has(through[otherReferencingField])\n );\n\n if (entitiesToDelete.count() !== idsToRemove.size) {\n // Tried deleting non-existing entities.\n const entitiesToDeleteIds = entitiesToDelete\n .toRefArray()\n .map(through => through[otherReferencingField]);\n\n const unexistingIds = [...idsToRemove].filter(\n id => !entitiesToDeleteIds.includes(id)\n );\n\n throw new Error(\n `Tried to delete non-existing ${OtherModel.modelName} id(s) ${unexistingIds} from the ${ThisModel.modelName} instance with id ${thisId}`\n );\n }\n\n entitiesToDelete.delete();\n };\n\n return qs;\n },\n\n set() {\n throw new Error(\n \"Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.\"\n );\n },\n };\n}\n\nexport {\n attrDescriptor,\n forwardsManyToOneDescriptor,\n forwardsOneToOneDescriptor,\n backwardsOneToOneDescriptor,\n backwardsManyToOneDescriptor,\n manyToManyDescriptor,\n};\n","import Field from \"./Field\";\n\nimport { attrDescriptor } from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class Attribute extends Field {\n constructor(opts) {\n super();\n this.opts = opts || {};\n\n if (this.opts.hasOwnProperty(\"getDefault\")) {\n this.getDefault = this.opts.getDefault;\n }\n }\n\n createForwardsDescriptor(fieldName, model) {\n return attrDescriptor(fieldName);\n }\n}\n\nexport default Attribute;\n","/* eslint-disable max-classes-per-file */\nimport Field from \"./Field\";\nimport DefaultFieldInstaller from \"./DefaultFieldInstaller\";\n\nimport { reverseFieldName, normalizeModelReference } from \"../utils\";\n\n/**\n * @private\n * @memberof module:fields\n */\nexport class RelationalField extends Field {\n constructor(...args) {\n super();\n if (args.length === 1 && typeof args[0] === \"object\") {\n const opts = args[0];\n this.toModelName = normalizeModelReference(opts.to);\n this.relatedName = opts.relatedName;\n this.through = normalizeModelReference(opts.through);\n this.throughFields = opts.throughFields;\n this.as = opts.as;\n } else {\n [this.toModelName, this.relatedName] = [\n normalizeModelReference(args[0]),\n args[1],\n ];\n }\n }\n\n getBackwardsFieldName(model) {\n return this.relatedName || reverseFieldName(model.modelName);\n }\n\n createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField(model.modelName, fieldName);\n }\n\n get installsBackwardsVirtualField() {\n return true;\n }\n\n get installsBackwardsDescriptor() {\n return true;\n }\n\n references(model) {\n return this.toModelName === model.modelName;\n }\n\n get installerClass() {\n return class AliasedForwardsDescriptorInstaller extends DefaultFieldInstaller {\n installForwardsDescriptor() {\n Object.defineProperty(\n this.model.prototype,\n this.field.as || this.fieldName, // use supplied name if possible\n this.field.createForwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n };\n }\n}\n\nexport default RelationalField;\n","import RelationalField from \"./RelationalField\";\n\nimport {\n forwardsManyToOneDescriptor,\n backwardsManyToOneDescriptor,\n} from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class ForeignKey extends RelationalField {\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return forwardsManyToOneDescriptor(fieldName, toModel.modelName);\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return backwardsManyToOneDescriptor(fieldName, model.modelName);\n }\n\n get index() {\n return true;\n }\n}\n\nexport default ForeignKey;\n","import RelationalField from \"./RelationalField\";\n\nimport { manyToManyDescriptor } from \"../descriptors\";\n\nimport { m2mName, m2mToFieldName, m2mFromFieldName } from \"../utils\";\n\n/**\n * @memberof module:fields\n */\nexport class ManyToMany extends RelationalField {\n getDefault() {\n return [];\n }\n\n getThroughModelName(fieldName, model) {\n return this.through || m2mName(model.modelName, fieldName);\n }\n\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return manyToManyDescriptor(\n model.modelName,\n toModel.modelName,\n throughModel.modelName,\n this.getThroughFields(fieldName, model, toModel, throughModel),\n false\n );\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return manyToManyDescriptor(\n model.modelName,\n toModel.modelName,\n throughModel.modelName,\n this.getThroughFields(fieldName, model, toModel, throughModel),\n true\n );\n }\n\n createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: model.modelName,\n relatedName: fieldName,\n through: throughModel.modelName,\n throughFields: this.getThroughFields(\n fieldName,\n model,\n toModel,\n throughModel\n ),\n });\n }\n\n createForwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: toModel.modelName,\n relatedName: fieldName,\n through: this.through,\n throughFields: this.getThroughFields(\n fieldName,\n model,\n toModel,\n throughModel\n ),\n as: this.as,\n });\n }\n\n get installsForwardsVirtualField() {\n return true;\n }\n\n getThroughFields(fieldName, model, toModel, throughModel) {\n if (this.throughFields) {\n const [fieldAName, fieldBName] = this.throughFields;\n const fieldA = throughModel.fields[fieldAName];\n return {\n to: fieldA.references(toModel) ? fieldAName : fieldBName,\n from: fieldA.references(toModel) ? fieldBName : fieldAName,\n };\n }\n\n if (model.modelName === toModel.modelName) {\n /**\n * we have no way of determining the relationship's\n * direction here, so we need to assume that the user\n * did not use a custom through model\n * see ORM#registerManyToManyModelsFor\n */\n return {\n to: m2mToFieldName(toModel.modelName),\n from: m2mFromFieldName(model.modelName),\n };\n }\n\n /**\n * determine which field references which model\n * and infer the directions from that\n */\n const throughModelFieldReferencing = otherModel =>\n Object.keys(throughModel.fields).find(someFieldName =>\n throughModel.fields[someFieldName].references(otherModel)\n );\n\n return {\n to: throughModelFieldReferencing(toModel),\n from: throughModelFieldReferencing(model),\n };\n }\n}\n\nexport default ManyToMany;\n","import RelationalField from \"./RelationalField\";\n\nimport {\n forwardsOneToOneDescriptor,\n backwardsOneToOneDescriptor,\n} from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class OneToOne extends RelationalField {\n getBackwardsFieldName(model) {\n return this.relatedName || model.modelName.toLowerCase();\n }\n\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return forwardsOneToOneDescriptor(fieldName, toModel.modelName);\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return backwardsOneToOneDescriptor(fieldName, model.modelName);\n }\n}\n\nexport default OneToOne;\n","import Attribute from \"./Attribute\";\nimport ForeignKey from \"./ForeignKey\";\nimport ManyToMany from \"./ManyToMany\";\nimport OneToOne from \"./OneToOne\";\n\n/**\n * Contains the logic for how fields on {@link Model}s work\n * and which descriptors must be installed.\n *\n * If your goal is to define fields on a Model class,\n * please use the more convenient methods {@link attr},\n * {@link fk}, {@link many} and {@link oneToOne}.\n *\n * @module fields\n */\n\n/**\n * Defines a value attribute on the model.\n * Though not required, it is recommended to define this for each non-foreign key you wish to use.\n * Getters and setters need to be defined on each Model\n * instantiation for undeclared data fields, which is slower.\n * You can use the optional `getDefault` parameter to fill in unpassed values\n * to {@link Model.create}, such as for generating ID's with UUID:\n *\n * ```javascript\n * import getUUID from 'your-uuid-package-of-choice';\n *\n * fields = {\n * id: attr({ getDefault: () => getUUID() }),\n * title: attr(),\n * }\n * ```\n *\n * @param {Object} [opts]\n * @param {Function} [opts.getDefault] - If you give a function here, its return\n * value from calling with zero arguments will\n * be used as the value when creating a new Model\n * instance with {@link Model#create} if the field\n * value is not passed.\n * @return {Attribute}\n */\nfunction attr(opts) {\n return new Attribute(opts);\n}\n\n/**\n * Defines a foreign key on a model, which points\n * to a single entity on another model.\n *\n * You can pass arguments as either a single object,\n * or two arguments.\n *\n * If you pass two arguments, the first one is the name\n * of the Model the foreign key is pointing to, and\n * the second one is an optional related name, which will\n * be used to access the Model the foreign key\n * is being defined from, from the target Model.\n *\n * If the related name is not passed, it will be set as\n * `${toModelName}Set`.\n *\n * If you pass an object to `fk`, it has to be in the form\n *\n * ```javascript\n * fields = {\n * author: fk({ to: 'Author', relatedName: 'books' })\n * }\n * ```\n *\n * Which is equal to\n *\n * ```javascript\n * fields = {\n * author: fk('Author', 'books'),\n * }\n * ```\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access\n * a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ForeignKey}\n */\nfunction fk(...args) {\n return new ForeignKey(...args);\n}\n\n/**\n * Defines a many-to-many relationship between\n * this (source) and another (target) model.\n *\n * The relationship is modeled with an extra model called the through model.\n * The through model has foreign keys to both the source and target models.\n *\n * You can define your own through model if you want to associate more information\n * to the relationship. A custom through model must have at least two foreign keys,\n * one pointing to the source Model, and one pointing to the target Model.\n *\n * Like `fk`, this function accepts one or two string arguments specifying the other\n * Model and the related name, or a single object argument that allows you to pass\n * a custom through model.\n *\n * If you have more than one foreign key pointing to a source or target Model in the\n * through Model, you must pass the option `throughFields`, which is an array of two\n * strings, where the strings are the field names that identify the foreign keys to\n * be used for the many-to-many relationship. Redux-ORM will figure out which field name\n * points to which model by checking the \"through model\" definition.\n *\n * ```javascript\n * class Authorship extends Model {}\n * Authorship.modelName = 'Authorship';\n * Authorship.fields = {\n * author: fk('Author', 'authorships'),\n * book: fk('Book', 'authorships'),\n * };\n *\n * class Author extends Model {}\n * Author.modelName = 'Author';\n * Author.fields = {\n * books: many({\n * to: 'Book',\n * relatedName: 'authors',\n * through: 'Authorship',\n *\n * // here this is optional: Redux-ORM can figure\n * // out the through fields itself since the two\n * // foreign key fields point to different Models\n * throughFields: ['author', 'book'],\n * })\n * };\n *\n * class Book extends Model {}\n * Book.modelName = 'Book';\n * ```\n *\n * You should only define the many-to-many relationship on one side. In the\n * above case of Authors to Books through Authorships, the relationship is\n * defined only on the Author model.\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string|Class<Model>} [options.through] - The through Model class or its `modelName`\n * attribute. It must declare at least one\n * foreign key to both source and target models.\n * If not supplied, Redux-ORM will generate one.\n * @param {string[]} [options.throughFields] - Must be supplied only when a custom through\n * Model has more than one foreign key pointing to\n * either the source or target mode. In this case\n * Redux-ORM can't figure out the correct fields for\n * you, you must provide them. The supplied array should\n * have two elements that are the field names for the\n * through fields you want to declare the many-to-many\n * relationship with. The order doesn't matter;\n * Redux-ORM will figure out which field points to\n * the source Model and which to the target Model.\n * @param {string} [options.relatedName] - The attribute used to access a QuerySet for all\n * source models that reference the respective target\n * Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ManyToMany}\n */\nfunction many(...args) {\n return new ManyToMany(...args);\n}\n\n/**\n * Defines a one-to-one relationship. In database terms, this is a foreign key with the\n * added restriction that only one entity can point to single target entity.\n *\n * The arguments are the same as with `fk`. If `relatedName` is not supplied,\n * the source model name in lowercase will be used. Note that with the one-to-one\n * relationship, the `relatedName` should be in singular, not plural.\n *\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance.\n * @param {string} [relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance\n * @return {OneToOne}\n */\nfunction oneToOne(...args) {\n return new OneToOne(...args);\n}\n\nexport { fk, attr, many, oneToOne };\n","import Session from \"./Session\";\nimport QuerySet from \"./QuerySet\";\n\nimport { attr } from \"./fields\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\nimport OneToOne from \"./fields/OneToOne\";\n\nimport { CREATE, UPDATE, DELETE, FILTER } from \"./constants\";\nimport {\n normalizeEntity,\n arrayDiffActions,\n objectShallowEquals,\n warnDeprecated,\n m2mName,\n} from \"./utils\";\n\n/**\n * Generates a query specification to get the instance's\n * corresponding table row using its primary key.\n *\n * @private\n * @returns {Object}\n */\nfunction getByIdQuery(modelInstance) {\n const modelClass = modelInstance.getClass();\n const { idAttribute, modelName } = modelClass;\n\n return {\n table: modelName,\n clauses: [\n {\n type: FILTER,\n payload: {\n [idAttribute]: modelInstance.getId(),\n },\n },\n ],\n };\n}\n\n/**\n * The heart of an ORM, the data model.\n *\n * The fields you specify to the Model will be used to generate\n * a schema to the database, related property accessors, and\n * possibly through models.\n *\n * In each {@link Session} you instantiate from an {@link ORM} instance,\n * you will receive a session-specific subclass of this Model. The methods\n * you define here will be available to you in sessions.\n *\n * An instance of {@link Model} represents a record in the database, though\n * it is possible to generate multiple instances from the same record in the database.\n *\n * To create data models in your schema, subclass {@link Model}. To define\n * information about the data model, override static class methods. Define instance\n * logic by defining prototype methods (without `static` keyword).\n */\nconst Model = class Model {\n /**\n * Creates a Model instance from it's properties.\n * Don't use this to create a new record; Use the static method {@link Model#create}.\n * @param {Object} props - the properties to instantiate with\n */\n constructor(props) {\n this._initFields(props);\n }\n\n _initFields(props) {\n const propsObj = Object(props);\n this._fields = { ...propsObj };\n\n Object.keys(propsObj).forEach(fieldName => {\n // In this case, we got a prop that wasn't defined as a field.\n // Assuming it's an arbitrary data field, making an instance-specific\n // descriptor for it.\n // Using the in operator as the property could be defined anywhere\n // on the prototype chain.\n if (!(fieldName in this)) {\n Object.defineProperty(this, fieldName, {\n get: () => this._fields[fieldName],\n set: value => this.set(fieldName, value),\n configurable: true,\n enumerable: true,\n });\n }\n });\n }\n\n static toString() {\n return `ModelClass: ${this.modelName}`;\n }\n\n /**\n * Returns the options object passed to the database for the table that represents\n * this Model class.\n *\n * Returns an empty object by default, which means the database\n * will use default options. You can either override this function to return the options\n * you want to use, or assign the options object as a static property of the same name to the\n * Model class.\n *\n * @return {Object} the options object passed to the database for the table\n * representing this Model class.\n */\n static options() {\n return {};\n }\n\n /**\n * Manually mark individual instances as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<*>} ids - Array of primary key values\n * @return {undefined}\n */\n static markAccessed(ids) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark rows of the ${this.modelName} model as accessed without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markAccessed\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markAccessed(this.modelName, ids);\n }\n\n /**\n * Manually mark this model's table as scanned.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @return {undefined}\n */\n static markFullTableScanned() {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark the ${this.modelName} model as full table scanned without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markFullTableScanned\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markFullTableScanned(this.modelName);\n }\n\n /**\n * Manually mark indexes as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<Array.<*,*>>} indexes - Array of column-value pairs\n * @return {undefined}\n */\n static markAccessedIndexes(indexes) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markAccessedIndexes\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markAccessedIndexes(\n indexes.map(([attribute, value]) => [\n this.modelName,\n attribute,\n value,\n ])\n );\n }\n\n /**\n * Returns the id attribute of this {@link Model}.\n *\n * @return {string} The id attribute of this {@link Model}.\n */\n static get idAttribute() {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to get the ${this.modelName} model's id attribute without a session. `,\n \"Create a session using `session = orm.session()` and access \",\n `\\`session[\"${this.modelName}\"].idAttribute\\` instead.`,\n ].join(\"\")\n );\n }\n return this.session.db.describe(this.modelName).idAttribute;\n }\n\n /**\n * Connect the model class to a {@link Session}.\n *\n * @private\n * @param {Session} session - The session to connect to.\n */\n static connect(session) {\n if (!(session instanceof Session)) {\n throw new Error(\n \"A model can only be connected to instances of Session.\"\n );\n }\n this._session = session;\n }\n\n /**\n * Get the current {@link Session} instance.\n *\n * @private\n * @return {Session} The current {@link Session} instance.\n */\n static get session() {\n return this._session;\n }\n\n /**\n * Returns an instance of the model's `querySetClass` field.\n * By default, this will be an empty {@link QuerySet}.\n *\n * @return {Object} An instance of the model's `querySetClass`.\n */\n static getQuerySet() {\n const { querySetClass: QuerySetClass } = this;\n return new QuerySetClass(this);\n }\n\n /**\n * @return {undefined}\n */\n static invalidateClassCache() {\n this.isSetUp = undefined;\n this.virtualFields = {};\n }\n\n /**\n * @see {@link Model.getQuerySet}\n */\n static get query() {\n return this.getQuerySet();\n }\n\n /**\n * Returns parameters to be passed to {@link Table} instance.\n *\n * @private\n */\n static tableOptions() {\n if (typeof this.backend === \"function\") {\n warnDeprecated(\n \"`Model.backend` has been deprecated. Please rename to `.options`.\"\n );\n return this.backend();\n }\n if (this.backend) {\n warnDeprecated(\n \"`Model.backend` has been deprecated. Please rename to `.options`.\"\n );\n return this.backend;\n }\n if (typeof this.options === \"function\") {\n return this.options();\n }\n return this.options;\n }\n\n /**\n * Creates a new record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the new {@link Model}'s properties.\n * @return {Model} a new {@link Model} instance.\n */\n static create(userProps) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to create a ${this.modelName} model instance without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].create\\` instead.`,\n ].join(\"\")\n );\n }\n const props = { ...userProps };\n\n const m2mRelations = {};\n\n const declaredFieldNames = Object.keys(this.fields);\n const declaredVirtualFieldNames = Object.keys(this.virtualFields);\n\n declaredFieldNames.forEach(key => {\n const field = this.fields[key];\n const valuePassed = userProps.hasOwnProperty(key);\n if (!(field instanceof ManyToMany)) {\n if (valuePassed) {\n const value = userProps[key];\n props[key] = normalizeEntity(value);\n } else if (field.getDefault) {\n props[key] = field.getDefault();\n }\n } else if (valuePassed) {\n // Save for later processing\n m2mRelations[key] = userProps[key];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete props[key];\n }\n }\n });\n\n // add backward many-many if required\n declaredVirtualFieldNames.forEach(key => {\n if (!m2mRelations.hasOwnProperty(key)) {\n const field = this.virtualFields[key];\n if (\n userProps.hasOwnProperty(key) &&\n field instanceof ManyToMany\n ) {\n // If a value is supplied for a ManyToMany field,\n // discard them from props and save for later processing.\n m2mRelations[key] = userProps[key];\n delete props[key];\n }\n }\n });\n\n const newEntry = this.session.applyUpdate({\n action: CREATE,\n table: this.modelName,\n payload: props,\n });\n\n const ThisModel = this;\n const instance = new ThisModel(newEntry);\n instance._refreshMany2Many(m2mRelations); // eslint-disable-line no-underscore-dangle\n return instance;\n }\n\n /**\n * Creates a new or update existing record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the required {@link Model}'s properties.\n * @return {Model} a {@link Model} instance.\n */\n static upsert(userProps) {\n if (typeof this.session === \"undefined\") {\n throw new Error(\n [\n `Tried to upsert a ${this.modelName} model instance without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].upsert\\` instead.`,\n ].join(\"\")\n );\n }\n\n const { idAttribute } = this;\n if (userProps.hasOwnProperty(idAttribute)) {\n const id = userProps[idAttribute];\n if (this.idExists(id)) {\n const model = this.withId(id);\n model.update(userProps);\n return model;\n }\n }\n\n return this.create(userProps);\n }\n\n /**\n * Returns a {@link Model} instance for the object with id `id`.\n * Returns `null` if the model has no instance with id `id`.\n *\n * You can use {@link Model#idExists} to check for existence instead.\n *\n * @param {*} id - the `id` of the object to get\n * @throws If object with id `id` doesn't exist\n * @return {Model|null} {@link Model} instance with id `id`\n */\n static withId(id) {\n return this.get({\n [this.idAttribute]: id,\n });\n }\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n *\n * @since 0.11.0\n */\n static idExists(id) {\n return this.exists({\n [this.idAttribute]: id,\n });\n }\n\n /**\n * Returns a boolean indicating if an entity\n * with the given props exists in the state.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n */\n static exists(lookupObj) {\n if (typeof this.session === \"undefined\") {\n throw new Error(\n [\n `Tried to check if a ${this.modelName} model instance exists without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].exists\\` instead.`,\n ].join(\"\")\n );\n }\n\n return Boolean(this._findDatabaseRows(lookupObj).length);\n }\n\n /**\n * Gets the {@link Model} instance that matches properties in `lookupObj`.\n * Throws an error if {@link Model} if multiple records match\n * the properties.\n *\n * @param {Object} lookupObj - the properties used to match a single entity.\n * @throws {Error} If more than one entity matches the properties in `lookupObj`.\n * @return {Model} a {@link Model} instance that matches the properties in `lookupObj`.\n */\n static get(lookupObj) {\n const ThisModel = this;\n\n const rows = this._findDatabaseRows(lookupObj);\n if (rows.length === 0) {\n return null;\n }\n if (rows.length > 1) {\n throw new Error(\n `Expected to find a single row in \\`${this.modelName}.get\\`. Found ${rows.length}.`\n );\n }\n\n return new ThisModel(rows[0]);\n }\n\n /**\n * Gets the {@link Model} class or subclass constructor (the class that\n * instantiated this instance).\n *\n * @return {Model} The {@link Model} class or subclass constructor used to instantiate\n * this instance.\n */\n getClass() {\n return this.constructor;\n }\n\n /**\n * Gets the id value of the current instance by looking up the id attribute.\n * @return {*} The id value of the current instance.\n */\n getId() {\n return this._fields[this.getClass().idAttribute];\n }\n\n /**\n * Returns a reference to the plain JS object in the store.\n * It contains all the properties that you pass when creating the model,\n * except for primary keys of many-to-many relationships with a custom accessor.\n *\n * Make sure never to mutate this.\n *\n * @return {Object} a reference to the plain JS object in the store\n */\n get ref() {\n const ThisModel = this.getClass();\n\n // eslint-disable-next-line no-underscore-dangle\n return ThisModel._findDatabaseRows({\n [ThisModel.idAttribute]: this.getId(),\n })[0];\n }\n\n /**\n * Finds all rows in this model's table that match the given `lookupObj`.\n * If no `lookupObj` is passed, all rows in the model's table will be returned.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n * @private\n */\n static _findDatabaseRows(lookupObj) {\n const querySpec = {\n table: this.modelName,\n };\n if (lookupObj) {\n querySpec.clauses = [\n {\n type: FILTER,\n payload: lookupObj,\n },\n ];\n }\n return this.session.query(querySpec).rows;\n }\n\n /**\n * Returns a string representation of the {@link Model} instance.\n *\n * @return {string} A string representation of this {@link Model} instance.\n */\n toString() {\n const ThisModel = this.getClass();\n const className = ThisModel.modelName;\n const fieldNames = Object.keys(ThisModel.fields);\n const fields = fieldNames\n .map(fieldName => {\n const field = ThisModel.fields[fieldName];\n if (field instanceof ManyToMany) {\n const ids = this[fieldName]\n .toModelArray()\n .map(model => model.getId());\n return `${fieldName}: [${ids.join(\", \")}]`;\n }\n const val = this._fields[fieldName];\n return `${fieldName}: ${val}`;\n })\n .join(\", \");\n return `${className}: {${fields}}`;\n }\n\n /**\n * Returns a boolean indicating if `otherModel` equals this {@link Model} instance.\n * Equality is determined by shallow comparing their attributes.\n *\n * This equality is used when you call {@link Model#update}.\n * You can prevent model updates by returning `true` here.\n * However, a model will always be updated if its relationships are changed.\n *\n * @param {Model} otherModel - a {@link Model} instance to compare\n * @return {Boolean} a boolean indicating if the {@link Model} instance's are equal.\n */\n equals(otherModel) {\n // eslint-disable-next-line no-underscore-dangle\n return objectShallowEquals(this._fields, otherModel._fields);\n }\n\n /**\n * Updates a property name to given value for this {@link Model} instance.\n * The values are immediately committed to the database.\n *\n * @param {string} propertyName - name of the property to set\n * @param {*} value - value assigned to the property\n * @return {undefined}\n */\n set(propertyName, value) {\n this.update({\n [propertyName]: value,\n });\n }\n\n /**\n * Assigns multiple fields and corresponding values to this {@link Model} instance.\n * The updates are immediately committed to the database.\n *\n * @param {Object} userMergeObj - an object that will be merged with this instance.\n * @return {undefined}\n */\n update(userMergeObj) {\n const ThisModel = this.getClass();\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error(\n [\n `Tried to update a ${ThisModel.modelName} model instance without a session. `,\n \"You cannot call `.update` on an instance that you did not receive from the database.\",\n ].join(\"\")\n );\n }\n\n const mergeObj = { ...userMergeObj };\n\n const { fields, virtualFields } = ThisModel;\n\n const m2mRelations = {};\n\n // If an array of entities or id's is supplied for a\n // many-to-many related field, clear the old relations\n // and add the new ones.\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const mergeKey in mergeObj) {\n const isRealField = fields.hasOwnProperty(mergeKey);\n\n if (isRealField) {\n const field = fields[mergeKey];\n\n if (field instanceof ForeignKey || field instanceof OneToOne) {\n // update one-one/fk relations\n mergeObj[mergeKey] = normalizeEntity(mergeObj[mergeKey]);\n } else if (field instanceof ManyToMany) {\n // field is forward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete mergeObj[mergeKey];\n }\n }\n } else if (virtualFields.hasOwnProperty(mergeKey)) {\n const field = virtualFields[mergeKey];\n if (field instanceof ManyToMany) {\n // field is backward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n delete mergeObj[mergeKey];\n }\n }\n }\n\n const mergedFields = {\n ...this._fields,\n ...mergeObj,\n };\n\n const updatedModel = new ThisModel(mergedFields);\n // only update fields if they have changed (referentially)\n if (!this.equals(updatedModel)) {\n this._initFields(mergedFields);\n ThisModel.session.applyUpdate({\n action: UPDATE,\n query: getByIdQuery(this),\n payload: mergeObj,\n });\n }\n\n // update virtual fields\n this._refreshMany2Many(m2mRelations);\n }\n\n /**\n * Updates {@link Model} instance attributes to reflect the\n * database state in the current session.\n * @return {undefined}\n */\n refreshFromState() {\n this._initFields(this.ref);\n }\n\n /**\n * Deletes the record for this {@link Model} instance.\n * You'll still be able to access fields and values on the instance.\n *\n * @return {undefined}\n */\n delete() {\n const ThisModel = this.getClass();\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error(\n [\n `Tried to delete a ${ThisModel.modelName} model instance without a session. `,\n \"You cannot call `.delete` on an instance that you did not receive from the database.\",\n ].join(\"\")\n );\n }\n\n this._onDelete();\n ThisModel.session.applyUpdate({\n action: DELETE,\n query: getByIdQuery(this),\n });\n }\n\n /**\n * Update many-many relations for model.\n * @param relations\n * @return undefined\n * @private\n */\n _refreshMany2Many(relations) {\n const ThisModel = this.getClass();\n const { fields, virtualFields, modelName } = ThisModel;\n\n Object.keys(relations).forEach(name => {\n const reverse = !fields.hasOwnProperty(name);\n const field = virtualFields[name];\n const values = relations[name];\n\n if (!Array.isArray(values)) {\n throw new TypeError(\n `Failed to resolve many-to-many relationship: ${modelName}[${name}] must be an array (passed: ${values})`\n );\n }\n\n const normalizedNewIds = values.map(normalizeEntity);\n const uniqueIds = [...new Set(normalizedNewIds)];\n\n if (normalizedNewIds.length !== uniqueIds.length) {\n throw new Error(\n `Found duplicate id(s) when passing \"${normalizedNewIds}\" to ${ThisModel.modelName}.${name} value`\n );\n }\n\n const throughModelName =\n field.through || m2mName(ThisModel.modelName, name);\n const ThroughModel = ThisModel.session[throughModelName];\n\n let fromField;\n let toField;\n\n if (!reverse) {\n ({ from: fromField, to: toField } = field.throughFields);\n } else {\n ({ from: toField, to: fromField } = field.throughFields);\n }\n\n const currentIds = ThroughModel.filter(\n through => through[fromField] === this[ThisModel.idAttribute]\n )\n .toRefArray()\n .map(ref => ref[toField]);\n\n const diffActions = arrayDiffActions(currentIds, normalizedNewIds);\n\n if (diffActions) {\n const { delete: idsToDelete, add: idsToAdd } = diffActions;\n if (idsToDelete.length > 0) {\n this[field.as || name].remove(...idsToDelete);\n }\n\n if (idsToAdd.length > 0) {\n this[field.as || name].add(...idsToAdd);\n }\n }\n });\n }\n\n /**\n * @return {undefined}\n * @private\n */\n _onDelete() {\n const { virtualFields } = this.getClass();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in virtualFields) {\n const field = virtualFields[key];\n if (field instanceof ManyToMany) {\n // Delete any many-to-many rows the entity is included in.\n const descriptorKey = field.as || key;\n this[descriptorKey].clear();\n } else if (field instanceof ForeignKey) {\n const relatedQs = this[key];\n if (relatedQs.exists()) {\n relatedQs.update({ [field.relatedName]: null });\n }\n } else if (field instanceof OneToOne) {\n // Set null to any foreign keys or one to ones pointed to\n // this instance.\n if (this[key] !== null) {\n this[key][field.relatedName] = null;\n }\n }\n }\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n * @deprecated Please use {@link Model.idExists} instead.\n */\n static hasId(id) {\n console.warn(\n \"`Model.hasId` has been deprecated. Please use `Model.idExists` instead.\"\n );\n return this.idExists(id);\n }\n\n /**\n * @deprecated See the 0.9 migration guide on the GitHub repo.\n * @throws {Error} Due to deprecation.\n */\n getNextState() {\n throw new Error(\n \"`Model.prototype.getNextState` has been removed. See the 0.9 \" +\n \"migration guide on the GitHub repo.\"\n );\n }\n};\n\nModel.fields = {\n id: attr(),\n};\nModel.virtualFields = {};\nModel.querySetClass = QuerySet;\n\nexport default Model;\n","import ops from \"immutable-ops\";\nimport filter from \"lodash/filter\";\nimport orderBy from \"lodash/orderBy\";\nimport reject from \"lodash/reject\";\nimport sortBy from \"lodash/sortBy\";\n\nimport { EXCLUDE, FILTER, ORDER_BY } from \"../constants\";\nimport { clauseFiltersByAttribute, clauseReducesResultSetSize } from \"../utils\";\n\nconst DEFAULT_TABLE_OPTIONS = {\n idAttribute: \"id\",\n arrName: \"items\",\n mapName: \"itemsById\",\n fields: {},\n};\n\n/**\n * @private\n * @param {*} _currMax - the current max id\n * @param {*} userPassedId - the new id passed to the create action\n *\n * Both may be undefined. The current max id in the case that this is the first Model\n * being created, and the new id if the id was not explicitly passed to the\n * database.\n *\n * @return {Array} the new max id and the id to use to create the new row\n *\n * If the id's are strings, the id must be passed explicitly every time.\n * In this case, the current max id will remain `NaN` due to `Math.max`, but that's fine.\n */\nfunction idSequencer(_currMax, userPassedId) {\n let currMax = _currMax;\n let newMax;\n let newId;\n\n if (currMax === undefined) {\n currMax = -1;\n }\n\n if (userPassedId === undefined) {\n newMax = currMax + 1;\n newId = newMax;\n } else {\n newMax = Math.max(currMax + 1, userPassedId);\n newId = userPassedId;\n }\n\n return [\n newMax, // new max id\n newId, // id to use for row creation\n ];\n}\n\n/**\n * Adapt order directions array to @{lodash.orderBy} API.\n *\n * @private\n *\n * @param {Array<Boolean|'asc'|'desc'>} orders? - an array of optional order query directions as provided to {@Link {QuerySet.orderBy}}\n * @return {Array<'asc'|'desc'>|undefined} A normalized ordering array or undefined if none was provided.\n */\nfunction normalizeOrders(orders) {\n if (orders === undefined) {\n return undefined;\n }\n const convert = order => {\n if ([\"desc\", false].includes(order)) {\n return \"desc\";\n }\n return \"asc\";\n };\n return Array.isArray(orders) ? orders.map(convert) : convert(orders);\n}\n\n/**\n * Handles the underlying data structure for a {@link Model} class.\n * @private\n */\nexport class Table {\n /**\n * Creates a new {@link Table} instance.\n * @param {Object} userOpts - options to use.\n * @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.\n * @param {string} [userOpts.arrName=items] - the state attribute where an array of\n * entity id's are stored\n * @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects\n * are stored in a id to entity object\n * map.\n * @param {string} [userOpts.fields={}] - mapping of field key to {@link Field} object\n */\n constructor(userOpts) {\n Object.assign(this, DEFAULT_TABLE_OPTIONS, userOpts);\n }\n\n /**\n * Returns a reference to the object at index `id`\n * in state `branch`.\n *\n * @param {Object} branch - the state\n * @param {Number} id - the id of the object to get\n * @return {Object|undefined} A reference to the raw object in the state or\n * `undefined` if not found.\n */\n accessId(branch, id) {\n return branch[this.mapName][id];\n }\n\n accessIds(branch, ids) {\n const map = branch[this.mapName];\n return ids.map(id => map[id]);\n }\n\n idExists(branch, id) {\n return branch[this.mapName].hasOwnProperty(id);\n }\n\n accessIdList(branch) {\n return branch[this.arrName];\n }\n\n accessList(branch) {\n return this.accessIds(branch, this.accessIdList(branch));\n }\n\n getMaxId(branch) {\n return this.getMeta(branch, \"maxId\");\n }\n\n setMaxId(tx, branch, newMaxId) {\n return this.setMeta(tx, branch, \"maxId\", newMaxId);\n }\n\n nextId(id) {\n return id + 1;\n }\n\n /**\n * Returns the default state for the data structure.\n * @return {Object} The default state for this {@link ORM} instance's data structure\n */\n getEmptyState() {\n const pkIndex = {\n [this.arrName]: [],\n [this.mapName]: {},\n };\n const attrIndexes = Object.keys(this.fields)\n .filter(attr => attr !== this.idAttribute)\n .filter(attr => this.fields[attr].index)\n .reduce(\n (indexes, attr) => ({\n ...indexes,\n [attr]: {},\n }),\n {}\n );\n return {\n ...pkIndex,\n indexes: attrIndexes,\n meta: {},\n };\n }\n\n setMeta(tx, branch, key, value) {\n const { batchToken, withMutations } = tx;\n if (withMutations) {\n const res = ops.mutable.setIn([\"meta\", key], value, branch);\n return res;\n }\n\n return ops.batch.setIn(batchToken, [\"meta\", key], value, branch);\n }\n\n getMeta(branch, key) {\n return branch.meta[key];\n }\n\n query(branch, clauses) {\n if (clauses.length === 0) {\n return this.accessList(branch);\n }\n\n const { idAttribute } = this;\n\n const optimallyOrderedClauses = sortBy(clauses, clause => {\n if (clauseFiltersByAttribute(clause, idAttribute)) {\n return 1;\n }\n\n if (clauseReducesResultSetSize(clause)) {\n return 2;\n }\n\n return 3;\n });\n\n const reducer = (rows, clause) => {\n const { type, payload } = clause;\n if (!rows) {\n /**\n * First time this reducer is called during query.\n * This is where we apply query optimizations.\n */\n if (clauseFiltersByAttribute(clause, idAttribute)) {\n /**\n * Payload specified a primary key. Use PK index\n * to look up the single row identified by the PK.\n */\n const id = payload[idAttribute];\n const remainingPayload = Object.keys(payload).reduce(\n (withoutPkAttr, filterAttr) => {\n if (filterAttr !== idAttribute) {\n withoutPkAttr[filterAttr] = payload[filterAttr];\n }\n return withoutPkAttr;\n },\n {}\n );\n const ids = this.idExists(branch, id) ? [id] : [];\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-PK columns.\n * Filter accessed row by remaining payload (if one was found).\n */\n return reducer(this.accessIds(branch, ids), {\n ...clause,\n payload: remainingPayload,\n });\n }\n /**\n * No need to filter these rows any further.\n * The primary key value satisfies this clause's conditions.\n */\n return this.accessIds(branch, ids);\n }\n if (type === FILTER && typeof payload === \"object\") {\n const indexes = Object.entries(branch.indexes);\n const accessedIndexes = [];\n const indexAttrs = [];\n indexes.forEach(([attr, index]) => {\n if (clauseFiltersByAttribute(clause, attr)) {\n /**\n * Payload specified an indexed attribute. Use index\n * to potentially decrease amount of accessed rows.\n */\n if (index.hasOwnProperty(payload[attr])) {\n accessedIndexes.push(index[payload[attr]]);\n indexAttrs.push(attr);\n }\n }\n });\n /**\n * Calculate set of unique PK values corresponding to each\n * foreign key's attribute value. Then retrieve all those rows.\n */\n if (accessedIndexes.length) {\n const lastIndex = accessedIndexes.pop();\n const indexedIds = accessedIndexes.reduce(\n (result, index) => {\n const indexSet = new Set(index);\n return result.filter(\n Set.prototype.has,\n indexSet\n );\n },\n lastIndex\n );\n const remainingPayload = Object.keys(payload).reduce(\n (withoutIndexAttrs, filterAttr) => {\n if (!indexAttrs.includes(filterAttr)) {\n withoutIndexAttrs[filterAttr] =\n payload[filterAttr];\n }\n return withoutIndexAttrs;\n },\n {}\n );\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-indexed columns.\n * Filter indexed rows by remaining payload (if any were found).\n */\n return reducer(this.accessIds(branch, indexedIds), {\n ...clause,\n payload: remainingPayload,\n });\n }\n /**\n * No need to filter these rows any further.\n * The used indexes satisfy this clause's conditions.\n */\n return this.accessIds(branch, indexedIds);\n }\n }\n\n // Give up optimization: Retrieve all rows (full table scan).\n return reducer(this.accessList(branch), clause);\n }\n\n switch (type) {\n case FILTER: {\n return filter(rows, payload);\n }\n case EXCLUDE: {\n return reject(rows, payload);\n }\n case ORDER_BY: {\n const [iteratees, orders] = payload;\n return orderBy(rows, iteratees, normalizeOrders(orders));\n }\n default:\n return rows;\n }\n };\n\n return optimallyOrderedClauses.reduce(reducer, undefined);\n }\n\n /**\n * Returns the data structure including a new object `entry`\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object} entry - the object to insert\n * @return {Object} an object with two keys: `state` and `created`.\n * `state` is the new table state and `created` is the\n * row that was created.\n */\n insert(tx, branch, entry) {\n const { batchToken, withMutations } = tx;\n\n const hasId = entry.hasOwnProperty(this.idAttribute);\n\n let workingState = branch;\n\n // This will not affect string id's.\n const [newMaxId, id] = idSequencer(\n this.getMaxId(branch),\n entry[this.idAttribute]\n );\n workingState = this.setMaxId(tx, branch, newMaxId);\n\n const finalEntry = hasId\n ? entry\n : ops.batch.set(batchToken, this.idAttribute, id, entry);\n\n const indexesToAppendTo = Object.keys(workingState.indexes)\n .filter(\n fkAttr => entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null\n )\n .map(fkAttr => [fkAttr, entry[fkAttr]]);\n\n if (withMutations) {\n ops.mutable.push(id, workingState[this.arrName]);\n ops.mutable.set(id, finalEntry, workingState[this.mapName]);\n // add id to indexes\n indexesToAppendTo.forEach(([attr, value]) => {\n const attrIndex = workingState.indexes[attr];\n if (attrIndex.hasOwnProperty(value)) {\n ops.mutable.push(id, attrIndex[value]);\n } else {\n ops.mutable.set(value, [id], attrIndex);\n }\n });\n return {\n state: workingState,\n created: finalEntry,\n };\n }\n\n const nextIndexes = ops.batch.merge(\n batchToken,\n indexesToAppendTo.reduce(\n (indexMap, [attr, value]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.push(\n batchToken,\n id,\n indexMap[attr][value] || []\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...workingState.indexes }\n ),\n workingState.indexes\n );\n\n const nextState = ops.batch.merge(\n batchToken,\n {\n [this.arrName]: ops.batch.push(\n batchToken,\n id,\n workingState[this.arrName]\n ),\n [this.mapName]: ops.batch.merge(\n batchToken,\n {\n [id]: finalEntry,\n },\n workingState[this.mapName]\n ),\n indexes: nextIndexes,\n },\n workingState\n );\n\n return {\n state: nextState,\n created: finalEntry,\n };\n }\n\n /**\n * Returns the data structure with objects where `rows`\n * are merged with `mergeObj`.\n *\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @param {Object} mergeObj - The object to merge with each row.\n * @return {Object}\n */\n update(tx, branch, rows, mergeObj) {\n const { batchToken, withMutations } = tx;\n\n const mergeObjInto = row => {\n const merge = withMutations\n ? ops.mutable.merge\n : ops.batch.merge(batchToken);\n return merge(mergeObj, row);\n };\n\n const set = withMutations ? ops.mutable.set : ops.batch.set(batchToken);\n\n const indexedAttrs = Object.keys(branch.indexes).filter(attr =>\n mergeObj.hasOwnProperty(attr)\n );\n const indexIdsToAdd = [];\n const indexIdsToDelete = [];\n\n const nextMap = rows.reduce((map, row) => {\n const prevAttrValues = indexedAttrs.reduce(\n (valueMap, attr) => ({\n ...valueMap,\n [attr]: row[attr],\n }),\n {}\n );\n const result = mergeObjInto(row);\n const nextAttrValues = indexedAttrs.reduce(\n (valueMap, attr) => ({\n ...valueMap,\n [attr]: result[attr],\n }),\n {}\n );\n const id = result[this.idAttribute];\n const nextRow = set(id, result, map);\n indexedAttrs.forEach(attr => {\n const { [attr]: prevValue } = prevAttrValues;\n const { [attr]: nextValue } = nextAttrValues;\n if (prevValue === nextValue) {\n // attribute has not changed, no need to update any index\n return;\n }\n if (prevValue !== null && typeof prevValue !== \"undefined\") {\n // remove id from attribute's index for its old value\n indexIdsToDelete.push([attr, prevValue, id]);\n }\n if (nextValue !== null) {\n // add id to attribute's index for its new value\n indexIdsToAdd.push([attr, nextValue, id]);\n }\n });\n return nextRow;\n }, branch[this.mapName]);\n\n let nextIndexes = branch.indexes;\n if (withMutations) {\n indexIdsToDelete.forEach(([attr, value, id]) => {\n const arr = nextIndexes[attr][value];\n const idx = arr.indexOf(id);\n ops.mutable.splice(idx, 1, [], arr);\n });\n indexIdsToAdd.forEach(([attr, value, id]) => {\n ops.mutable.push(id, nextIndexes[attr][value]);\n });\n } else {\n if (indexIdsToAdd.length) {\n nextIndexes = ops.batch.merge(\n batchToken,\n indexIdsToAdd.reduce(\n (indexMap, [attr, value, id]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.push(\n batchToken,\n id,\n indexMap[attr][value] || []\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...nextIndexes }\n ),\n nextIndexes\n );\n }\n if (indexIdsToDelete.length) {\n nextIndexes = ops.batch.merge(\n batchToken,\n indexIdsToDelete.reduce(\n (indexMap, [attr, value, id]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.filter(\n batchToken,\n rowId => rowId !== id,\n indexMap[attr][value]\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...nextIndexes }\n ),\n nextIndexes\n );\n }\n }\n\n return ops.batch.merge(\n batchToken,\n {\n [this.mapName]: nextMap,\n indexes: nextIndexes,\n },\n branch\n );\n }\n\n /**\n * Returns the data structure without rows `rows`.\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @return {Object} the data structure without ids in `idsToDelete`.\n */\n delete(tx, branch, rows) {\n const { batchToken, withMutations } = tx;\n\n const { arrName, mapName } = this;\n const arr = branch[arrName];\n\n const idsToDelete = rows.map(row => row[this.idAttribute]);\n if (withMutations) {\n idsToDelete.forEach(id => {\n const idx = arr.indexOf(id);\n ops.mutable.splice(idx, 1, [], arr);\n ops.mutable.omit(id, branch[mapName]);\n });\n // delete ids from all indexes\n Object.values(branch.indexes).forEach(attrIndex =>\n Object.values(attrIndex).forEach(valueIndex =>\n idsToDelete.forEach(id => {\n const idx = valueIndex.indexOf(id);\n if (idx !== -1) {\n ops.mutable.splice(idx, 1, [], valueIndex);\n }\n })\n )\n );\n return branch;\n }\n\n const nextIndexes = ops.batch.merge(\n batchToken,\n Object.entries(branch.indexes).reduce(\n (indexMap, [attr, attrIndex]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n Object.entries(attrIndex).reduce(\n (attrIndexMap, [value, valueIndex]) => {\n attrIndexMap[value] = ops.batch.filter(\n batchToken,\n id => !idsToDelete.includes(id),\n valueIndex\n );\n return attrIndexMap;\n },\n { ...indexMap[attr] }\n ),\n indexMap[attr]\n );\n return indexMap;\n },\n { ...branch.indexes }\n ),\n branch.indexes\n );\n\n return ops.batch.merge(\n batchToken,\n {\n [arrName]: ops.batch.filter(\n batchToken,\n id => !idsToDelete.includes(id),\n branch[arrName]\n ),\n [mapName]: ops.batch.omit(\n batchToken,\n idsToDelete,\n branch[mapName]\n ),\n indexes: ops.batch.merge(\n batchToken,\n nextIndexes,\n branch.indexes\n ),\n },\n branch\n );\n }\n}\n\nexport default Table;\n","import ops from \"immutable-ops\";\n\nimport { CREATE, UPDATE, DELETE, SUCCESS, STATE_FLAG } from \"../constants\";\n\nimport Table from \"./Table\";\n\nconst BASE_EMPTY_STATE = {};\nObject.defineProperty(BASE_EMPTY_STATE, STATE_FLAG, {\n enumerable: true,\n value: true,\n});\n\n/** @private */\nfunction replaceTableState(tableName, newTableState, tx, state) {\n const { batchToken, withMutations } = tx;\n\n if (withMutations) {\n state[tableName] = newTableState;\n return state;\n }\n\n return ops.batch.set(batchToken, tableName, newTableState, state);\n}\n\n/** @private */\nfunction query(tables, querySpec, state) {\n const { table: tableName, clauses } = querySpec;\n const table = tables[tableName];\n const rows = table.query(state[tableName], clauses);\n return {\n rows,\n };\n}\n\n/** @private */\nfunction update(tables, updateSpec, tx, state) {\n const { action, payload } = updateSpec;\n\n let tableName;\n let nextTableState;\n let resultPayload;\n\n if (action === CREATE) {\n ({ table: tableName } = updateSpec);\n const table = tables[tableName];\n const currTableState = state[tableName];\n const result = table.insert(tx, currTableState, payload);\n nextTableState = result.state;\n resultPayload = result.created;\n } else {\n const { query: querySpec } = updateSpec;\n ({ table: tableName } = querySpec);\n const { rows } = query(tables, querySpec, state);\n\n const table = tables[tableName];\n const currTableState = state[tableName];\n\n if (action === UPDATE) {\n nextTableState = table.update(tx, currTableState, rows, payload);\n // return updated rows\n resultPayload = query(tables, querySpec, state).rows;\n } else if (action === DELETE) {\n nextTableState = table.delete(tx, currTableState, rows);\n // return original rows that we just deleted\n resultPayload = rows;\n } else {\n throw new Error(`Database received unknown update type: ${action}`);\n }\n }\n\n const nextDBState = replaceTableState(tableName, nextTableState, tx, state);\n return {\n status: SUCCESS,\n state: nextDBState,\n payload: resultPayload,\n };\n}\n\n/**\n * @memberof db\n * @param {Object} schemaSpec\n * @return Object database\n */\nexport function createDatabase(schemaSpec) {\n const { tables: tableSpecs } = schemaSpec;\n const tables = Object.entries(tableSpecs).reduce(\n (map, [tableName, tableSpec]) => ({\n ...map,\n [tableName]: new Table(tableSpec),\n }),\n {}\n );\n\n const getEmptyState = () =>\n Object.entries(tables).reduce(\n (map, [tableName, table]) => ({\n ...map,\n [tableName]: table.getEmptyState(),\n }),\n BASE_EMPTY_STATE\n );\n\n return {\n getEmptyState,\n query: query.bind(null, tables),\n update: update.bind(null, tables),\n // Used to inspect the schema.\n describe: tableName => tables[tableName],\n };\n}\n\nexport default createDatabase;\n","import { ID_ARG_KEY_SELECTOR } from \"../constants\";\n\nexport default class SelectorSpec {\n constructor({ parent, orm }) {\n this._parent = parent;\n this._orm = orm;\n this.keySelector = ID_ARG_KEY_SELECTOR;\n }\n\n get cachePath() {\n const basePath = this._parent ? this._parent.cachePath : [];\n return [...basePath, this.key];\n }\n\n get orm() {\n return this._orm;\n }\n\n get parent() {\n return this._parent;\n }\n}\n","import SelectorSpec from \"./SelectorSpec\";\n\nexport default class ModelBasedSelectorSpec extends SelectorSpec {\n constructor({ model, ...other }) {\n super(other);\n this._model = model;\n }\n\n get resultFunc() {\n return (session, idArg, ...other) => {\n const { [this._model.modelName]: ModelClass } = session;\n if (typeof idArg === \"undefined\") {\n return ModelClass.all()\n .toModelArray()\n .map(instance =>\n this.valueForInstance(instance, session, ...other)\n );\n }\n if (Array.isArray(idArg)) {\n return idArg.map(id =>\n this.valueForInstance(\n ModelClass.withId(id),\n session,\n ...other\n )\n );\n }\n return this.valueForInstance(\n ModelClass.withId(idArg),\n session,\n ...other\n );\n };\n }\n\n get model() {\n return this._model;\n }\n}\n","export default function idArgSelector(state, idArg) {\n return idArg;\n}\n","import ModelBasedSelectorSpec from \"./ModelBasedSelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nexport default class MapSelectorSpec extends ModelBasedSelectorSpec {\n constructor({ field, selector, ...other }) {\n super(other);\n this._field = field;\n this._selector = selector;\n }\n\n createResultFunc(parentSelector) {\n const { idAttribute } = this._parent.toModel;\n return (state, ...other) => {\n /**\n * The parent selector should return a ref array\n * in case of a single ID being passed.\n * Otherwise it should return an array of ref arrays.\n */\n const parentResult = parentSelector(state, ...other);\n const idArg = idArgSelector(state, ...other);\n const single = refArray => {\n if (refArray === null) {\n // an intermediate field could not be resolved\n return null;\n }\n return refArray.map(ref =>\n this._selector(state, ref[idAttribute])\n );\n };\n if (typeof idArg === \"undefined\" || Array.isArray(idArg)) {\n return parentResult.map(single);\n }\n return single(parentResult);\n };\n }\n\n get selector() {\n return this._selector;\n }\n\n set selector(selector) {\n this._selector = selector;\n }\n\n get key() {\n return this._selector;\n }\n}\n","import SelectorSpec from \"./SelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nexport default class ModelSelectorSpec extends SelectorSpec {\n constructor({ model, ...other }) {\n super(other);\n this._model = model;\n }\n\n get key() {\n return this._model.modelName;\n }\n\n get dependencies() {\n return [this._orm, idArgSelector];\n }\n\n get resultFunc() {\n return ({ [this._model.modelName]: ModelClass }, idArg) => {\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toRefArray();\n }\n if (Array.isArray(idArg)) {\n return idArg.map(id => {\n const instance = ModelClass.withId(id);\n return instance ? instance.ref : null;\n });\n }\n const instance = ModelClass.withId(idArg);\n return instance ? instance.ref : null;\n };\n }\n\n get model() {\n return this._model;\n }\n}\n","import MapSelectorSpec from \"./MapSelectorSpec\";\nimport ModelSelectorSpec from \"./ModelSelectorSpec\";\nimport ModelBasedSelectorSpec from \"./ModelBasedSelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nimport QuerySet from \"../QuerySet\";\nimport Model from \"../Model\";\n\nimport ForeignKey from \"../fields/ForeignKey\";\nimport ManyToMany from \"../fields/ManyToMany\";\n\nexport default class FieldSelectorSpec extends ModelBasedSelectorSpec {\n constructor({ field, fieldModel, accessorName, isVirtual, ...other }) {\n super(other);\n this._field = field;\n this._fieldModel = fieldModel;\n this._accessorName = accessorName;\n this._isVirtual = isVirtual;\n }\n\n get key() {\n return this._accessorName;\n }\n\n get dependencies() {\n return [this._orm, idArgSelector];\n }\n\n valueForInstance(instance, session) {\n if (!instance) {\n return null;\n }\n let value;\n if (this._parent instanceof ModelSelectorSpec) {\n /* orm.Model.field */\n value = instance[this._accessorName];\n } else {\n /* orm.Model.field1.field2..fieldN.field */\n const { [this._parent.toModelName]: ParentToModel } = session;\n const parentRef = this._parent.valueForInstance(instance, session);\n const parentInstance = parentRef\n ? new ParentToModel(parentRef)\n : null;\n value = parentInstance ? parentInstance[this._accessorName] : null;\n }\n if (value instanceof Model) {\n return value.ref;\n }\n if (value instanceof QuerySet) {\n return value.toRefArray();\n }\n return value;\n }\n\n map(selector) {\n if (selector instanceof ModelSelectorSpec) {\n if (this.toModelName === selector.model.modelName) {\n throw new Error(\n `Cannot select models in a \\`map()\\` call. If you just want the \\`${this._accessorName}\\` as a ref array then you can simply drop the \\`map()\\`. Otherwise make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n } else {\n throw new Error(\n `Cannot select \\`${selector.model.modelName}\\` models in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n }\n } else if (\n selector instanceof FieldSelectorSpec ||\n selector instanceof MapSelectorSpec\n ) {\n if (this.toModelName !== selector.model.modelName) {\n throw new Error(\n `Cannot select fields of the \\`${selector.model.modelName}\\` model in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n }\n } else if (\n !selector ||\n typeof selector !== \"function\" ||\n !selector.recomputations\n ) {\n throw new Error(\n `\\`map()\\` requires a selector as an input. Received: ${JSON.stringify(\n selector\n )} of type ${typeof selector}`\n );\n }\n if (\n !(this._field instanceof ForeignKey) &&\n !(this._field instanceof ManyToMany)\n ) {\n throw new Error(\"Cannot map selectors for non-collection fields\");\n }\n return new MapSelectorSpec({\n parent: this,\n model: this._model,\n orm: this._orm,\n field: this._field,\n selector,\n });\n }\n\n get toModelName() {\n return this._field.toModelName === \"this\"\n ? this._fieldModel.modelName\n : this._field.toModelName;\n }\n\n get toModel() {\n const db = this._orm.getDatabase();\n return db.describe(this.toModelName);\n }\n}\n","import ForeignKey from \"../fields/ForeignKey\";\nimport ManyToMany from \"../fields/ManyToMany\";\nimport RelationalField from \"../fields/RelationalField\";\n\nimport FieldSelectorSpec from \"./FieldSelectorSpec\";\nimport ModelSelectorSpec from \"./ModelSelectorSpec\";\n\n/**\n * @module selectors\n * @private\n */\n\nexport function createFieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual,\n}) {\n const fieldSelectorSpec = new FieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual,\n });\n /* Do not even try to create field selectors below attributes. */\n if (!(field instanceof RelationalField)) {\n // \"orm.Author.name.publisher\" would be nonsense\n return fieldSelectorSpec;\n }\n /* Prevent field selectors below collections. */\n if (parent instanceof FieldSelectorSpec) {\n /* eslint-disable no-underscore-dangle */\n if (\n // \"orm.Author.books.publisher\" would be nonsense\n (parent._field instanceof ForeignKey && parent._isVirtual) ||\n // \"orm.Genre.books.publisher\" would be nonsense\n parent._field instanceof ManyToMany\n ) {\n throw new Error(\n `Cannot create a selector for \\`${parent._accessorName}.${accessorName}\\` because \\`${parent._accessorName}\\` is a collection field.`\n );\n }\n }\n const { toModelName } = field;\n const toModel = orm.get(\n toModelName === \"this\" ? model.modelName : toModelName\n );\n Object.entries(toModel.fields).forEach(\n ([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false,\n }),\n });\n }\n );\n Object.entries(toModel.virtualFields).forEach(\n ([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n if (fieldSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true,\n }),\n });\n }\n );\n return fieldSelectorSpec;\n}\n\nexport function createModelSelectorSpec({ model, orm }) {\n const modelSelectorSpec = new ModelSelectorSpec({\n parent: null,\n orm,\n model,\n });\n\n Object.entries(model.fields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false,\n }),\n });\n });\n\n Object.entries(model.virtualFields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n if (modelSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true,\n }),\n });\n });\n\n return modelSelectorSpec;\n}\n","/* eslint-disable max-classes-per-file */\nimport Session from \"./Session\";\nimport Model from \"./Model\";\nimport { createDatabase as defaultCreateDatabase } from \"./db\";\nimport { attr } from \"./fields\";\nimport Field from \"./fields/Field\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\n\nimport { createModelSelectorSpec } from \"./selectors\";\n\nimport {\n m2mName,\n attachQuerySetMethods,\n m2mToFieldName,\n m2mFromFieldName,\n warnDeprecated,\n} from \"./utils\";\n\nconst ORM_DEFAULTS = {\n createDatabase: defaultCreateDatabase,\n};\n\nconst RESERVED_TABLE_OPTIONS = [\"indexes\", \"meta\"];\nconst isReservedTableOption = word => RESERVED_TABLE_OPTIONS.includes(word);\n\n/**\n * ORM - the Object Relational Mapper.\n *\n * Use instances of this class to:\n *\n * - Register your {@link Model} classes using {@link ORM#register}\n * - Get the empty state for the underlying database with {@link ORM#getEmptyState}\n * - Start an immutable database session with {@link ORM#session}\n * - Start a mutating database session with {@link ORM#mutableSession}\n *\n * Internally, this class handles generating a schema specification from models\n * to the database.\n */\nclass ORM {\n /**\n * Creates a new ORM instance.\n *\n * @param {Object} [opts]\n * @param {Function} [opts.stateSelector] - function that given a Redux state tree\n * will return the ORM state's subtree,\n * e.g. `state => state.orm`\n * (necessary if you want to use selectors)\n * @param {Function} [opts.createDatabase] - function that creates a database\n */\n constructor(opts) {\n const { createDatabase } = { ...ORM_DEFAULTS, ...(opts || {}) };\n this.createDatabase = createDatabase;\n this.registry = [];\n this.implicitThroughModels = [];\n this.installedFields = {};\n this.stateSelector = opts ? opts.stateSelector : null;\n }\n\n /**\n * Registers a {@link Model} class to the ORM.\n *\n * If the model has declared any ManyToMany fields, their\n * through models will be generated and registered with\n * this call, unless a custom through model has been specified.\n *\n * @param {...Model} models - a {@link Model} class to register\n * @return {undefined}\n */\n register(...models) {\n models.forEach(model => {\n if (model.modelName === undefined) {\n throw new Error(\n \"A model was passed that doesn't have a modelName set\"\n );\n }\n\n model.invalidateClassCache();\n\n this.registerManyToManyModelsFor(model);\n this.registry.push(model);\n\n Object.defineProperty(this, model.modelName, {\n get: () => {\n // make sure virtualFields are set up\n this._setupModelPrototypes(this.registry);\n\n return createModelSelectorSpec({\n model,\n orm: this,\n });\n },\n });\n });\n }\n\n registerManyToManyModelsFor(model) {\n const { fields } = model;\n const thisModelName = model.modelName;\n\n Object.entries(fields).forEach(([fieldName, fieldInstance]) => {\n if (!(fieldInstance instanceof ManyToMany)) {\n return;\n }\n\n let toModelName;\n if (fieldInstance.toModelName === \"this\") {\n toModelName = thisModelName;\n } else {\n toModelName = fieldInstance.toModelName; // eslint-disable-line prefer-destructuring\n }\n\n const selfReferencing = thisModelName === toModelName;\n const fromFieldName = m2mFromFieldName(thisModelName);\n const toFieldName = m2mToFieldName(toModelName);\n\n if (fieldInstance.through) {\n if (selfReferencing && !fieldInstance.throughFields) {\n throw new Error(\n \"Self-referencing many-to-many relationship at \" +\n `\"${thisModelName}.${fieldName}\" using custom ` +\n `model \"${fieldInstance.through}\" has no ` +\n \"throughFields key. Cannot determine which \" +\n \"fields reference the instances partaking \" +\n \"in the relationship.\"\n );\n }\n } else {\n const Through = class ThroughModel extends Model {};\n\n Through.modelName = m2mName(thisModelName, fieldName);\n\n const PlainForeignKey = class PlainForeignKey extends ForeignKey {\n get installsBackwardsVirtualField() {\n return false;\n }\n\n get installsBackwardsDescriptor() {\n return false;\n }\n };\n const ForeignKeyClass = selfReferencing\n ? PlainForeignKey\n : ForeignKey;\n Through.fields = {\n id: attr(),\n [fromFieldName]: new ForeignKeyClass(thisModelName),\n [toFieldName]: new ForeignKeyClass(toModelName),\n };\n\n Through.invalidateClassCache();\n this.implicitThroughModels.push(Through);\n }\n });\n }\n\n /**\n * Gets a {@link Model} class by its name from the registry.\n * @param {string} modelName - the name of the {@link Model} class to get\n * @throws If {@link Model} class is not found.\n * @return {Model} the {@link Model} class, if found\n */\n get(modelName) {\n const allModels = this.registry.concat(this.implicitThroughModels);\n const found = Object.values(allModels).find(\n model => model.modelName === modelName\n );\n\n if (typeof found === \"undefined\") {\n throw new Error(`Did not find model ${modelName} from registry.`);\n }\n return found;\n }\n\n getModelClasses() {\n this._setupModelPrototypes(this.registry);\n this._setupModelPrototypes(this.implicitThroughModels);\n return this.registry.concat(this.implicitThroughModels);\n }\n\n generateSchemaSpec() {\n const models = this.getModelClasses();\n const tables = models.reduce((spec, modelClass) => {\n const tableName = modelClass.modelName;\n const tableSpec = modelClass.tableOptions();\n Object.keys(tableSpec)\n .filter(isReservedTableOption)\n .forEach(key => {\n throw new Error(\n `Reserved keyword \\`${key}\\` used in ${tableName}.options.`\n );\n });\n spec[tableName] = {\n fields: { ...modelClass.fields },\n ...tableSpec,\n };\n return spec;\n }, {});\n return { tables };\n }\n\n getDatabase() {\n if (!this.db) {\n this.db = this.createDatabase(this.generateSchemaSpec());\n }\n return this.db;\n }\n\n /**\n * Returns the empty database state.\n * @return {Object} the empty state\n */\n getEmptyState() {\n return this.getDatabase().getEmptyState();\n }\n\n /**\n * Begins an immutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n session(state) {\n return new Session(this, this.getDatabase(), state);\n }\n\n /**\n * Begins a mutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n mutableSession(state) {\n return new Session(this, this.getDatabase(), state, true);\n }\n\n /**\n * @private\n */\n _setupModelPrototypes(models) {\n models\n .filter(model => !model.isSetUp)\n .forEach(model => {\n const { fields, modelName, querySetClass } = model;\n Object.entries(fields).forEach(([fieldName, field]) => {\n if (!(field instanceof Field)) {\n throw new Error(\n `${modelName}.${fieldName} is of type \"${typeof field}\" ` +\n \"but must be an instance of Field. Please use the \" +\n \"`attr`, `fk`, `oneToOne` and `many` \" +\n \"functions to define fields.\"\n );\n }\n if (!this._isFieldInstalled(modelName, fieldName)) {\n this._installField(field, fieldName, model);\n this._setFieldInstalled(modelName, fieldName);\n }\n });\n attachQuerySetMethods(model, querySetClass);\n model.isSetUp = true;\n });\n }\n\n /**\n * @private\n */\n _isFieldInstalled(modelName, fieldName) {\n return this.installedFields.hasOwnProperty(modelName)\n ? !!this.installedFields[modelName][fieldName]\n : false;\n }\n\n /**\n * @private\n */\n _setFieldInstalled(modelName, fieldName) {\n if (!this.installedFields.hasOwnProperty(modelName)) {\n this.installedFields[modelName] = {};\n }\n this.installedFields[modelName][fieldName] = true;\n }\n\n /**\n * Installs a field on a model and its related models if necessary.\n * @private\n */\n _installField(field, fieldName, model) {\n const FieldInstaller = field.installerClass;\n new FieldInstaller({\n field,\n fieldName,\n model,\n orm: this,\n }).run();\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Use {@link ORM#mutableSession} instead.\n */\n withMutations(state) {\n warnDeprecated(\n \"`ORM.prototype.withMutations` has been deprecated. \" +\n \"Use `ORM.prototype.mutableSession` instead.\"\n );\n return this.mutableSession(state);\n }\n\n /**\n * @deprecated Use {@link ORM#session} instead.\n */\n from(state) {\n warnDeprecated(\n \"`ORM.prototype.from` has been deprecated. \" +\n \"Use `ORM.prototype.session` instead.\"\n );\n return this.session(state);\n }\n\n /**\n * @deprecated Use {@link ORM#getEmptyState} instead.\n */\n getDefaultState() {\n warnDeprecated(\n \"`ORM.prototype.getDefaultState` has been deprecated. Use \" +\n \"`ORM.prototype.getEmptyState` instead.\"\n );\n return this.getEmptyState();\n }\n\n /**\n * @deprecated Define a Model class instead.\n */\n define() {\n throw new Error(\n \"`ORM.prototype.define` has been removed. Please define a Model class.\"\n );\n }\n}\n\nexport function DeprecatedSchema() {\n throw new Error(\n \"Schema has been renamed to ORM. Please import ORM instead of Schema \" +\n \"from Redux-ORM.\"\n );\n}\n\nexport { ORM };\n\nexport default ORM;\n","import { STATE_FLAG } from \"./constants\";\n\nconst defaultEqualityCheck = (a, b) => a === b;\nexport const eqCheck = defaultEqualityCheck;\n\nconst isOrmState = arg =>\n arg && typeof arg === \"object\" && arg.hasOwnProperty(STATE_FLAG);\n\nconst argsAreEqual = (lastArgs, nextArgs, equalityCheck) =>\n nextArgs.every(\n (arg, index) =>\n (isOrmState(arg) && isOrmState(lastArgs[index])) ||\n equalityCheck(arg, lastArgs[index])\n );\n\nconst rowsAreEqual = (ids, rowsA, rowsB) =>\n ids.every(id => rowsA[id] === rowsB[id]);\n\nconst accessedModelInstancesAreEqual = (previous, ormState, orm) => {\n const { accessedInstances } = previous;\n\n return Object.entries(accessedInstances).every(([modelName, instances]) => {\n // if the entire table has not been changed, we have nothing to do\n if (previous.ormState[modelName] === ormState[modelName]) {\n return true;\n }\n\n const { mapName } = orm.getDatabase().describe(modelName);\n\n const { [mapName]: previousRows } = previous.ormState[modelName];\n const { [mapName]: rows } = ormState[modelName];\n\n const accessedIds = Object.keys(instances);\n return rowsAreEqual(accessedIds, previousRows, rows);\n });\n};\n\nconst accessedIndexesAreEqual = (previous, ormState) => {\n const { accessedIndexes } = previous;\n\n return Object.entries(accessedIndexes).every(([modelName, indexes]) =>\n Object.entries(indexes).every(([column, values]) =>\n values.every(\n value =>\n previous.ormState[modelName].indexes[column][value] ===\n ormState[modelName].indexes[column][value]\n )\n )\n );\n};\n\nconst fullTableScannedModelsAreEqual = (previous, ormState) =>\n previous.fullTableScannedModels.every(\n modelName => previous.ormState[modelName] === ormState[modelName]\n );\n\n/**\n * A memoizer to use with redux-orm\n * selectors. When the memoized function is first run,\n * the memoizer will remember the models that are accessed\n * during that function run.\n *\n * On subsequent runs, the memoizer will check if those\n * models' states have changed compared to the previous run.\n *\n * Memoization algorithm operates like this:\n *\n * 1. Has the selector been run before? If not, go to 6.\n *\n * 2. If the selector has other input selectors in addition to the\n * ORM state selector, check their results for equality with the previous results.\n * If they aren't equal, go to 6.\n *\n * 3. Some filter queries may have required scanning entire tables during the last run.\n * If any of those tables have changed, go to 6.\n *\n * 4. Check which foreign key indexes the database has used to speed up queries\n * during the last run. If any have changed, go to 6.\n *\n * 5. Check which Model's instances the selector has accessed during the last run.\n * Check for equality with each of those states versus their states in the\n * previous ORM state. If all of them are equal, return the previous result.\n *\n * 6. Run the selector. Check the Session object used by the selector for\n * which Model's states were accessed, and merge them with the previously\n * saved information about accessed models (if-else branching can change\n * which models are accessed on different inputs). Save the ORM state and\n * other arguments the selector was called with, overriding previously\n * saved values. Save the selector result. Return the selector result.\n *\n * @private\n * @param {Function} func - function to memoize\n * @param {Function} argEqualityCheck - equality check function to use with normal\n * selector args\n * @param {ORM} orm - a redux-orm ORM instance\n * @return {Function} `func` memoized.\n */\nexport function memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {\n let previous = {\n /* Result of the previous function call */\n result: null,\n /* Arguments to the previous function call (excluding ORM state) */\n args: null,\n /**\n * Snapshot of the previous database.\n *\n * Lets us know how the tables looked like\n * during the previous function call.\n */\n ormState: null,\n /**\n * Names of models whose tables have been scanned completely\n * during previous function call (contains only model names)\n * Format example: ['Book']\n */\n fullTableScannedModels: [],\n /**\n * Map of which model instances have been accessed\n * during previous function call.\n * Contains only PKs of accessed instances.\n * Format example: { Book: { 1: true, 3: true } }\n */\n accessedInstances: {},\n /**\n * Map of which attribute indexes have been accessed\n * during previous function call.\n * Contains only attributes that were actually filtered on.\n * Author.withId(3).books would add 3 to the authorId index below.\n * Format example: { Book: { authorId: [1, 2], publisherId: [5] } }\n */\n accessedIndexes: {},\n };\n\n return (...stateAndArgs) => {\n /**\n * The first argument to this function needs to be\n * the ORM's reducer state in the user's Redux store.\n */\n const [ormState, ...args] = stateAndArgs;\n\n const selectorWasCalledBefore = Boolean(previous.args);\n if (\n selectorWasCalledBefore &&\n argsAreEqual(previous.args, args, argEqualityCheck) &&\n fullTableScannedModelsAreEqual(previous, ormState) &&\n accessedIndexesAreEqual(previous, ormState) &&\n accessedModelInstancesAreEqual(previous, ormState, orm)\n ) {\n /**\n * None of this selector's dependencies have changed\n * since the last time that we called it.\n */\n return previous.result;\n }\n\n /**\n * Start a session so that the selector can access the database.\n * Make this session immutable. This way we can find out if\n * the operations that the selector performs are cacheable.\n */\n const session = orm.session(ormState);\n /* Replace all ORM state arguments by the session above */\n const argsWithSession = args.map(arg =>\n isOrmState(arg) ? session : arg\n );\n\n /* This is where we call the actual function */\n const result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread\n\n /**\n * The metadata for the previous call are no longer valid.\n * Update cached values.\n */\n previous = {\n /* Arguments that were passed to the selector */\n args,\n /* Selector result */\n result,\n /* Redux state slice for session.state */\n ormState,\n /* Rows retrieved by resolved primary key */\n accessedInstances: session.accessedModelInstances,\n /* Foreign key indexes that were used to speed up queries */\n accessedIndexes: session.accessedIndexes,\n /* Tables that had to be scanned completely */\n fullTableScannedModels: session.fullTableScannedModels,\n };\n\n return result;\n };\n}\n","import { createSelectorCreator } from \"reselect\";\nimport createCachedSelector, { FlatMapCache } from \"re-reselect\";\n\nimport { memoize } from \"./memoize\";\n\nimport { ORM } from \"./ORM\";\nimport SelectorSpec from \"./selectors/SelectorSpec\";\nimport MapSelectorSpec from \"./selectors/MapSelectorSpec\";\n\n/**\n * @module redux\n * @desc Provides functions for integration with Redux.\n */\n\n/**\n * Calls all models' reducers if they exist.\n *\n * @return {undefined}\n * @global\n */\nexport function defaultUpdater(session, action) {\n session.sessionBoundModels.forEach(modelClass => {\n if (typeof modelClass.reducer === \"function\") {\n // This calls this.applyUpdate to update this.state\n modelClass.reducer(action, modelClass, session);\n }\n });\n}\n\n/**\n * Call the returned function to pass actions to Redux-ORM.\n *\n * @global\n *\n * @param {ORM} orm - the ORM instance.\n * @param {Function} [updater] - the function updating the ORM state based on the given action.\n * @return {Function} reducer that will update the ORM state.\n */\nexport function createReducer(orm, updater = defaultUpdater) {\n return (state, action) => {\n const session = orm.session(state || orm.getEmptyState());\n updater(session, action);\n return session.state;\n };\n}\n\n/**\n * @private\n * @param {SelectorSpec} spec\n */\nfunction createSelectorFromSpec(spec) {\n if (spec instanceof MapSelectorSpec) {\n const parentSelector = createSelectorFromSpec(spec.parent);\n return spec.createResultFunc(parentSelector);\n }\n return createCachedSelector(\n spec.dependencies,\n spec.resultFunc\n )({\n keySelector: spec.keySelector,\n cacheObject: new FlatMapCache(),\n selectorCreator: createSelector, // eslint-disable-line no-use-before-define\n });\n}\n\n/**\n * Tries to find ORM instance using the argument.\n * @private\n * @param {*} arg\n */\nfunction toORM(arg) {\n /* eslint-disable no-underscore-dangle */\n if (arg instanceof ORM) {\n return arg;\n }\n if (arg instanceof SelectorSpec) {\n return arg._orm;\n }\n return false;\n}\n\nconst selectorCache = new Map();\nconst SELECTOR_KEY = Symbol.for(\"REDUX_ORM_SELECTOR\");\n\n/**\n * @private\n * @param {function|ORM|SelectorSpec} arg\n */\nfunction toSelector(arg) {\n if (typeof arg === \"function\") {\n return arg;\n }\n if (arg instanceof ORM) {\n return arg.stateSelector;\n }\n if (arg instanceof MapSelectorSpec) {\n // the argument to map() needs to be callable\n arg.selector = toSelector(arg.selector);\n }\n if (arg instanceof SelectorSpec) {\n const { orm, cachePath } = arg;\n let level;\n\n // the selector cache for the spec's ORM\n if (!selectorCache.has(orm)) {\n selectorCache.set(orm, new Map());\n }\n const ormSelectors = selectorCache.get(orm);\n\n /**\n * Drill down into selector map by cachePath.\n *\n * The selector itself is stored under a special SELECTOR_KEY\n * so that we can store selectors below it as well.\n */\n level = ormSelectors;\n for (let i = 0; i < cachePath.length; ++i) {\n const storageKey = cachePath[i];\n if (!level.has(storageKey)) {\n level.set(storageKey, new Map());\n }\n level = level.get(storageKey);\n }\n if (level && level.has(SELECTOR_KEY)) {\n // Cache hit: the selector has been created before\n return level.get(SELECTOR_KEY);\n }\n // Cache miss: the selector needs to be created\n const selector = createSelectorFromSpec(arg);\n // Save the selector at the cachePath position\n level.set(SELECTOR_KEY, selector);\n\n return selector;\n }\n throw new Error(\n `Failed to interpret selector argument: ${JSON.stringify(\n arg\n )} of type ${typeof arg}`\n );\n}\n\n/**\n * Returns a memoized selector based on passed arguments.\n * This is similar to `reselect`'s `createSelector`,\n * except you can also pass a single function to be memoized.\n *\n * If you pass multiple functions, the format will be the\n * same as in `reselect`. The last argument is the selector\n * function and the previous are input selectors.\n *\n * When you use this method to create a selector, the returned selector\n * expects the whole `redux-orm` state branch as input. In the selector\n * function that you pass as the last argument, any of the arguments\n * you pass first will be considered selectors and mapped\n * to their outputs, like in `reselect`.\n *\n * Here are some example selectors:\n *\n * ```javascript\n * // orm is an instance of ORM\n * // reduxState is the state of a Redux store\n * const books = createSelector(orm.Book);\n * books(reduxState) // array of book refs\n *\n * const bookAuthors = createSelector(orm.Book.authors);\n * bookAuthors(reduxState) // two-dimensional array of author refs for each book\n * ```\n * Selectors can easily be applied to related models:\n * ```javascript\n * const bookAuthorNames = createSelector(\n * orm.Book.authors.map(orm.Author.name),\n * );\n * bookAuthorNames(reduxState, 8) // names of all authors of book with ID 8\n * bookAuthorNames(reduxState, [8, 9]) // 2D array of names of all authors of books with IDs 8 and 9\n * ```\n * Also note that `orm.Author.name` did not need to be wrapped in another `createSelector` call,\n * although that would be possible.\n *\n * For more complex calculations you can access\n * entire session objects by passing an ORM instance.\n * ```javascript\n * const freshBananasCost = createSelector(\n * orm,\n * session => {\n * const banana = session.Product.get({\n * name: \"Banana\",\n * });\n * // amount of fresh bananas in shopping cart\n * const amount = session.ShoppingCart.filter({\n * product_id: banana.id,\n * is_fresh: true,\n * }).count();\n * return `USD ${amount * banana.price}`;\n * }\n * );\n * ```\n *\n * redux-orm uses a special memoization function to avoid recomputations.\n *\n * Everytime a selector runs, this function records which instances\n * of your `Model`s were accessed.<br>\n * On subsequent runs, the selector first checks if the previously\n * accessed instances or `args` have changed in any way:\n * <ul>\n * <li>If yes, the selector calls the function you passed to it.</li>\n * <li>If not, it just returns the previous result\n * (unless you call it for the first time).</li>\n * </ul>\n *\n * This way you can use pure rendering in your React components\n * for performance gains.\n *\n * @global\n *\n * @param {...Function} args - zero or more input selectors\n * and the selector function.\n * @return {Function} memoized selector\n */\nexport function createSelector(...args) {\n if (!args.length) {\n throw new Error(\"Cannot create a selector without arguments.\");\n }\n\n const resultArg = args.pop();\n const dependencies = Array.isArray(args[0]) ? args[0] : args;\n\n const orm = dependencies.map(toORM).find(Boolean);\n const inputFuncs = dependencies.map(toSelector);\n\n if (typeof resultArg === \"function\") {\n if (!orm) {\n throw new Error(\n \"Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.\"\n );\n } else if (!orm.stateSelector) {\n throw new Error(\n \"Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.\"\n );\n } else if (typeof orm.stateSelector !== \"function\") {\n throw new Error(\n `Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \\`stateSelector\\`. Received: ${JSON.stringify(\n orm.stateSelector\n )} of type ${typeof orm.stateSelector}`\n );\n }\n\n return createSelectorCreator(\n memoize,\n undefined,\n orm\n )([orm.stateSelector, ...inputFuncs], resultArg);\n }\n\n if (resultArg instanceof ORM) {\n throw new Error(\n \"ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.\"\n );\n }\n if (inputFuncs.length) {\n console.warn(\n \"Your input selectors will be ignored: the passed result function does not require any input.\"\n );\n }\n\n return toSelector(resultArg);\n}\n","import QuerySet from \"./QuerySet\";\nimport Model from \"./Model\";\nimport { DeprecatedSchema, ORM } from \"./ORM\";\nimport Session from \"./Session\";\nimport { createReducer, createSelector } from \"./redux\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\nimport OneToOne from \"./fields/OneToOne\";\nimport Attribute from \"./fields/Attribute\";\nimport { fk, many, oneToOne, attr } from \"./fields\";\n\nconst Schema = DeprecatedSchema;\n\nconst Backend = function RemovedBackend() {\n throw new Error(\n \"Having a custom Backend instance is now unsupported. \" +\n \"Documentation for database customization is upcoming, for now \" +\n \"please look at the db folder in the source.\"\n );\n};\n\nexport {\n Attribute,\n QuerySet,\n Model,\n ORM,\n Schema,\n Backend,\n Session,\n ForeignKey,\n ManyToMany,\n OneToOne,\n fk,\n many,\n attr,\n oneToOne,\n createReducer,\n createSelector,\n};\n\nexport default Model;\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://ReduxOrm/webpack/universalModuleDefinition","webpack://ReduxOrm/webpack/bootstrap","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/createClass.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/typeof.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack://ReduxOrm/./node_modules/lodash/isArray.js","webpack://ReduxOrm/./node_modules/reselect/lib/index.js","webpack://ReduxOrm/./node_modules/re-reselect/dist/index.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://ReduxOrm/./node_modules/lodash/_baseOrderBy.js","webpack://ReduxOrm/./node_modules/lodash/_baseIteratee.js","webpack://ReduxOrm/./node_modules/lodash/identity.js","webpack://ReduxOrm/./node_modules/lodash/filter.js","webpack://ReduxOrm/./node_modules/lodash/orderBy.js","webpack://ReduxOrm/./node_modules/lodash/reject.js","webpack://ReduxOrm/./node_modules/lodash/sortBy.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/iterableToArray.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://ReduxOrm/./node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack://ReduxOrm/./node_modules/lodash/_arrayMap.js","webpack://ReduxOrm/./node_modules/lodash/_baseGet.js","webpack://ReduxOrm/./node_modules/lodash/_baseMap.js","webpack://ReduxOrm/./node_modules/lodash/_baseSortBy.js","webpack://ReduxOrm/./node_modules/lodash/_baseUnary.js","webpack://ReduxOrm/./node_modules/lodash/_compareMultiple.js","webpack://ReduxOrm/./node_modules/lodash/_compareAscending.js","webpack://ReduxOrm/./node_modules/lodash/isSymbol.js","webpack://ReduxOrm/./node_modules/lodash/_arrayFilter.js","webpack://ReduxOrm/./node_modules/lodash/_baseFilter.js","webpack://ReduxOrm/./node_modules/lodash/negate.js","webpack://ReduxOrm/./node_modules/lodash/_baseFlatten.js","webpack://ReduxOrm/./node_modules/lodash/_baseRest.js","webpack://ReduxOrm/./node_modules/lodash/_overRest.js","webpack://ReduxOrm/./node_modules/lodash/_apply.js","webpack://ReduxOrm/./node_modules/lodash/_setToString.js","webpack://ReduxOrm/./node_modules/lodash/_isIterateeCall.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_isPlaceholder.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curry1.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_arity.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curry2.js","webpack://ReduxOrm/./node_modules/ramda/es/curryN.js","webpack://ReduxOrm/./node_modules/ramda/es/internal/_curryN.js","webpack://ReduxOrm/./node_modules/ramda/es/curry.js","webpack://ReduxOrm/./node_modules/ramda/es/__.js","webpack://ReduxOrm/./node_modules/immutable-ops/es/index.js","webpack://ReduxOrm/./src/constants.js","webpack://ReduxOrm/./src/utils.js","webpack://ReduxOrm/./src/QuerySet.js","webpack://ReduxOrm/./src/Session.js","webpack://ReduxOrm/./src/fields/DefaultFieldInstaller.js","webpack://ReduxOrm/./src/fields/FieldInstallerTemplate.js","webpack://ReduxOrm/./src/fields/Field.js","webpack://ReduxOrm/./src/descriptors.js","webpack://ReduxOrm/./src/fields/Attribute.js","webpack://ReduxOrm/./src/fields/RelationalField.js","webpack://ReduxOrm/./src/fields/ForeignKey.js","webpack://ReduxOrm/./src/fields/ManyToMany.js","webpack://ReduxOrm/./src/fields/OneToOne.js","webpack://ReduxOrm/./src/fields/index.js","webpack://ReduxOrm/./src/Model.js","webpack://ReduxOrm/./src/db/Table.js","webpack://ReduxOrm/./src/db/Database.js","webpack://ReduxOrm/./src/selectors/SelectorSpec.js","webpack://ReduxOrm/./src/selectors/ModelBasedSelectorSpec.js","webpack://ReduxOrm/./src/selectors/idArgSelector.js","webpack://ReduxOrm/./src/selectors/MapSelectorSpec.js","webpack://ReduxOrm/./src/selectors/ModelSelectorSpec.js","webpack://ReduxOrm/./src/selectors/FieldSelectorSpec.js","webpack://ReduxOrm/./src/selectors/index.js","webpack://ReduxOrm/./src/ORM.js","webpack://ReduxOrm/./src/memoize.js","webpack://ReduxOrm/./src/redux.js","webpack://ReduxOrm/./src/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_defineProperties","target","props","length","descriptor","configurable","writable","Constructor","protoProps","staticProps","setPrototypeOf","subClass","superClass","constructor","_typeof","obj","iterator","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","arr","isArray","Array","defaultEqualityCheck","a","b","areArgumentsShallowlyEqual","equalityCheck","prev","next","defaultMemoize","func","arguments","undefined","lastArgs","lastResult","apply","getDependencies","funcs","dependencies","every","dep","dependencyTypes","map","join","Error","createSelectorCreator","memoize","_len","memoizeOptions","_key","_len2","_key2","recomputations","resultFunc","pop","memoizedResultFunc","concat","selector","params","push","resetRecomputations","createStructuredSelector","selectors","selectorCreator","createSelector","objectKeys","keys","_len3","values","_key3","reduce","composition","index","reselect","isStringOrNumber","FlatObjectCache","this","_cache","_proto","set","selectorFn","remove","clear","isValidCacheKey","cacheKey","defaultCacheCreator","defaultCacheKeyValidator","createCachedSelector","polymorphicOptions","legacyOptions","options","keySelector","assign","cache","cacheObject","keySelectorCreator","inputSelectors","cacheResponse","console","warn","getMatchingSelector","removeMatchingSelector","clearCache","validateCacheSize","cacheSize","Number","isInteger","FifoObjectCache","_temp","_cacheOrdering","_cacheSize","earliest","indexOf","splice","LruObjectCache","_registerCacheHit","_deleteCacheHit","FlatMapCache","Map","FifoMapCache","size","LruMapCache","has","createStructuredCachedSelector","default","len","arr2","arrayMap","baseGet","baseIteratee","baseMap","baseSortBy","baseUnary","compareMultiple","identity","collection","iteratees","orders","iteratee","result","other","array","predicate","resIndex","baseOrderBy","guard","arrayFilter","baseFilter","negate","baseFlatten","baseRest","isIterateeCall","sortBy","_setPrototypeOf","__proto__","arrayLikeToArray","iter","from","minLen","toString","slice","test","TypeError","comparer","sort","compareAscending","objCriteria","criteria","othCriteria","ordersLength","isSymbol","valIsDefined","valIsNull","valIsReflexive","valIsSymbol","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","args","overRest","setToString","start","nativeMax","Math","max","transform","otherArgs","thisArg","_isPlaceholder","_curry1","fn","f1","_arity","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","_curry2","f2","_b","_a","_curryN","received","combined","argsIdx","left","combinedIdx","forOwn","canMutate","ownerID","getBatchToken","prepareNewObject","instance","addOwnerID","forceArray","arg","normalizePath","pathArg","split","mutableSet","mutableMerge","isDeep","_mergeObjs","baseObj","mergeObjs","forEach","mergeObj","assignValue","mutableShallowMerge","mutableDeepMerge","mutableOmit","_keys","shouldMergeKey","immutableMerge","hasChanges","nextObject","willChange","mergeValue","currentValue","recursiveMergeResult","immutableDeepMerge","immutableArrSet","newArr","copied","fastArrayCopy","mutableArrFilter","currIndex","originalIndex","mutableArrSplice","deleteCount","_vals","vals","mutableArrInsert","immutableArrSplice","immutableArrInsert","immutableOperations","merge","deepMerge","omit","keysInObj","filter","newObj","setIn","_pathArg","acc","currRef","valueInPath","pathLen","rootObj","curr","idx","currType","_newObj","pathRepr","insert","isArrayLike","mutableOperations","originalPathArg","done","immutableOps","mutableOps","batchOps","mutable","batch","batched","_token","_fn","token","immutableOpsBoundToToken","__","getImmutableOps","UPDATE","DELETE","FILTER","EXCLUDE","ALL_INSTANCES","ID_ARG_KEY_SELECTOR","_state","idArg","warnDeprecated","msg","log","m2mName","declarationModelName","fieldName","string","charAt","toUpperCase","m2mFromFieldName","m2mToFieldName","otherModelName","querySetDelegatorFactory","methodName","getQuerySet","querySetGetterDelegatorFactory","getterName","attachQuerySetMethods","modelClass","querySetClass","leftToDefine","sharedMethods","currClass","Function","getPrototypeOf","forEachSuperClass","cls","defined","getOwnPropertyDescriptor","normalizeEntity","entity","getId","ops","clauseFiltersByAttribute","type","payload","attribute","attributeValue","mapValues","entries","newObject","normalizeModelReference","modelNameOrClass","modelName","QuerySet","clauses","opts","_opts","addSharedMethod","_new","userOpts","_evaluate","rows","id","withId","toRefArray","toModelArray","ModelClass","count","exists","Boolean","at","first","last","all","lookupObj","normalizedLookupObj","filterDescriptor","exclude","excludeDescriptor","session","_evaluated","table","querySpec","query","orderBy","orderByDescriptor","update","applyUpdate","action","delete","model","_onDelete","Session","schema","db","state","withMutations","batchToken","getEmptyState","initialState","modelData","models","getModelClasses","sessionBoundModels","SessionBoundModel","Reflect","construct","connect","getDataForModel","getModelData","markAccessed","modelIds","data","accessedInstances","markFullTableScanned","fullTableScanned","markAccessedIndexes","indexes","attr","accessedIndexes","updateSpec","tx","_getTransaction","status","_markAccessedByQuery","includes","idAttribute","accessedIds","Set","row","anyClauseFilteredByPk","some","clause","add","getNextState","DefaultFieldInstaller","installForwardsDescriptor","field","createForwardsDescriptor","toModel","throughModel","installForwardsVirtualField","virtualFields","createForwardsVirtualField","installBackwardsDescriptor","backwardsFieldName","toModelName","createBackwardsDescriptor","installBackwardsVirtualField","createBackwardsVirtualField","orm","references","run","installsForwardsVirtualField","installsBackwardsDescriptor","installsBackwardsVirtualField","_toModel","_throughModel","throughModelName","getThroughModelName","getBackwardsFieldName","Field","getClass","forwardsManyToOneDescriptor","declaredToModelName","DeclaredToModel","toId","_fields","manyToManyDescriptor","declaredFromModelName","throughFields","reverse","DeclaredFromModel","ThroughModel","ThisModel","OtherModel","thisReferencingField","to","otherReferencingField","thisId","throughQs","referencedOtherIds","qs","otherModelInstance","entities","idsToAdd","existingQs","through","existingIds","idsToRemove","entitiesToDelete","entitiesToDeleteIds","unexistingIds","Attribute","getDefault","attrDescriptor","RelationalField","relatedName","as","toLowerCase","ForeignKey","declaredFieldName","ManyToMany","getThroughFields","fieldAName","fieldBName","fieldA","fields","throughModelFieldReferencing","otherModel","find","someFieldName","OneToOne","forwardsOneToOneDescriptor","fk","many","oneToOne","getByIdQuery","modelInstance","Model","_initFields","propsObj","ids","_session","QuerySetClass","invalidateClassCache","isSetUp","tableOptions","backend","userProps","m2mRelations","declaredFieldNames","declaredVirtualFieldNames","valuePassed","_refreshMany2Many","upsert","idExists","_findDatabaseRows","equals","entriesInA","objectShallowEquals","propertyName","userMergeObj","mergeKey","mergedFields","updatedModel","refreshFromState","ref","relations","normalizedNewIds","uniqueIds","fromField","toField","diffActions","sourceArr","targetArr","itemsInBoth","item","deleteItems","addItems","arrayDiffActions","idsToDelete","relatedQs","hasId","describe","DEFAULT_TABLE_OPTIONS","arrName","mapName","Table","accessId","branch","accessIds","accessIdList","accessList","getMaxId","getMeta","setMaxId","newMaxId","setMeta","nextId","meta","optimallyOrderedClauses","clauseReducesResultSetSize","reducer","remainingPayload","withoutPkAttr","filterAttr","indexAttrs","lastIndex","indexedIds","indexSet","withoutIndexAttrs","reject","convert","order","normalizeOrders","entry","workingState","_currMax","userPassedId","newMax","newId","currMax","idSequencer","finalEntry","indexesToAppendTo","fkAttr","attrIndex","created","nextIndexes","indexMap","indexedAttrs","indexIdsToAdd","indexIdsToDelete","nextMap","prevAttrValues","valueMap","mergeObjInto","nextAttrValues","nextRow","prevValue","nextValue","rowId","valueIndex","attrIndexMap","BASE_EMPTY_STATE","tables","tableName","nextTableState","resultPayload","currTableState","newTableState","replaceTableState","createDatabase","schemaSpec","tableSpecs","tableSpec","SelectorSpec","parent","_parent","_orm","cachePath","ModelBasedSelectorSpec","_model","valueForInstance","idArgSelector","MapSelectorSpec","_field","_selector","createResultFunc","parentSelector","parentResult","single","refArray","ModelSelectorSpec","FieldSelectorSpec","fieldModel","accessorName","isVirtual","_fieldModel","_accessorName","_isVirtual","ParentToModel","parentRef","parentInstance","JSON","stringify","getDatabase","createFieldSelectorSpec","fieldSelectorSpec","relatedFieldName","relatedField","fieldAccessorName","ORM_DEFAULTS","defaultCreateDatabase","RESERVED_TABLE_OPTIONS","isReservedTableOption","word","ORM","registry","implicitThroughModels","installedFields","stateSelector","register","registerManyToManyModelsFor","_setupModelPrototypes","modelSelectorSpec","createModelSelectorSpec","thisModelName","fieldInstance","selfReferencing","fromFieldName","toFieldName","Through","PlainForeignKey","ForeignKeyClass","allModels","found","generateSchemaSpec","spec","mutableSession","_isFieldInstalled","_installField","_setFieldInstalled","FieldInstaller","installerClass","getDefaultState","isOrmState","argEqualityCheck","previous","ormState","fullTableScannedModels","stateAndArgs","fullTableScannedModelsAreEqual","column","accessedIndexesAreEqual","instances","previousRows","rowsA","rowsB","accessedModelInstancesAreEqual","argsWithSession","accessedModelInstances","defaultUpdater","createReducer","updater","toORM","selectorCache","SELECTOR_KEY","for","toSelector","level","storageKey","createSelectorFromSpec","resultArg","inputFuncs","Schema","Backend"],"mappings":"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","file":"redux-orm.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"ReduxOrm\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReduxOrm\"] = factory();\n\telse\n\t\troot[\"ReduxOrm\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 37);\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inheritsLoose;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayWithoutHoles = require(\"./arrayWithoutHoles.js\");\n\nvar iterableToArray = require(\"./iterableToArray.js\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread.js\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","'use strict';\n\nexports.__esModule = true;\nexports.defaultMemoize = defaultMemoize;\nexports.createSelectorCreator = createSelectorCreator;\nexports.createStructuredSelector = createStructuredSelector;\nfunction defaultEqualityCheck(a, b) {\n return a === b;\n}\n\nfunction areArgumentsShallowlyEqual(equalityCheck, prev, next) {\n if (prev === null || next === null || prev.length !== next.length) {\n return false;\n }\n\n // Do this in a for loop (and not a `forEach` or an `every`) so we can determine equality as fast as possible.\n var length = prev.length;\n for (var i = 0; i < length; i++) {\n if (!equalityCheck(prev[i], next[i])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction defaultMemoize(func) {\n var equalityCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultEqualityCheck;\n\n var lastArgs = null;\n var lastResult = null;\n // we reference arguments instead of spreading them for performance reasons\n return function () {\n if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {\n // apply arguments instead of spreading for performance.\n lastResult = func.apply(null, arguments);\n }\n\n lastArgs = arguments;\n return lastResult;\n };\n}\n\nfunction getDependencies(funcs) {\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;\n\n if (!dependencies.every(function (dep) {\n return typeof dep === 'function';\n })) {\n var dependencyTypes = dependencies.map(function (dep) {\n return typeof dep;\n }).join(', ');\n throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));\n }\n\n return dependencies;\n}\n\nfunction createSelectorCreator(memoize) {\n for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n memoizeOptions[_key - 1] = arguments[_key];\n }\n\n return function () {\n for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n funcs[_key2] = arguments[_key2];\n }\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = getDependencies(funcs);\n\n var memoizedResultFunc = memoize.apply(undefined, [function () {\n recomputations++;\n // apply arguments instead of spreading for performance.\n return resultFunc.apply(null, arguments);\n }].concat(memoizeOptions));\n\n // If a selector is called with the exact same arguments we don't need to traverse our dependencies again.\n var selector = defaultMemoize(function () {\n var params = [];\n var length = dependencies.length;\n\n for (var i = 0; i < length; i++) {\n // apply arguments instead of spreading and mutate a local list of params for performance.\n params.push(dependencies[i].apply(null, arguments));\n }\n\n // apply arguments instead of spreading for performance.\n return memoizedResultFunc.apply(null, params);\n });\n\n selector.resultFunc = resultFunc;\n selector.recomputations = function () {\n return recomputations;\n };\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n return selector;\n };\n}\n\nvar createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);\n\nfunction createStructuredSelector(selectors) {\n var selectorCreator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createSelector;\n\n if (typeof selectors !== 'object') {\n throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));\n }\n var objectKeys = Object.keys(selectors);\n return selectorCreator(objectKeys.map(function (key) {\n return selectors[key];\n }), function () {\n for (var _len3 = arguments.length, values = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n values[_key3] = arguments[_key3];\n }\n\n return values.reduce(function (composition, value, index) {\n composition[objectKeys[index]] = value;\n return composition;\n }, {});\n });\n}","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('reselect')) :\n typeof define === 'function' && define.amd ? define(['exports', 'reselect'], factory) :\n (global = global || self, factory(global['Re-reselect'] = {}, global.Reselect));\n}(this, (function (exports, reselect) { 'use strict';\n\n function isStringOrNumber(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n\n var FlatObjectCache = /*#__PURE__*/function () {\n function FlatObjectCache() {\n this._cache = {};\n }\n\n var _proto = FlatObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FlatObjectCache;\n }();\n\n var defaultCacheCreator = FlatObjectCache;\n\n var defaultCacheKeyValidator = function defaultCacheKeyValidator() {\n return true;\n };\n\n function createCachedSelector() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n return function (polymorphicOptions, legacyOptions) {\n if (legacyOptions) {\n throw new Error('[re-reselect] \"options\" as second argument is not supported anymore. Please provide an option object as single argument.');\n }\n\n var options = typeof polymorphicOptions === 'function' ? {\n keySelector: polymorphicOptions\n } : Object.assign({}, polymorphicOptions); // https://github.com/reduxjs/reselect/blob/v4.0.0/src/index.js#L54\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : [].concat(funcs);\n\n var resultFuncWithRecomputations = function resultFuncWithRecomputations() {\n recomputations++;\n return resultFunc.apply(void 0, arguments);\n };\n\n funcs.push(resultFuncWithRecomputations);\n var cache = options.cacheObject || new defaultCacheCreator();\n var selectorCreator = options.selectorCreator || reselect.createSelector;\n var isValidCacheKey = cache.isValidCacheKey || defaultCacheKeyValidator;\n\n if (options.keySelectorCreator) {\n options.keySelector = options.keySelectorCreator({\n keySelector: options.keySelector,\n inputSelectors: dependencies,\n resultFunc: resultFunc\n });\n } // Application receives this function\n\n\n var selector = function selector() {\n var cacheKey = options.keySelector.apply(options, arguments);\n\n if (isValidCacheKey(cacheKey)) {\n var cacheResponse = cache.get(cacheKey);\n\n if (cacheResponse === undefined) {\n cacheResponse = selectorCreator.apply(void 0, funcs);\n cache.set(cacheKey, cacheResponse);\n }\n\n return cacheResponse.apply(void 0, arguments);\n }\n\n console.warn(\"[re-reselect] Invalid cache key \\\"\" + cacheKey + \"\\\" has been returned by keySelector function.\");\n return undefined;\n }; // Further selector methods\n\n\n selector.getMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments); // @NOTE It might update cache hit count in LRU-like caches\n\n return cache.get(cacheKey);\n };\n\n selector.removeMatchingSelector = function () {\n var cacheKey = options.keySelector.apply(options, arguments);\n cache.remove(cacheKey);\n };\n\n selector.clearCache = function () {\n cache.clear();\n };\n\n selector.resultFunc = resultFunc;\n selector.dependencies = dependencies;\n selector.cache = cache;\n\n selector.recomputations = function () {\n return recomputations;\n };\n\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n\n selector.keySelector = options.keySelector;\n return selector;\n };\n }\n\n function createStructuredCachedSelector(selectors) {\n return reselect.createStructuredSelector(selectors, createCachedSelector);\n }\n\n function validateCacheSize(cacheSize) {\n if (cacheSize === undefined) {\n throw new Error('Missing the required property \"cacheSize\".');\n }\n\n if (!Number.isInteger(cacheSize) || cacheSize <= 0) {\n throw new Error('The \"cacheSize\" property must be a positive integer value.');\n }\n }\n\n var FifoObjectCache = /*#__PURE__*/function () {\n function FifoObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._cacheOrdering.push(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return FifoObjectCache;\n }();\n\n var LruObjectCache = /*#__PURE__*/function () {\n function LruObjectCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = {};\n this._cacheOrdering = [];\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruObjectCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache[key] = selectorFn;\n\n this._registerCacheHit(key);\n\n if (this._cacheOrdering.length > this._cacheSize) {\n var earliest = this._cacheOrdering[0];\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n this._registerCacheHit(key);\n\n return this._cache[key];\n };\n\n _proto.remove = function remove(key) {\n this._deleteCacheHit(key);\n\n delete this._cache[key];\n };\n\n _proto.clear = function clear() {\n this._cache = {};\n this._cacheOrdering = [];\n };\n\n _proto._registerCacheHit = function _registerCacheHit(key) {\n this._deleteCacheHit(key);\n\n this._cacheOrdering.push(key);\n };\n\n _proto._deleteCacheHit = function _deleteCacheHit(key) {\n var index = this._cacheOrdering.indexOf(key);\n\n if (index > -1) {\n this._cacheOrdering.splice(index, 1);\n }\n };\n\n _proto.isValidCacheKey = function isValidCacheKey(cacheKey) {\n return isStringOrNumber(cacheKey);\n };\n\n return LruObjectCache;\n }();\n\n var FlatMapCache = /*#__PURE__*/function () {\n function FlatMapCache() {\n this._cache = new Map();\n }\n\n var _proto = FlatMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FlatMapCache;\n }();\n\n var FifoMapCache = /*#__PURE__*/function () {\n function FifoMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = FifoMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n return this._cache.get(key);\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return FifoMapCache;\n }();\n\n var LruMapCache = /*#__PURE__*/function () {\n function LruMapCache(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n cacheSize = _ref.cacheSize;\n\n validateCacheSize(cacheSize);\n this._cache = new Map();\n this._cacheSize = cacheSize;\n }\n\n var _proto = LruMapCache.prototype;\n\n _proto.set = function set(key, selectorFn) {\n this._cache.set(key, selectorFn);\n\n if (this._cache.size > this._cacheSize) {\n var earliest = this._cache.keys().next().value;\n\n this.remove(earliest);\n }\n };\n\n _proto.get = function get(key) {\n var value = this._cache.get(key); // Register cache hit\n\n\n if (this._cache.has(key)) {\n this.remove(key);\n\n this._cache.set(key, value);\n }\n\n return value;\n };\n\n _proto.remove = function remove(key) {\n this._cache[\"delete\"](key);\n };\n\n _proto.clear = function clear() {\n this._cache.clear();\n };\n\n return LruMapCache;\n }();\n\n exports.FifoMapCache = FifoMapCache;\n exports.FifoObjectCache = FifoObjectCache;\n exports.FlatMapCache = FlatMapCache;\n exports.FlatObjectCache = FlatObjectCache;\n exports.LruMapCache = LruMapCache;\n exports.LruObjectCache = LruObjectCache;\n exports.createCachedSelector = createCachedSelector;\n exports.createStructuredCachedSelector = createStructuredCachedSelector;\n exports.default = createCachedSelector;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=index.js.map\n","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayMap = require('./_arrayMap'),\n baseGet = require('./_baseGet'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseOrderBy = require('./_baseOrderBy'),\n isArray = require('./isArray');\n\n/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\nfunction orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n}\n\nmodule.exports = orderBy;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray'),\n negate = require('./negate');\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nmodule.exports = reject;\n","var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nmodule.exports = negate;\n","/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nmodule.exports = head;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","import _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","export default function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}","import _curry1 from './_curry1.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _arity from './internal/_arity.js';\nimport _curry1 from './internal/_curry1.js';\nimport _curry2 from './internal/_curry2.js';\nimport _curryN from './internal/_curryN.js';\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * const sumArgs = (...args) => R.sum(args);\n *\n * const curriedAddFourNumbers = R.curryN(4, sumArgs);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nexport default curryN;","import _arity from './_arity.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));\n };\n}","import _curry1 from './internal/_curry1.js';\nimport curryN from './curryN.js';\n\n/**\n * Returns a curried equivalent of the provided function. The curried function\n * has two unusual capabilities. First, its arguments needn't be provided one\n * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig (* -> a) -> (* -> a)\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curryN, R.partial\n * @example\n *\n * const addFourNumbers = (a, b, c, d) => a + b + c + d;\n *\n * const curriedAddFourNumbers = R.curry(addFourNumbers);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curry = /*#__PURE__*/_curry1(function curry(fn) {\n return curryN(fn.length, fn);\n});\nexport default curry;","/**\n * A special placeholder value used to specify \"gaps\" within curried functions,\n * allowing partial application of any combination of arguments, regardless of\n * their positions.\n *\n * If `g` is a curried ternary function and `_` is `R.__`, the following are\n * equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2, _)(1, 3)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @name __\n * @constant\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @example\n *\n * const greet = R.replace('{name}', R.__, 'Hello, {name}!');\n * greet('Alice'); //=> 'Hello, Alice!'\n */\nexport default { '@@functional/placeholder': true };","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\nimport { curry, __ as placeholder } from 'ramda';\n\nfunction forOwn(obj, fn) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn(obj[key], key);\n }\n }\n}\n\nfunction isArrayLike(value) {\n return value && _typeof(value) === 'object' && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0;\n}\n\nvar OWNER_ID_TAG = '@@_______immutableOpsOwnerID';\n\nfunction fastArrayCopy(arr) {\n var copied = new Array(arr.length);\n\n for (var i = 0; i < arr.length; i++) {\n copied[i] = arr[i];\n }\n\n return copied;\n}\n\nexport function canMutate(obj, ownerID) {\n if (!ownerID) return false;\n return obj[OWNER_ID_TAG] === ownerID;\n}\nvar newOwnerID = typeof Symbol === 'function' ? function () {\n return Symbol('ownerID');\n} : function () {\n return {};\n};\nexport var getBatchToken = newOwnerID;\n\nfunction addOwnerID(obj, ownerID) {\n Object.defineProperty(obj, OWNER_ID_TAG, {\n value: ownerID,\n configurable: true,\n enumerable: false\n });\n return obj;\n}\n\nfunction prepareNewObject(instance, ownerID) {\n if (ownerID) {\n addOwnerID(instance, ownerID);\n }\n\n return instance;\n}\n\nfunction forceArray(arg) {\n if (!(arg instanceof Array)) {\n return [arg];\n }\n\n return arg;\n}\n\nvar PATH_SEPARATOR = '.';\n\nfunction normalizePath(pathArg) {\n if (typeof pathArg === 'string') {\n if (pathArg.indexOf(PATH_SEPARATOR) === -1) {\n return [pathArg];\n }\n\n return pathArg.split(PATH_SEPARATOR);\n }\n\n return pathArg;\n}\n\nfunction mutableSet(key, value, obj) {\n obj[key] = value;\n return obj;\n}\n\nfunction mutableSetIn(_pathArg, value, obj) {\n var originalPathArg = normalizePath(_pathArg);\n var pathLen = originalPathArg.length;\n var done = false;\n var idx = 0;\n var acc = obj;\n var curr = originalPathArg[idx];\n\n while (!done) {\n if (idx === pathLen - 1) {\n acc[curr] = value;\n done = true;\n } else {\n var currType = _typeof(acc[curr]);\n\n if (currType === 'undefined') {\n var newObj = {};\n prepareNewObject(newObj, null);\n acc[curr] = newObj;\n } else if (currType !== 'object') {\n var pathRepr = \"\".concat(originalPathArg[idx - 1], \".\").concat(curr);\n throw new Error(\"A non-object value was encountered when traversing setIn path at \".concat(pathRepr, \".\"));\n }\n\n acc = acc[curr];\n idx++;\n curr = originalPathArg[idx];\n }\n }\n\n return obj;\n}\n\nfunction valueInPath(_pathArg, obj) {\n var pathArg = normalizePath(_pathArg);\n var acc = obj;\n\n for (var i = 0; i < pathArg.length; i++) {\n var curr = pathArg[i];\n var currRef = acc[curr];\n\n if (i === pathArg.length - 1) {\n return currRef;\n }\n\n if (_typeof(currRef) === 'object') {\n acc = currRef;\n } else {\n return undefined;\n }\n }\n\n return undefined;\n}\n\nfunction immutableSetIn(ownerID, _pathArg, value, obj) {\n var pathArg = normalizePath(_pathArg);\n var currentValue = valueInPath(pathArg, obj);\n if (value === currentValue) return obj;\n var pathLen = pathArg.length;\n var acc;\n\n if (canMutate(obj, ownerID)) {\n acc = obj;\n } else {\n acc = Object.assign(prepareNewObject({}, ownerID), obj);\n }\n\n var rootObj = acc;\n pathArg.forEach(function (curr, idx) {\n if (idx === pathLen - 1) {\n acc[curr] = value;\n return;\n }\n\n var currRef = acc[curr];\n\n var currType = _typeof(currRef);\n\n if (currType === 'object') {\n if (canMutate(currRef, ownerID)) {\n acc = currRef;\n } else {\n var newObj = prepareNewObject({}, ownerID);\n acc[curr] = Object.assign(newObj, currRef);\n acc = newObj;\n }\n\n return;\n }\n\n if (currType === 'undefined') {\n var _newObj = prepareNewObject({}, ownerID);\n\n acc[curr] = _newObj;\n acc = _newObj;\n return;\n }\n\n var pathRepr = \"\".concat(pathArg[idx - 1], \".\").concat(curr);\n throw new Error(\"A non-object value was encountered when traversing setIn path at \".concat(pathRepr, \".\"));\n });\n return rootObj;\n}\n\nfunction mutableMerge(isDeep, _mergeObjs, baseObj) {\n var mergeObjs = forceArray(_mergeObjs);\n\n if (isDeep) {\n mergeObjs.forEach(function (mergeObj) {\n forOwn(mergeObj, function (value, key) {\n if (isDeep && baseObj.hasOwnProperty(key)) {\n var assignValue;\n\n if (_typeof(value) === 'object') {\n assignValue = mutableMerge(isDeep, [value], baseObj[key]);\n } else {\n assignValue = value;\n }\n\n baseObj[key] = assignValue;\n } else {\n baseObj[key] = value;\n }\n });\n });\n } else {\n Object.assign.apply(Object, [baseObj].concat(_toConsumableArray(mergeObjs)));\n }\n\n return baseObj;\n}\n\nvar mutableShallowMerge = mutableMerge.bind(null, false);\nvar mutableDeepMerge = mutableMerge.bind(null, true);\n\nfunction mutableOmit(_keys, obj) {\n var keys = forceArray(_keys);\n keys.forEach(function (key) {\n delete obj[key];\n });\n return obj;\n}\n\nfunction shouldMergeKey(obj, other, key) {\n return obj[key] !== other[key];\n}\n\nfunction immutableMerge(isDeep, ownerID, _mergeObjs, obj) {\n if (canMutate(obj, ownerID)) return mutableMerge(isDeep, _mergeObjs, obj);\n var mergeObjs = forceArray(_mergeObjs);\n var hasChanges = false;\n var nextObject = obj;\n\n var willChange = function willChange() {\n if (!hasChanges) {\n hasChanges = true;\n nextObject = Object.assign({}, obj);\n prepareNewObject(nextObject, ownerID);\n }\n };\n\n mergeObjs.forEach(function (mergeObj) {\n forOwn(mergeObj, function (mergeValue, key) {\n if (isDeep && obj.hasOwnProperty(key)) {\n var currentValue = nextObject[key];\n\n if (_typeof(mergeValue) === 'object' && !(mergeValue instanceof Array)) {\n if (shouldMergeKey(nextObject, mergeObj, key)) {\n var recursiveMergeResult = immutableMerge(isDeep, ownerID, mergeValue, currentValue);\n\n if (recursiveMergeResult !== currentValue) {\n willChange();\n nextObject[key] = recursiveMergeResult;\n }\n }\n\n return true; // continue forOwn\n }\n }\n\n if (shouldMergeKey(nextObject, mergeObj, key)) {\n willChange();\n nextObject[key] = mergeValue;\n }\n\n return undefined;\n });\n });\n return nextObject;\n}\n\nvar immutableDeepMerge = immutableMerge.bind(null, true);\nvar immutableShallowMerge = immutableMerge.bind(null, false);\n\nfunction immutableArrSet(ownerID, index, value, arr) {\n if (canMutate(arr, ownerID)) return mutableSet(index, value, arr);\n if (arr[index] === value) return arr;\n var newArr = fastArrayCopy(arr);\n newArr[index] = value;\n prepareNewObject(newArr, ownerID);\n return newArr;\n}\n\nfunction immutableSet(ownerID, key, value, obj) {\n if (isArrayLike(obj)) return immutableArrSet(ownerID, key, value, obj);\n if (canMutate(obj, ownerID)) return mutableSet(key, value, obj);\n if (obj[key] === value) return obj;\n var newObj = Object.assign({}, obj);\n prepareNewObject(newObj, ownerID);\n newObj[key] = value;\n return newObj;\n}\n\nfunction immutableOmit(ownerID, _keys, obj) {\n if (canMutate(obj, ownerID)) return mutableOmit(_keys, obj);\n var keys = forceArray(_keys);\n var keysInObj = keys.filter(function (key) {\n return obj.hasOwnProperty(key);\n }); // None of the keys were in the object, so we can return `obj`.\n\n if (keysInObj.length === 0) return obj;\n var newObj = Object.assign({}, obj);\n keysInObj.forEach(function (key) {\n delete newObj[key];\n });\n prepareNewObject(newObj, ownerID);\n return newObj;\n}\n\nfunction mutableArrPush(_vals, arr) {\n var vals = forceArray(_vals);\n arr.push.apply(arr, _toConsumableArray(vals));\n return arr;\n}\n\nfunction mutableArrFilter(func, arr) {\n var currIndex = 0;\n var originalIndex = 0;\n\n while (currIndex < arr.length) {\n var item = arr[currIndex];\n\n if (!func(item, originalIndex)) {\n arr.splice(currIndex, 1);\n } else {\n currIndex++;\n }\n\n originalIndex++;\n }\n\n return arr;\n}\n\nfunction mutableArrSplice(index, deleteCount, _vals, arr) {\n var vals = forceArray(_vals);\n arr.splice.apply(arr, [index, deleteCount].concat(_toConsumableArray(vals)));\n return arr;\n}\n\nfunction mutableArrInsert(index, _vals, arr) {\n return mutableArrSplice(index, 0, _vals, arr);\n}\n\nfunction immutableArrSplice(ownerID, index, deleteCount, _vals, arr) {\n if (canMutate(arr, ownerID)) return mutableArrSplice(index, deleteCount, _vals, arr);\n var vals = forceArray(_vals);\n var newArr = arr.slice();\n prepareNewObject(newArr, ownerID);\n newArr.splice.apply(newArr, [index, deleteCount].concat(_toConsumableArray(vals)));\n return newArr;\n}\n\nfunction immutableArrInsert(ownerID, index, _vals, arr) {\n if (canMutate(arr, ownerID)) return mutableArrInsert(index, _vals, arr);\n return immutableArrSplice(ownerID, index, 0, _vals, arr);\n}\n\nfunction immutableArrPush(ownerID, vals, arr) {\n return immutableArrInsert(ownerID, arr.length, vals, arr);\n}\n\nfunction immutableArrFilter(ownerID, func, arr) {\n if (canMutate(arr, ownerID)) return mutableArrFilter(func, arr);\n var newArr = arr.filter(func);\n if (newArr.length === arr.length) return arr;\n prepareNewObject(newArr, ownerID);\n return newArr;\n}\n\nvar immutableOperations = {\n // object operations\n merge: immutableShallowMerge,\n deepMerge: immutableDeepMerge,\n omit: immutableOmit,\n setIn: immutableSetIn,\n // array operations\n insert: immutableArrInsert,\n push: immutableArrPush,\n filter: immutableArrFilter,\n splice: immutableArrSplice,\n // both\n set: immutableSet\n};\nvar mutableOperations = {\n // object operations\n merge: mutableShallowMerge,\n deepMerge: mutableDeepMerge,\n omit: mutableOmit,\n setIn: mutableSetIn,\n // array operations\n insert: mutableArrInsert,\n push: mutableArrPush,\n filter: mutableArrFilter,\n splice: mutableArrSplice,\n // both\n set: mutableSet\n};\nexport function getImmutableOps() {\n var immutableOps = Object.assign({}, immutableOperations);\n forOwn(immutableOps, function (value, key) {\n immutableOps[key] = curry(value.bind(null, null));\n });\n var mutableOps = Object.assign({}, mutableOperations);\n forOwn(mutableOps, function (value, key) {\n mutableOps[key] = curry(value);\n });\n var batchOps = Object.assign({}, immutableOperations);\n forOwn(batchOps, function (value, key) {\n batchOps[key] = curry(value);\n });\n\n function batched(_token, _fn) {\n var token;\n var fn;\n\n if (typeof _token === 'function') {\n fn = _token;\n token = getBatchToken();\n } else {\n token = _token;\n fn = _fn;\n }\n\n var immutableOpsBoundToToken = Object.assign({}, immutableOperations);\n forOwn(immutableOpsBoundToToken, function (value, key) {\n immutableOpsBoundToToken[key] = curry(value.bind(null, token));\n });\n return fn(immutableOpsBoundToToken);\n }\n\n return Object.assign(immutableOps, {\n mutable: mutableOps,\n batch: batchOps,\n batched: batched,\n __: placeholder,\n getBatchToken: getBatchToken\n });\n}\nexport var ops = getImmutableOps();\nexport default ops;","export const UPDATE = \"REDUX_ORM_UPDATE\";\nexport const DELETE = \"REDUX_ORM_DELETE\";\nexport const CREATE = \"REDUX_ORM_CREATE\";\n\nexport const FILTER = \"REDUX_ORM_FILTER\";\nexport const EXCLUDE = \"REDUX_ORM_EXCLUDE\";\nexport const ORDER_BY = \"REDUX_ORM_ORDER_BY\";\n\nexport const SUCCESS = \"SUCCESS\";\nexport const FAILURE = \"FAILURE\";\n\n// for detecting ORM state objects\nexport const STATE_FLAG = \"@@_______REDUX_ORM_STATE_FLAG\";\n\n// for caching selectors based on their ID argument\nexport const ALL_INSTANCES = Symbol(\"REDUX_ORM_ALL_INSTANCES\");\nexport const ID_ARG_KEY_SELECTOR = (_state, idArg) =>\n typeof idArg === \"undefined\" ? ALL_INSTANCES : idArg;\n","import ops from \"immutable-ops\";\nimport { FILTER, EXCLUDE } from \"./constants\";\n\n/**\n * @module utils\n * @private\n */\n\n/** @private */\nfunction warnDeprecated(msg) {\n const logger =\n typeof console.warn === \"function\"\n ? console.warn.bind(console)\n : console.log.bind(console);\n return logger(msg);\n}\n\n/** @private */\nfunction capitalize(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Returns the branch name for a many-to-many relation.\n * The name is the combination of the model name and the field name the relation\n * was declared. The field name's first letter is capitalized.\n *\n * Example: model `Author` has a many-to-many relation to the model `Book`, defined\n * in the `Author` field `books`. The many-to-many branch name will be `AuthorBooks`.\n *\n * @param {string} declarationModelName - the name of the model the many-to-many relation was declared on\n * @param {string} fieldName - the field name where the many-to-many relation was declared on\n * @return {string} The branch name for the many-to-many relation.\n */\nfunction m2mName(declarationModelName, fieldName) {\n return declarationModelName + capitalize(fieldName);\n}\n\n/**\n * Returns the fieldname that saves a foreign key to the\n * model id where the many-to-many relation was declared.\n *\n * Example: `Author` => `fromAuthorId`\n *\n * @param {string} declarationModelName - the name of the model where the relation was declared\n * @return {string} the field name in the through model for `declarationModelName`'s foreign key.\n */\nfunction m2mFromFieldName(declarationModelName) {\n return `from${declarationModelName}Id`;\n}\n\n/**\n * Returns the fieldname that saves a foreign key in a many-to-many through model to the\n * model where the many-to-many relation was declared.\n *\n * Example: `Book` => `toBookId`\n *\n * @param {string} otherModelName - the name of the model that was the target of the many-to-many\n * declaration.\n * @return {string} the field name in the through model for `otherModelName`'s foreign key..\n */\nfunction m2mToFieldName(otherModelName) {\n return `to${otherModelName}Id`;\n}\n\n/** */\nfunction reverseFieldName(modelName) {\n return modelName.toLowerCase() + \"Set\"; // eslint-disable-line prefer-template\n}\n\n/** @private */\nfunction querySetDelegatorFactory(methodName) {\n return function querySetDelegator(...args) {\n return this.getQuerySet()[methodName](...args);\n };\n}\n\n/** @private */\nfunction querySetGetterDelegatorFactory(getterName) {\n return function querySetGetterDelegator() {\n const qs = this.getQuerySet();\n return qs[getterName];\n };\n}\n\n/** @private */\nfunction forEachSuperClass(subClass, func) {\n let currClass = subClass;\n while (currClass !== Function.prototype) {\n func(currClass);\n currClass = Object.getPrototypeOf(currClass);\n }\n}\n\n/** */\nfunction attachQuerySetMethods(modelClass, querySetClass) {\n const leftToDefine = querySetClass.sharedMethods.slice();\n\n // There is no way to get a property descriptor for the whole prototype chain;\n // only from an objects own properties. Therefore we traverse the whole prototype\n // chain for querySet.\n forEachSuperClass(querySetClass, (cls) => {\n for (let i = 0; i < leftToDefine.length; i++) {\n let defined = false;\n const methodName = leftToDefine[i];\n const descriptor = Object.getOwnPropertyDescriptor(\n cls.prototype,\n methodName\n );\n if (typeof descriptor !== \"undefined\") {\n if (typeof descriptor.get !== \"undefined\") {\n descriptor.get = querySetGetterDelegatorFactory(methodName);\n Object.defineProperty(modelClass, methodName, descriptor);\n } else {\n modelClass[methodName] = querySetDelegatorFactory(\n methodName\n );\n }\n defined = true;\n }\n if (defined) {\n leftToDefine.splice(i--, 1);\n }\n }\n });\n}\n\n/**\n * Normalizes `entity` to an id, where `entity` can be an id\n * or a Model instance.\n *\n * @param {*} entity - either a Model instance or an id value\n * @return {*} the id value of `entity`\n */\nfunction normalizeEntity(entity) {\n if (\n entity !== null &&\n typeof entity !== \"undefined\" &&\n typeof entity.getId === \"function\"\n ) {\n return entity.getId();\n }\n return entity;\n}\n\n/** */\nfunction reverseFieldErrorMessage(\n modelName,\n fieldName,\n toModelName,\n backwardsFieldName\n) {\n return [\n `Reverse field ${backwardsFieldName} already defined`,\n ` on model ${toModelName}. To fix, set a custom related`,\n ` name on ${modelName}.${fieldName}.`,\n ].join(\"\");\n}\n\n/**\n * Fastest way to check if two objects are equal.\n * Object and array values have to be referentially equal.\n */\nfunction objectShallowEquals(a, b) {\n const entriesInA = Object.entries(Object(a));\n\n if (entriesInA.length !== Object.keys(b).length) {\n return false;\n }\n\n return entriesInA.every(\n ([key, value]) => b.hasOwnProperty(key) && b[key] === value\n );\n}\n\n/** */\nfunction arrayDiffActions(sourceArr, targetArr) {\n const itemsInBoth = sourceArr.filter((item) => targetArr.includes(item));\n const deleteItems = sourceArr.filter((item) => !itemsInBoth.includes(item));\n const addItems = targetArr.filter((item) => !itemsInBoth.includes(item));\n\n if (deleteItems.length || addItems.length) {\n return {\n delete: deleteItems,\n add: addItems,\n };\n }\n return null;\n}\n\nconst { getBatchToken } = ops;\n\n/**\n * @return boolean\n */\nfunction clauseFiltersByAttribute({ type, payload }, attribute) {\n if (type !== FILTER) return false;\n\n if (typeof payload !== \"object\") {\n /**\n * payload could also be a function in which case\n * we would have no way of knowing what it does,\n * so we default to false for non-objects\n */\n return false;\n }\n\n if (!payload.hasOwnProperty(attribute)) return false;\n const attributeValue = payload[attribute];\n if (attributeValue === null) return false;\n if (attributeValue === undefined) return false;\n\n return true;\n}\n\n/**\n * @return boolean\n */\nfunction clauseReducesResultSetSize({ type }) {\n return [FILTER, EXCLUDE].includes(type);\n}\n\n/**\n * @param {Object} object\n * @return Object\n */\nfunction mapValues(object, func) {\n return Object.entries(object).reduce((newObject, [key, value]) => {\n newObject[key] = func(value);\n return newObject;\n }, {});\n}\n\n/** */\nfunction normalizeModelReference(modelNameOrClass) {\n if (!modelNameOrClass || typeof modelNameOrClass === \"string\") {\n return modelNameOrClass;\n }\n return modelNameOrClass.modelName;\n}\n\nexport {\n attachQuerySetMethods,\n m2mName,\n m2mFromFieldName,\n m2mToFieldName,\n reverseFieldName,\n normalizeEntity,\n reverseFieldErrorMessage,\n objectShallowEquals,\n ops,\n arrayDiffActions,\n getBatchToken,\n clauseFiltersByAttribute,\n clauseReducesResultSetSize,\n warnDeprecated,\n mapValues,\n normalizeModelReference,\n};\n","import { normalizeEntity, warnDeprecated, mapValues } from \"./utils\";\n\nimport { UPDATE, DELETE, FILTER, EXCLUDE, ORDER_BY } from \"./constants\";\n\n/**\n * This class is used to build and make queries to the database\n * and operating the resulting set (such as updating attributes\n * or deleting the records).\n *\n * The queries are built lazily. For example:\n *\n * ```javascript\n * const qs = Book.all()\n * .filter(book => book.releaseYear > 1999)\n * .orderBy('name');\n * ```\n *\n * Doesn't execute a query. The query is executed only when\n * you need information from the query result, such as {@link QuerySet#count},\n * {@link QuerySet#toRefArray}. After the query is executed, the resulting\n * set is cached in the QuerySet instance.\n *\n * QuerySet instances also return copies, so chaining filters doesn't\n * mutate the previous instances.\n */\nconst QuerySet = class QuerySet {\n /**\n * Creates a QuerySet. The constructor is mainly for internal use;\n * You should access QuerySet instances from {@link Model}.\n *\n * @param {Model} modelClass - the model class of objects in this QuerySet.\n * @param {any[]} clauses - query clauses needed to evaluate the set.\n * @param {Object} [opts] - additional options\n */\n constructor(modelClass, clauses, opts) {\n Object.assign(this, {\n modelClass,\n clauses: clauses || [],\n });\n\n this._opts = opts;\n }\n\n static addSharedMethod(methodName) {\n this.sharedMethods = this.sharedMethods.concat(methodName);\n }\n\n _new(clauses, userOpts) {\n const opts = { ...this._opts, ...userOpts };\n return new this.constructor(this.modelClass, clauses, opts);\n }\n\n toString() {\n this._evaluate();\n const contents = this.rows\n .map(({ id }) => this.modelClass.withId(id).toString())\n .join(\"\\n - \");\n return `QuerySet contents:\\n - ${contents}`;\n }\n\n /**\n * Returns an array of the plain objects represented by the QuerySet.\n * The plain objects are direct references to the store.\n *\n * @return {Object[]} references to the plain JS objects represented by\n * the QuerySet\n */\n toRefArray() {\n return this._evaluate();\n }\n\n /**\n * Returns an array of {@link Model} instances represented by the QuerySet.\n * @return {Model[]} model instances represented by the QuerySet\n */\n toModelArray() {\n const { modelClass: ModelClass } = this;\n return this._evaluate().map((props) => new ModelClass(props));\n }\n\n /**\n * Returns the number of {@link Model} instances represented by the QuerySet.\n *\n * @return {number} length of the QuerySet\n */\n count() {\n this._evaluate();\n return this.rows.length;\n }\n\n /**\n * Checks if the {@link QuerySet} instance has any records matching the query\n * in the database.\n *\n * @return {Boolean} `true` if the {@link QuerySet} instance contains entities, else `false`.\n */\n exists() {\n return Boolean(this.count());\n }\n\n /**\n * Returns the {@link Model} instance at index `index` in the {@link QuerySet} instance if\n * `withRefs` flag is set to `false`, or a reference to the plain JavaScript\n * object in the model state if `true`.\n *\n * @param {number} index - index of the model instance to get\n * @return {Model|undefined} a {@link Model} instance at index\n * `index` in the {@link QuerySet} instance,\n * or undefined if the index is out of bounds.\n */\n at(index) {\n const { modelClass: ModelClass } = this;\n\n const rows = this._evaluate();\n if (index >= 0 && index < rows.length) {\n return new ModelClass(rows[index]);\n }\n\n return undefined;\n }\n\n /**\n * Returns the {@link Model} instance at index 0 in the {@link QuerySet} instance.\n * @return {Model}\n */\n first() {\n return this.at(0);\n }\n\n /**\n * Returns the {@link Model} instance at index `QuerySet.count() - 1`\n * @return {Model}\n */\n last() {\n const rows = this._evaluate();\n return this.at(rows.length - 1);\n }\n\n /**\n * Returns a new {@link QuerySet} instance with the same entities.\n * @return {QuerySet} a new QuerySet with the same entities.\n */\n all() {\n return this._new(this.clauses);\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities that match properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to match objects with. Can also be a function.\n * It works the same as [Lodash filter](https://lodash.com/docs/#filter).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that passed the filter.\n */\n filter(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj =\n typeof lookupObj === \"object\"\n ? mapValues(lookupObj, normalizeEntity)\n : lookupObj;\n\n const filterDescriptor = {\n type: FILTER,\n payload: normalizedLookupObj,\n };\n /**\n * create a new QuerySet\n * including only rows matching the lookupObj\n */\n return this._new(this.clauses.concat(filterDescriptor));\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities that do not match\n * properties in `lookupObj`.\n *\n * @param {Object} lookupObj - the properties to unmatch objects with. Can also be a function.\n * It works the same as [Lodash reject](https://lodash.com/docs/#reject).\n * @return {QuerySet} a new {@link QuerySet} instance with objects that did not pass the filter.\n */\n exclude(lookupObj) {\n /**\n * allow foreign keys to be specified as model instances,\n * transform model instances to their primary keys\n */\n const normalizedLookupObj =\n typeof lookupObj === \"object\"\n ? mapValues(lookupObj, normalizeEntity)\n : lookupObj;\n const excludeDescriptor = {\n type: EXCLUDE,\n payload: normalizedLookupObj,\n };\n\n /**\n * create a new QuerySet\n * excluding all rows matching the lookupObj\n */\n return this._new(this.clauses.concat(excludeDescriptor));\n }\n\n /**\n * Performs the actual database query.\n * @private\n * @return {Array} rows corresponding to the QuerySet's clauses\n */\n _evaluate() {\n if (typeof this.modelClass.session === \"undefined\") {\n throw new Error(\n [\n `Tried to query the ${this.modelClass.modelName} model's table without a session. `,\n \"Create a session using `session = orm.session()` and use \",\n `\\`session[\"${this.modelClass.modelName}\"]\\` for querying instead.`,\n ].join(\"\")\n );\n }\n if (!this._evaluated) {\n const { session, modelName: table } = this.modelClass;\n const querySpec = {\n table,\n clauses: this.clauses,\n };\n this.rows = session.query(querySpec).rows;\n this._evaluated = true;\n }\n return this.rows;\n }\n\n /**\n * Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending\n * order, unless otherwise specified. Delegates to [Lodash orderBy](https://lodash.com/docs/#orderBy).\n *\n * @param {string[]|Function[]} iteratees - an array where each item can be a string or a\n * function. If a string is supplied, it should\n * correspond to property on the entity that will\n * determine the order. If a function is supplied,\n * it should return the value to order by.\n * @param {Array<Boolean|'asc'|'desc'>} [orders] - the sort orders of `iteratees`. If unspecified, all iteratees\n * will be sorted in ascending order. `true` and `'asc'`\n * correspond to ascending order, and `false` and `'desc'`\n * to descending order.\n * @return {QuerySet} a new {@link QuerySet} with objects ordered by `iteratees`.\n */\n orderBy(iteratees, orders) {\n const orderByDescriptor = {\n type: ORDER_BY,\n payload: [iteratees, orders],\n };\n\n /**\n * create a new QuerySet\n * sorting all rows according to the passed arguments\n */\n return this._new(this.clauses.concat(orderByDescriptor));\n }\n\n /**\n * Records an update specified with `mergeObj` to all the objects\n * in the {@link QuerySet} instance.\n *\n * @param {Object} mergeObj - an object to merge with all the objects in this\n * queryset.\n * @return {undefined}\n */\n update(mergeObj) {\n const { session, modelName: table } = this.modelClass;\n\n session.applyUpdate({\n action: UPDATE,\n query: {\n table,\n clauses: this.clauses,\n },\n payload: mergeObj,\n });\n\n this._evaluated = false;\n }\n\n /**\n * Records a deletion of all the objects in this {@link QuerySet} instance.\n * @return {undefined}\n */\n delete() {\n const { session, modelName: table } = this.modelClass;\n\n this.toModelArray().forEach(\n (model) => model._onDelete() // eslint-disable-line no-underscore-dangle\n );\n\n session.applyUpdate({\n action: DELETE,\n query: {\n table,\n clauses: this.clauses,\n },\n });\n\n this._evaluated = false;\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated\n * Use {@link QuerySet#toModelArray} or predicate functions that\n * instantiate Models from refs, e.g. `new Model(ref)`.\n */\n get withModels() {\n throw new Error(\n \"`QuerySet.prototype.withModels` has been removed. \" +\n \"Use `.toModelArray()` or predicate functions that \" +\n \"instantiate Models from refs, e.g. `new Model(ref)`.\"\n );\n }\n\n /**\n * @deprecated Query building operates on refs only now.\n */\n get withRefs() {\n warnDeprecated(\n \"`QuerySet.prototype.withRefs` has been deprecated. \" +\n \"Query building operates on refs only now.\"\n );\n return undefined;\n }\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to map.\n */\n map() {\n throw new Error(\n \"`QuerySet.prototype.map` has been removed. \" +\n \"Call `.toModelArray()` or `.toRefArray()` first to map.\"\n );\n }\n\n /**\n * @deprecated\n * Call {@link QuerySet#toModelArray} or {@link QuerySet#toRefArray} first to iterate.\n */\n forEach() {\n throw new Error(\n \"`QuerySet.prototype.forEach` has been removed. \" +\n \"Call `.toModelArray()` or `.toRefArray()` first to iterate.\"\n );\n }\n};\n\nQuerySet.sharedMethods = [\n \"count\",\n \"at\",\n \"all\",\n \"last\",\n \"first\",\n \"filter\",\n \"exclude\",\n \"orderBy\",\n \"update\",\n \"delete\",\n];\n\nexport default QuerySet;\n","import { getBatchToken } from \"immutable-ops\";\n\nimport { SUCCESS, UPDATE, DELETE } from \"./constants\";\nimport { warnDeprecated, clauseFiltersByAttribute } from \"./utils\";\n\nconst Session = class Session {\n /**\n * Creates a new Session.\n *\n * @param {Database} db - a {@link Database} instance\n * @param {Object} state - the database state\n * @param {Boolean} [withMutations] - whether the session should mutate data\n * @param {Object} [batchToken] - used by the backend to identify objects that can be\n * mutated.\n */\n constructor(schema, db, state, withMutations, batchToken) {\n this.schema = schema;\n this.db = db;\n this.state = state || db.getEmptyState();\n this.initialState = this.state;\n\n this.withMutations = Boolean(withMutations);\n this.batchToken = batchToken || getBatchToken();\n\n this.modelData = {};\n\n this.models = schema.getModelClasses();\n\n this.sessionBoundModels = this.models.map((modelClass) => {\n function SessionBoundModel() {\n return Reflect.construct(\n modelClass,\n arguments,\n SessionBoundModel\n ); // eslint-disable-line prefer-rest-params\n }\n Reflect.setPrototypeOf(\n SessionBoundModel.prototype,\n modelClass.prototype\n );\n Reflect.setPrototypeOf(SessionBoundModel, modelClass);\n\n Object.defineProperty(this, modelClass.modelName, {\n get: () => SessionBoundModel,\n });\n\n SessionBoundModel.connect(this);\n return SessionBoundModel;\n });\n }\n\n getDataForModel(modelName) {\n if (!this.modelData[modelName]) {\n this.modelData[modelName] = {};\n }\n return this.modelData[modelName];\n }\n\n getModelData() {\n return this.modelData;\n }\n\n markAccessed(modelName, modelIds) {\n const data = this.getDataForModel(modelName);\n if (!data.accessedInstances) {\n data.accessedInstances = {};\n }\n modelIds.forEach((id) => {\n data.accessedInstances[id] = true;\n });\n }\n\n get accessedModelInstances() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.accessedInstances) {\n result[key] = value.accessedInstances;\n }\n return result;\n },\n {}\n );\n }\n\n markFullTableScanned(modelName) {\n const data = this.getDataForModel(modelName);\n data.fullTableScanned = true;\n }\n\n get fullTableScannedModels() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.fullTableScanned) {\n result.push(key);\n }\n return result;\n },\n []\n );\n }\n\n markAccessedIndexes(indexes) {\n indexes.forEach(([table, attr, value]) => {\n const data = this.getDataForModel(table);\n if (!data.accessedIndexes) {\n data.accessedIndexes = {};\n }\n data.accessedIndexes[attr] = [\n ...(data.accessedIndexes[attr] || []),\n value,\n ];\n });\n }\n\n get accessedIndexes() {\n return Object.entries(this.getModelData()).reduce(\n (result, [key, value]) => {\n if (value.accessedIndexes) {\n result[key] = value.accessedIndexes;\n }\n return result;\n },\n {}\n );\n }\n\n /**\n * Applies update to a model state.\n *\n * @private\n * @param {Object} update - the update object. Must have keys\n * `type`, `payload`.\n */\n applyUpdate(updateSpec) {\n const tx = this._getTransaction(updateSpec);\n const result = this.db.update(updateSpec, tx, this.state);\n const { status, state, payload } = result;\n\n if (status !== SUCCESS) {\n throw new Error(\n `Applying update failed with status ${status}. Payload: ${payload}`\n );\n }\n\n this.state = state;\n\n return payload;\n }\n\n query(querySpec) {\n const result = this.db.query(querySpec, this.state);\n\n this._markAccessedByQuery(querySpec, result);\n\n return result;\n }\n\n _getTransaction(updateSpec) {\n const { withMutations } = this;\n const { action } = updateSpec;\n let { batchToken } = this;\n if ([UPDATE, DELETE].includes(action)) {\n batchToken = getBatchToken();\n }\n return { batchToken, withMutations };\n }\n\n _markAccessedByQuery(querySpec, result) {\n const { table, clauses } = querySpec;\n const { rows } = result;\n\n const { idAttribute } = this[table];\n const accessedIds = new Set(rows.map((row) => row[idAttribute]));\n\n const anyClauseFilteredByPk = clauses.some((clause) => {\n if (!clauseFiltersByAttribute(clause, idAttribute)) {\n return false;\n }\n /**\n * We previously knew which row we wanted to access,\n * so there was no need to scan the entire table.\n */\n accessedIds.add(clause.payload[idAttribute]);\n return true;\n });\n\n const accessedIndexes = [];\n const { indexes } = this.state[table];\n clauses.forEach((clause) => {\n Object.keys(indexes).forEach((attr) => {\n if (!clauseFiltersByAttribute(clause, attr)) {\n return;\n }\n const value = clause.payload[attr];\n accessedIndexes.push([table, attr, value]);\n });\n });\n\n if (anyClauseFilteredByPk) {\n /**\n * The clauses have been ordered so that an indexed one was\n * the first to have been evaluated, and thus only the row\n * with the specified PK value has actually been accessed.\n */\n this.markAccessed(table, accessedIds);\n } else if (accessedIndexes.length) {\n /**\n * At least one clause was optimized using indexes.\n */\n this.markAccessed(table, accessedIds);\n this.markAccessedIndexes(accessedIndexes);\n } else {\n /**\n * At least one clause could not be efficiently optimized\n * or no clause was specified at all.\n */\n this.markFullTableScanned(table);\n }\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Access {@link Session#state} instead.\n */\n getNextState() {\n warnDeprecated(\n \"`Session.prototype.getNextState` has been deprecated. Access \" +\n \"the `Session.prototype.state` property instead.\"\n );\n return this.state;\n }\n\n /**\n * @deprecated\n * The Redux integration API is now decoupled from ORM and Session.<br>\n * See the 0.9 migration guide in the GitHub repo.\n */\n reduce() {\n throw new Error(\n \"`Session.prototype.reduce` has been removed. The Redux integration API \" +\n \"is now decoupled from ORM and Session - see the 0.9 migration guide \" +\n \"in the GitHub repo.\"\n );\n }\n};\n\nexport default Session;\n","import FieldInstallerTemplate from \"./FieldInstallerTemplate\";\n\nimport { reverseFieldErrorMessage } from \"../utils\";\n\n/**\n * Default implementation for the template method in FieldInstallerTemplate.\n * @private\n * @memberof module:fields\n */\nexport class DefaultFieldInstaller extends FieldInstallerTemplate {\n installForwardsDescriptor() {\n Object.defineProperty(\n this.model.prototype,\n this.fieldName,\n this.field.createForwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n\n installForwardsVirtualField() {\n this.model.virtualFields[\n this.fieldName\n ] = this.field.createForwardsVirtualField(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n );\n }\n\n installBackwardsDescriptor() {\n const backwardsDescriptor = Object.getOwnPropertyDescriptor(\n this.toModel.prototype,\n this.backwardsFieldName\n );\n if (backwardsDescriptor) {\n throw new Error(\n reverseFieldErrorMessage(\n this.model.modelName,\n this.fieldName,\n this.toModel.modelName,\n this.backwardsFieldName\n )\n );\n }\n\n // install backwards descriptor\n Object.defineProperty(\n this.toModel.prototype,\n this.backwardsFieldName,\n this.field.createBackwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n\n installBackwardsVirtualField() {\n this.toModel.virtualFields[\n this.backwardsFieldName\n ] = this.field.createBackwardsVirtualField(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n );\n }\n}\n\nexport default DefaultFieldInstaller;\n","/**\n * Defines algorithm for installing a field onto a model and related models.\n * Conforms to the template method behavioral design pattern.\n * @private\n * @memberof module:fields\n */\nexport class FieldInstallerTemplate {\n constructor(opts) {\n this.field = opts.field;\n this.fieldName = opts.fieldName;\n this.model = opts.model;\n this.orm = opts.orm;\n /**\n * the field itself has no knowledge of the model\n * it is being installed upon; we need to inform it\n * that it is a self-referencing field for the field\n * to be able to make better informed decisions\n */\n if (this.field.references(this.model)) {\n this.field.toModelName = \"this\";\n }\n }\n\n get toModel() {\n if (typeof this._toModel === \"undefined\") {\n const { toModelName } = this.field;\n if (!toModelName) {\n this._toModel = null;\n } else if (toModelName === \"this\") {\n this._toModel = this.model;\n } else {\n this._toModel = this.orm.get(toModelName);\n }\n }\n return this._toModel;\n }\n\n get throughModel() {\n if (typeof this._throughModel === \"undefined\") {\n const throughModelName = this.field.getThroughModelName(\n this.fieldName,\n this.model\n );\n if (!throughModelName) {\n this._throughModel = null;\n } else {\n this._throughModel = this.orm.get(throughModelName);\n }\n }\n return this._throughModel;\n }\n\n get backwardsFieldName() {\n return this.field.getBackwardsFieldName(this.model);\n }\n\n run() {\n this.installForwardsDescriptor();\n if (this.field.installsForwardsVirtualField) {\n this.installForwardsVirtualField();\n }\n /**\n * Install a backwards field on a model as a consequence\n * of having installed the forwards field on another model.\n */\n if (this.field.installsBackwardsDescriptor) {\n this.installBackwardsDescriptor();\n }\n if (this.field.installsBackwardsVirtualField) {\n this.installBackwardsVirtualField();\n }\n }\n}\n\nexport default FieldInstallerTemplate;\n","import DefaultFieldInstaller from \"./DefaultFieldInstaller\";\n\n/**\n * @private\n * @memberof module:fields\n */\nexport class Field {\n get installerClass() {\n return DefaultFieldInstaller;\n }\n\n getClass() {\n return this.constructor;\n }\n\n references(model) {\n return false;\n }\n\n getThroughModelName(fieldName, model) {\n return null;\n }\n\n get installsForwardsVirtualField() {\n return false;\n }\n\n get installsBackwardsDescriptor() {\n return false;\n }\n\n get installsBackwardsVirtualField() {\n return false;\n }\n\n get index() {\n return false;\n }\n}\n\nexport default Field;\n","import { normalizeEntity } from \"./utils\";\n\n/**\n * The functions in this file return custom JS property descriptors\n * that are supposed to be assigned to Model fields.\n *\n * Some include the logic to look up models using foreign keys and\n * to add or remove relationships between models.\n *\n * @module descriptors\n * @private\n */\n\n/**\n * Defines a basic non-key attribute.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n */\nfunction attrDescriptor(fieldName) {\n return {\n get() {\n return this._fields[fieldName];\n },\n\n set(value) {\n return this.set(fieldName, value);\n },\n\n enumerable: true,\n configurable: true,\n };\n}\n\n/**\n * Forwards direction of a Foreign Key: returns one object.\n * Also works as {@link .forwardsOneToOneDescriptor|forwardsOneToOneDescriptor}.\n *\n * For `book.author` referencing an `Author` model instance,\n * `fieldName` would be `'author'` and `declaredToModelName` would be `'Author'`.\n * @param {string} fieldName - the name of the field the descriptor will be assigned to.\n * @param {string} declaredToModelName - the name of the model that the field references.\n */\nfunction forwardsManyToOneDescriptor(fieldName, declaredToModelName) {\n return {\n get() {\n const {\n session: { [declaredToModelName]: DeclaredToModel },\n } = this.getClass();\n const { [fieldName]: toId } = this._fields;\n\n return DeclaredToModel.withId(toId);\n },\n set(value) {\n this.update({\n [fieldName]: normalizeEntity(value),\n });\n },\n };\n}\n\n/**\n * Dereferencing foreign keys in {@link module:fields.oneToOne|oneToOne}\n * relationships works the same way as in many-to-one relationships:\n * just look up the related model.\n *\n * For example, a human face tends to have a single nose.\n * So if we want to resolve `face.nose`, we need to\n * look up the `Nose` that has the primary key that `face` references.\n *\n * @see {@link module:descriptors~forwardsManyToOneDescriptor|forwardsManyToOneDescriptor}\n */\nfunction forwardsOneToOneDescriptor(...args) {\n return forwardsManyToOneDescriptor(...args);\n}\n\n/**\n * Here we resolve 1-to-1 relationships starting at the model on which the\n * field was not installed. This means we need to find the instance of the\n * other model whose {@link module:fields.oneToOne|oneToOne} FK field contains the current model's primary key.\n *\n * @param {string} declaredFieldName - the name of the field referencing the current model.\n * @param {string} declaredFromModelName - the name of the other model.\n */\nfunction backwardsOneToOneDescriptor(declaredFieldName, declaredFromModelName) {\n return {\n get() {\n const {\n session: { [declaredFromModelName]: DeclaredFromModel },\n } = this.getClass();\n\n return DeclaredFromModel.get({\n [declaredFieldName]: this.getId(),\n });\n },\n set() {\n throw new Error(\"Can't mutate a reverse one-to-one relation.\");\n },\n };\n}\n\n/**\n * The backwards direction of a n-to-1 relationship (i.e. 1-to-n),\n * meaning this will return an a collection (`QuerySet`) of model instances.\n *\n * An example would be `author.books` referencing all instances of\n * the `Book` model that reference the author using `fk()`.\n */\nfunction backwardsManyToOneDescriptor(\n declaredFieldName,\n declaredFromModelName\n) {\n return {\n get() {\n const {\n session: { [declaredFromModelName]: DeclaredFromModel },\n } = this.getClass();\n\n return DeclaredFromModel.filter({\n [declaredFieldName]: this.getId(),\n });\n },\n set() {\n throw new Error(\"Can't mutate a reverse many-to-one relation.\");\n },\n };\n}\n\n/**\n * This descriptor is assigned to both sides of a many-to-many relationship.\n * To indicate the backwards direction pass `true` for `reverse`.\n */\nfunction manyToManyDescriptor(\n declaredFromModelName,\n declaredToModelName,\n throughModelName,\n throughFields,\n reverse\n) {\n return {\n get() {\n const {\n session: {\n [declaredFromModelName]: DeclaredFromModel,\n [declaredToModelName]: DeclaredToModel,\n [throughModelName]: ThroughModel,\n },\n } = this.getClass();\n\n const ThisModel = reverse ? DeclaredToModel : DeclaredFromModel;\n const OtherModel = reverse ? DeclaredFromModel : DeclaredToModel;\n\n const thisReferencingField = reverse\n ? throughFields.to\n : throughFields.from;\n const otherReferencingField = reverse\n ? throughFields.from\n : throughFields.to;\n\n const thisId = this.getId();\n\n const throughQs = ThroughModel.filter({\n [thisReferencingField]: thisId,\n });\n\n /**\n * all IDs of instances of the other model that are\n * referenced by any instance of the current model\n */\n const referencedOtherIds = new Set(\n throughQs.toRefArray().map((obj) => obj[otherReferencingField])\n );\n\n /**\n * selects all instances of other model that are referenced\n * by any instance of the current model\n */\n const qs = OtherModel.filter((otherModelInstance) =>\n referencedOtherIds.has(\n otherModelInstance[OtherModel.idAttribute]\n )\n );\n\n /**\n * Allows adding OtherModel instances to be referenced by the current instance.\n *\n * E.g. Book.first().authors.add(1, 2) would add the authors with IDs 1 and 2\n * to the first book's list of referenced authors.\n *\n * @return undefined\n */\n qs.add = function add(...entities) {\n const idsToAdd = new Set(entities.map(normalizeEntity));\n\n const existingQs = throughQs.filter((through) =>\n idsToAdd.has(through[otherReferencingField])\n );\n\n if (existingQs.exists()) {\n const existingIds = existingQs\n .toRefArray()\n .map((through) => through[otherReferencingField]);\n\n throw new Error(\n `Tried to add already existing ${OtherModel.modelName} id(s) ${existingIds} to the ${ThisModel.modelName} instance with id ${thisId}`\n );\n }\n\n idsToAdd.forEach((id) => {\n ThroughModel.create({\n [otherReferencingField]: id,\n [thisReferencingField]: thisId,\n });\n });\n };\n\n /**\n * Removes references to all OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.clear() would cause the first book's list\n * of referenced authors to become empty.\n *\n * @return undefined\n */\n qs.clear = function clear() {\n throughQs.delete();\n };\n\n /**\n * Removes references to all passed OtherModel instances from the current model.\n *\n * E.g. Book.first().authors.remove(1, 2) would cause the authors with\n * IDs 1 and 2 to no longer be referenced by the first book.\n *\n * @return undefined\n */\n qs.remove = function remove(...entities) {\n const idsToRemove = new Set(entities.map(normalizeEntity));\n\n const entitiesToDelete = throughQs.filter((through) =>\n idsToRemove.has(through[otherReferencingField])\n );\n\n if (entitiesToDelete.count() !== idsToRemove.size) {\n // Tried deleting non-existing entities.\n const entitiesToDeleteIds = entitiesToDelete\n .toRefArray()\n .map((through) => through[otherReferencingField]);\n\n const unexistingIds = [...idsToRemove].filter(\n (id) => !entitiesToDeleteIds.includes(id)\n );\n\n throw new Error(\n `Tried to delete non-existing ${OtherModel.modelName} id(s) ${unexistingIds} from the ${ThisModel.modelName} instance with id ${thisId}`\n );\n }\n\n entitiesToDelete.delete();\n };\n\n return qs;\n },\n\n set() {\n throw new Error(\n \"Tried setting a M2M field. Please use the related QuerySet methods add, remove and clear.\"\n );\n },\n };\n}\n\nexport {\n attrDescriptor,\n forwardsManyToOneDescriptor,\n forwardsOneToOneDescriptor,\n backwardsOneToOneDescriptor,\n backwardsManyToOneDescriptor,\n manyToManyDescriptor,\n};\n","import Field from \"./Field\";\n\nimport { attrDescriptor } from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class Attribute extends Field {\n constructor(opts) {\n super();\n this.opts = opts || {};\n\n if (this.opts.hasOwnProperty(\"getDefault\")) {\n this.getDefault = this.opts.getDefault;\n }\n }\n\n createForwardsDescriptor(fieldName, model) {\n return attrDescriptor(fieldName);\n }\n}\n\nexport default Attribute;\n","/* eslint-disable max-classes-per-file */\nimport Field from \"./Field\";\nimport DefaultFieldInstaller from \"./DefaultFieldInstaller\";\n\nimport { reverseFieldName, normalizeModelReference } from \"../utils\";\n\n/**\n * @private\n * @memberof module:fields\n */\nexport class RelationalField extends Field {\n constructor(...args) {\n super();\n if (args.length === 1 && typeof args[0] === \"object\") {\n const opts = args[0];\n this.toModelName = normalizeModelReference(opts.to);\n this.relatedName = opts.relatedName;\n this.through = normalizeModelReference(opts.through);\n this.throughFields = opts.throughFields;\n this.as = opts.as;\n } else {\n [this.toModelName, this.relatedName] = [\n normalizeModelReference(args[0]),\n args[1],\n ];\n }\n }\n\n getBackwardsFieldName(model) {\n return this.relatedName || reverseFieldName(model.modelName);\n }\n\n createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField(model.modelName, fieldName);\n }\n\n get installsBackwardsVirtualField() {\n return true;\n }\n\n get installsBackwardsDescriptor() {\n return true;\n }\n\n references(model) {\n return this.toModelName === model.modelName;\n }\n\n get installerClass() {\n return class AliasedForwardsDescriptorInstaller extends DefaultFieldInstaller {\n installForwardsDescriptor() {\n Object.defineProperty(\n this.model.prototype,\n this.field.as || this.fieldName, // use supplied name if possible\n this.field.createForwardsDescriptor(\n this.fieldName,\n this.model,\n this.toModel,\n this.throughModel\n )\n );\n }\n };\n }\n}\n\nexport default RelationalField;\n","import RelationalField from \"./RelationalField\";\n\nimport {\n forwardsManyToOneDescriptor,\n backwardsManyToOneDescriptor,\n} from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class ForeignKey extends RelationalField {\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return forwardsManyToOneDescriptor(fieldName, toModel.modelName);\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return backwardsManyToOneDescriptor(fieldName, model.modelName);\n }\n\n get index() {\n return true;\n }\n}\n\nexport default ForeignKey;\n","import RelationalField from \"./RelationalField\";\n\nimport { manyToManyDescriptor } from \"../descriptors\";\n\nimport { m2mName, m2mToFieldName, m2mFromFieldName } from \"../utils\";\n\n/**\n * @memberof module:fields\n */\nexport class ManyToMany extends RelationalField {\n getDefault() {\n return [];\n }\n\n getThroughModelName(fieldName, model) {\n return this.through || m2mName(model.modelName, fieldName);\n }\n\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return manyToManyDescriptor(\n model.modelName,\n toModel.modelName,\n throughModel.modelName,\n this.getThroughFields(fieldName, model, toModel, throughModel),\n false\n );\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return manyToManyDescriptor(\n model.modelName,\n toModel.modelName,\n throughModel.modelName,\n this.getThroughFields(fieldName, model, toModel, throughModel),\n true\n );\n }\n\n createBackwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: model.modelName,\n relatedName: fieldName,\n through: throughModel.modelName,\n throughFields: this.getThroughFields(\n fieldName,\n model,\n toModel,\n throughModel\n ),\n });\n }\n\n createForwardsVirtualField(fieldName, model, toModel, throughModel) {\n const ThisField = this.getClass();\n return new ThisField({\n to: toModel.modelName,\n relatedName: fieldName,\n through: this.through,\n throughFields: this.getThroughFields(\n fieldName,\n model,\n toModel,\n throughModel\n ),\n as: this.as,\n });\n }\n\n get installsForwardsVirtualField() {\n return true;\n }\n\n getThroughFields(fieldName, model, toModel, throughModel) {\n if (this.throughFields) {\n const [fieldAName, fieldBName] = this.throughFields;\n const fieldA = throughModel.fields[fieldAName];\n return {\n to: fieldA.references(toModel) ? fieldAName : fieldBName,\n from: fieldA.references(toModel) ? fieldBName : fieldAName,\n };\n }\n\n if (model.modelName === toModel.modelName) {\n /**\n * we have no way of determining the relationship's\n * direction here, so we need to assume that the user\n * did not use a custom through model\n * see ORM#registerManyToManyModelsFor\n */\n return {\n to: m2mToFieldName(toModel.modelName),\n from: m2mFromFieldName(model.modelName),\n };\n }\n\n /**\n * determine which field references which model\n * and infer the directions from that\n */\n const throughModelFieldReferencing = (otherModel) =>\n Object.keys(throughModel.fields).find((someFieldName) =>\n throughModel.fields[someFieldName].references(otherModel)\n );\n\n return {\n to: throughModelFieldReferencing(toModel),\n from: throughModelFieldReferencing(model),\n };\n }\n}\n\nexport default ManyToMany;\n","import RelationalField from \"./RelationalField\";\n\nimport {\n forwardsOneToOneDescriptor,\n backwardsOneToOneDescriptor,\n} from \"../descriptors\";\n\n/**\n * @memberof module:fields\n */\nexport class OneToOne extends RelationalField {\n getBackwardsFieldName(model) {\n return this.relatedName || model.modelName.toLowerCase();\n }\n\n createForwardsDescriptor(fieldName, model, toModel, throughModel) {\n return forwardsOneToOneDescriptor(fieldName, toModel.modelName);\n }\n\n createBackwardsDescriptor(fieldName, model, toModel, throughModel) {\n return backwardsOneToOneDescriptor(fieldName, model.modelName);\n }\n}\n\nexport default OneToOne;\n","import Attribute from \"./Attribute\";\nimport ForeignKey from \"./ForeignKey\";\nimport ManyToMany from \"./ManyToMany\";\nimport OneToOne from \"./OneToOne\";\n\n/**\n * Contains the logic for how fields on {@link Model}s work\n * and which descriptors must be installed.\n *\n * If your goal is to define fields on a Model class,\n * please use the more convenient methods {@link attr},\n * {@link fk}, {@link many} and {@link oneToOne}.\n *\n * @module fields\n */\n\n/**\n * Defines a value attribute on the model.\n * Though not required, it is recommended to define this for each non-foreign key you wish to use.\n * Getters and setters need to be defined on each Model\n * instantiation for undeclared data fields, which is slower.\n * You can use the optional `getDefault` parameter to fill in unpassed values\n * to {@link Model.create}, such as for generating ID's with UUID:\n *\n * ```javascript\n * import getUUID from 'your-uuid-package-of-choice';\n *\n * fields = {\n * id: attr({ getDefault: () => getUUID() }),\n * title: attr(),\n * }\n * ```\n *\n * @param {Object} [opts]\n * @param {Function} [opts.getDefault] - If you give a function here, its return\n * value from calling with zero arguments will\n * be used as the value when creating a new Model\n * instance with {@link Model#create} if the field\n * value is not passed.\n * @return {Attribute}\n */\nfunction attr(opts) {\n return new Attribute(opts);\n}\n\n/**\n * Defines a foreign key on a model, which points\n * to a single entity on another model.\n *\n * You can pass arguments as either a single object,\n * or two arguments.\n *\n * If you pass two arguments, the first one is the name\n * of the Model the foreign key is pointing to, and\n * the second one is an optional related name, which will\n * be used to access the Model the foreign key\n * is being defined from, from the target Model.\n *\n * If the related name is not passed, it will be set as\n * `${toModelName}Set`.\n *\n * If you pass an object to `fk`, it has to be in the form\n *\n * ```javascript\n * fields = {\n * author: fk({ to: 'Author', relatedName: 'books' })\n * }\n * ```\n *\n * Which is equal to\n *\n * ```javascript\n * fields = {\n * author: fk('Author', 'books'),\n * }\n * ```\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access\n * a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ForeignKey}\n */\nfunction fk(...args) {\n return new ForeignKey(...args);\n}\n\n/**\n * Defines a many-to-many relationship between\n * this (source) and another (target) model.\n *\n * The relationship is modeled with an extra model called the through model.\n * The through model has foreign keys to both the source and target models.\n *\n * You can define your own through model if you want to associate more information\n * to the relationship. A custom through model must have at least two foreign keys,\n * one pointing to the source Model, and one pointing to the target Model.\n *\n * Like `fk`, this function accepts one or two string arguments specifying the other\n * Model and the related name, or a single object argument that allows you to pass\n * a custom through model.\n *\n * If you have more than one foreign key pointing to a source or target Model in the\n * through Model, you must pass the option `throughFields`, which is an array of two\n * strings, where the strings are the field names that identify the foreign keys to\n * be used for the many-to-many relationship. Redux-ORM will figure out which field name\n * points to which model by checking the \"through model\" definition.\n *\n * ```javascript\n * class Authorship extends Model {}\n * Authorship.modelName = 'Authorship';\n * Authorship.fields = {\n * author: fk('Author', 'authorships'),\n * book: fk('Book', 'authorships'),\n * };\n *\n * class Author extends Model {}\n * Author.modelName = 'Author';\n * Author.fields = {\n * books: many({\n * to: 'Book',\n * relatedName: 'authors',\n * through: 'Authorship',\n *\n * // here this is optional: Redux-ORM can figure\n * // out the through fields itself since the two\n * // foreign key fields point to different Models\n * throughFields: ['author', 'book'],\n * })\n * };\n *\n * class Book extends Model {}\n * Book.modelName = 'Book';\n * ```\n *\n * You should only define the many-to-many relationship on one side. In the\n * above case of Authors to Books through Authorships, the relationship is\n * defined only on the Author model.\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string|Class<Model>} [options.through] - The through Model class or its `modelName`\n * attribute. It must declare at least one\n * foreign key to both source and target models.\n * If not supplied, Redux-ORM will generate one.\n * @param {string[]} [options.throughFields] - Must be supplied only when a custom through\n * Model has more than one foreign key pointing to\n * either the source or target mode. In this case\n * Redux-ORM can't figure out the correct fields for\n * you, you must provide them. The supplied array should\n * have two elements that are the field names for the\n * through fields you want to declare the many-to-many\n * relationship with. The order doesn't matter;\n * Redux-ORM will figure out which field points to\n * the source Model and which to the target Model.\n * @param {string} [options.relatedName] - The attribute used to access a QuerySet for all\n * source models that reference the respective target\n * Model's instance.\n * @param {string} [relatedName] - If you didn't pass an object as the first argument,\n * this is the property name that will be used to\n * access a QuerySet for all source models that reference\n * the respective target Model's instance.\n * @return {ManyToMany}\n */\nfunction many(...args) {\n return new ManyToMany(...args);\n}\n\n/**\n * Defines a one-to-one relationship. In database terms, this is a foreign key with the\n * added restriction that only one entity can point to single target entity.\n *\n * The arguments are the same as with `fk`. If `relatedName` is not supplied,\n * the source model name in lowercase will be used. Note that with the one-to-one\n * relationship, the `relatedName` should be in singular, not plural.\n *\n *\n * @param {string|Class<Model>|Object} options - The target Model class, its `modelName`\n * attribute or an options object that\n * contains either as the `to` key.\n * @param {string|Class<Model>} options.to - The target Model class or its `modelName` attribute.\n * @param {string} [options.as] - Name for the new accessor defined for this field. If you don't\n * supply this, the key that this field is defined under will be\n * overridden.\n * @param {string} [options.relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance.\n * @param {string} [relatedName] - The property name that will be used to access the source\n * model instance referencing the target model instance\n * @return {OneToOne}\n */\nfunction oneToOne(...args) {\n return new OneToOne(...args);\n}\n\nexport { fk, attr, many, oneToOne };\n","import Session from \"./Session\";\nimport QuerySet from \"./QuerySet\";\n\nimport { attr } from \"./fields\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\nimport OneToOne from \"./fields/OneToOne\";\n\nimport { CREATE, UPDATE, DELETE, FILTER } from \"./constants\";\nimport {\n normalizeEntity,\n arrayDiffActions,\n objectShallowEquals,\n warnDeprecated,\n m2mName,\n} from \"./utils\";\n\n/**\n * Generates a query specification to get the instance's\n * corresponding table row using its primary key.\n *\n * @private\n * @returns {Object}\n */\nfunction getByIdQuery(modelInstance) {\n const modelClass = modelInstance.getClass();\n const { idAttribute, modelName } = modelClass;\n\n return {\n table: modelName,\n clauses: [\n {\n type: FILTER,\n payload: {\n [idAttribute]: modelInstance.getId(),\n },\n },\n ],\n };\n}\n\n/**\n * The heart of an ORM, the data model.\n *\n * The fields you specify to the Model will be used to generate\n * a schema to the database, related property accessors, and\n * possibly through models.\n *\n * In each {@link Session} you instantiate from an {@link ORM} instance,\n * you will receive a session-specific subclass of this Model. The methods\n * you define here will be available to you in sessions.\n *\n * An instance of {@link Model} represents a record in the database, though\n * it is possible to generate multiple instances from the same record in the database.\n *\n * To create data models in your schema, subclass {@link Model}. To define\n * information about the data model, override static class methods. Define instance\n * logic by defining prototype methods (without `static` keyword).\n */\nconst Model = class Model {\n /**\n * Creates a Model instance from it's properties.\n * Don't use this to create a new record; Use the static method {@link Model#create}.\n * @param {Object} props - the properties to instantiate with\n */\n constructor(props) {\n this._initFields(props);\n }\n\n _initFields(props) {\n const propsObj = Object(props);\n this._fields = { ...propsObj };\n\n Object.keys(propsObj).forEach((fieldName) => {\n // In this case, we got a prop that wasn't defined as a field.\n // Assuming it's an arbitrary data field, making an instance-specific\n // descriptor for it.\n // Using the in operator as the property could be defined anywhere\n // on the prototype chain.\n if (!(fieldName in this)) {\n Object.defineProperty(this, fieldName, {\n get: () => this._fields[fieldName],\n set: (value) => this.set(fieldName, value),\n configurable: true,\n enumerable: true,\n });\n }\n });\n }\n\n static toString() {\n return `ModelClass: ${this.modelName}`;\n }\n\n /**\n * Returns the options object passed to the database for the table that represents\n * this Model class.\n *\n * Returns an empty object by default, which means the database\n * will use default options. You can either override this function to return the options\n * you want to use, or assign the options object as a static property of the same name to the\n * Model class.\n *\n * @return {Object} the options object passed to the database for the table\n * representing this Model class.\n */\n static options() {\n return {};\n }\n\n /**\n * Manually mark individual instances as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<*>} ids - Array of primary key values\n * @return {undefined}\n */\n static markAccessed(ids) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark rows of the ${this.modelName} model as accessed without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markAccessed\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markAccessed(this.modelName, ids);\n }\n\n /**\n * Manually mark this model's table as scanned.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @return {undefined}\n */\n static markFullTableScanned() {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark the ${this.modelName} model as full table scanned without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markFullTableScanned\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markFullTableScanned(this.modelName);\n }\n\n /**\n * Manually mark indexes as accessed.\n * This allows invalidating selector memoization within mutable sessions.\n *\n * @param {Array.<Array.<*,*>>} indexes - Array of column-value pairs\n * @return {undefined}\n */\n static markAccessedIndexes(indexes) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to mark indexes for the ${this.modelName} model as accessed without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].markAccessedIndexes\\` instead.`,\n ].join(\"\")\n );\n }\n this.session.markAccessedIndexes(\n indexes.map(([attribute, value]) => [\n this.modelName,\n attribute,\n value,\n ])\n );\n }\n\n /**\n * Returns the id attribute of this {@link Model}.\n *\n * @return {string} The id attribute of this {@link Model}.\n */\n static get idAttribute() {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to get the ${this.modelName} model's id attribute without a session. `,\n \"Create a session using `session = orm.session()` and access \",\n `\\`session[\"${this.modelName}\"].idAttribute\\` instead.`,\n ].join(\"\")\n );\n }\n return this.session.db.describe(this.modelName).idAttribute;\n }\n\n /**\n * Connect the model class to a {@link Session}.\n *\n * @private\n * @param {Session} session - The session to connect to.\n */\n static connect(session) {\n if (!(session instanceof Session)) {\n throw new Error(\n \"A model can only be connected to instances of Session.\"\n );\n }\n this._session = session;\n }\n\n /**\n * Get the current {@link Session} instance.\n *\n * @private\n * @return {Session} The current {@link Session} instance.\n */\n static get session() {\n return this._session;\n }\n\n /**\n * Returns an instance of the model's `querySetClass` field.\n * By default, this will be an empty {@link QuerySet}.\n *\n * @return {Object} An instance of the model's `querySetClass`.\n */\n static getQuerySet() {\n const { querySetClass: QuerySetClass } = this;\n return new QuerySetClass(this);\n }\n\n /**\n * @return {undefined}\n */\n static invalidateClassCache() {\n this.isSetUp = undefined;\n this.virtualFields = {};\n }\n\n /**\n * @see {@link Model.getQuerySet}\n */\n static get query() {\n return this.getQuerySet();\n }\n\n /**\n * Returns parameters to be passed to {@link Table} instance.\n *\n * @private\n */\n static tableOptions() {\n if (typeof this.backend === \"function\") {\n warnDeprecated(\n \"`Model.backend` has been deprecated. Please rename to `.options`.\"\n );\n return this.backend();\n }\n if (this.backend) {\n warnDeprecated(\n \"`Model.backend` has been deprecated. Please rename to `.options`.\"\n );\n return this.backend;\n }\n if (typeof this.options === \"function\") {\n return this.options();\n }\n return this.options;\n }\n\n /**\n * Creates a new record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the new {@link Model}'s properties.\n * @return {Model} a new {@link Model} instance.\n */\n static create(userProps) {\n if (typeof this._session === \"undefined\") {\n throw new Error(\n [\n `Tried to create a ${this.modelName} model instance without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].create\\` instead.`,\n ].join(\"\")\n );\n }\n const props = { ...userProps };\n\n const m2mRelations = {};\n\n const declaredFieldNames = Object.keys(this.fields);\n const declaredVirtualFieldNames = Object.keys(this.virtualFields);\n\n declaredFieldNames.forEach((key) => {\n const field = this.fields[key];\n const valuePassed = userProps.hasOwnProperty(key);\n if (!(field instanceof ManyToMany)) {\n if (valuePassed) {\n const value = userProps[key];\n props[key] = normalizeEntity(value);\n } else if (field.getDefault) {\n props[key] = field.getDefault(userProps);\n }\n } else if (valuePassed) {\n // Save for later processing\n m2mRelations[key] = userProps[key];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete props[key];\n }\n }\n });\n\n // add backward many-many if required\n declaredVirtualFieldNames.forEach((key) => {\n if (!m2mRelations.hasOwnProperty(key)) {\n const field = this.virtualFields[key];\n if (\n userProps.hasOwnProperty(key) &&\n field instanceof ManyToMany\n ) {\n // If a value is supplied for a ManyToMany field,\n // discard them from props and save for later processing.\n m2mRelations[key] = userProps[key];\n delete props[key];\n }\n }\n });\n\n const newEntry = this.session.applyUpdate({\n action: CREATE,\n table: this.modelName,\n payload: props,\n });\n\n const ThisModel = this;\n const instance = new ThisModel(newEntry);\n instance._refreshMany2Many(m2mRelations); // eslint-disable-line no-underscore-dangle\n return instance;\n }\n\n /**\n * Creates a new or update existing record in the database, instantiates a {@link Model} and returns it.\n *\n * If you pass values for many-to-many fields, instances are created on the through\n * model as well.\n *\n * @param {Object} userProps - the required {@link Model}'s properties.\n * @return {Model} a {@link Model} instance.\n */\n static upsert(userProps) {\n if (typeof this.session === \"undefined\") {\n throw new Error(\n [\n `Tried to upsert a ${this.modelName} model instance without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].upsert\\` instead.`,\n ].join(\"\")\n );\n }\n\n const { idAttribute } = this;\n if (userProps.hasOwnProperty(idAttribute)) {\n const id = userProps[idAttribute];\n if (this.idExists(id)) {\n const model = this.withId(id);\n model.update(userProps);\n return model;\n }\n }\n\n return this.create(userProps);\n }\n\n /**\n * Returns a {@link Model} instance for the object with id `id`.\n * Returns `null` if the model has no instance with id `id`.\n *\n * You can use {@link Model#idExists} to check for existence instead.\n *\n * @param {*} id - the `id` of the object to get\n * @throws If object with id `id` doesn't exist\n * @return {Model|null} {@link Model} instance with id `id`\n */\n static withId(id) {\n return this.get({\n [this.idAttribute]: id,\n });\n }\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n *\n * @since 0.11.0\n */\n static idExists(id) {\n return this.exists({\n [this.idAttribute]: id,\n });\n }\n\n /**\n * Returns a boolean indicating if an entity\n * with the given props exists in the state.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n */\n static exists(lookupObj) {\n if (typeof this.session === \"undefined\") {\n throw new Error(\n [\n `Tried to check if a ${this.modelName} model instance exists without a session. `,\n \"Create a session using `session = orm.session()` and call \",\n `\\`session[\"${this.modelName}\"].exists\\` instead.`,\n ].join(\"\")\n );\n }\n\n return Boolean(this._findDatabaseRows(lookupObj).length);\n }\n\n /**\n * Gets the {@link Model} instance that matches properties in `lookupObj`.\n * Throws an error if {@link Model} if multiple records match\n * the properties.\n *\n * @param {Object} lookupObj - the properties used to match a single entity.\n * @throws {Error} If more than one entity matches the properties in `lookupObj`.\n * @return {Model} a {@link Model} instance that matches the properties in `lookupObj`.\n */\n static get(lookupObj) {\n const ThisModel = this;\n\n const rows = this._findDatabaseRows(lookupObj);\n if (rows.length === 0) {\n return null;\n }\n if (rows.length > 1) {\n throw new Error(\n `Expected to find a single row in \\`${this.modelName}.get\\`. Found ${rows.length}.`\n );\n }\n\n return new ThisModel(rows[0]);\n }\n\n /**\n * Gets the {@link Model} class or subclass constructor (the class that\n * instantiated this instance).\n *\n * @return {Model} The {@link Model} class or subclass constructor used to instantiate\n * this instance.\n */\n getClass() {\n return this.constructor;\n }\n\n /**\n * Gets the id value of the current instance by looking up the id attribute.\n * @return {*} The id value of the current instance.\n */\n getId() {\n return this._fields[this.getClass().idAttribute];\n }\n\n /**\n * Returns a reference to the plain JS object in the store.\n * It contains all the properties that you pass when creating the model,\n * except for primary keys of many-to-many relationships with a custom accessor.\n *\n * Make sure never to mutate this.\n *\n * @return {Object} a reference to the plain JS object in the store\n */\n get ref() {\n const ThisModel = this.getClass();\n\n // eslint-disable-next-line no-underscore-dangle\n return ThisModel._findDatabaseRows({\n [ThisModel.idAttribute]: this.getId(),\n })[0];\n }\n\n /**\n * Finds all rows in this model's table that match the given `lookupObj`.\n * If no `lookupObj` is passed, all rows in the model's table will be returned.\n *\n * @param {*} props - a key-value that {@link Model} instances should have to be considered as existing.\n * @return {Boolean} a boolean indicating if entity with `props` exists in the state\n * @private\n */\n static _findDatabaseRows(lookupObj) {\n const querySpec = {\n table: this.modelName,\n };\n if (lookupObj) {\n querySpec.clauses = [\n {\n type: FILTER,\n payload: lookupObj,\n },\n ];\n }\n return this.session.query(querySpec).rows;\n }\n\n /**\n * Returns a string representation of the {@link Model} instance.\n *\n * @return {string} A string representation of this {@link Model} instance.\n */\n toString() {\n const ThisModel = this.getClass();\n const className = ThisModel.modelName;\n const fieldNames = Object.keys(ThisModel.fields);\n const fields = fieldNames\n .map((fieldName) => {\n const field = ThisModel.fields[fieldName];\n if (field instanceof ManyToMany) {\n const ids = this[fieldName]\n .toModelArray()\n .map((model) => model.getId());\n return `${fieldName}: [${ids.join(\", \")}]`;\n }\n const val = this._fields[fieldName];\n return `${fieldName}: ${val}`;\n })\n .join(\", \");\n return `${className}: {${fields}}`;\n }\n\n /**\n * Returns a boolean indicating if `otherModel` equals this {@link Model} instance.\n * Equality is determined by shallow comparing their attributes.\n *\n * This equality is used when you call {@link Model#update}.\n * You can prevent model updates by returning `true` here.\n * However, a model will always be updated if its relationships are changed.\n *\n * @param {Model} otherModel - a {@link Model} instance to compare\n * @return {Boolean} a boolean indicating if the {@link Model} instance's are equal.\n */\n equals(otherModel) {\n // eslint-disable-next-line no-underscore-dangle\n return objectShallowEquals(this._fields, otherModel._fields);\n }\n\n /**\n * Updates a property name to given value for this {@link Model} instance.\n * The values are immediately committed to the database.\n *\n * @param {string} propertyName - name of the property to set\n * @param {*} value - value assigned to the property\n * @return {undefined}\n */\n set(propertyName, value) {\n this.update({\n [propertyName]: value,\n });\n }\n\n /**\n * Assigns multiple fields and corresponding values to this {@link Model} instance.\n * The updates are immediately committed to the database.\n *\n * @param {Object} userMergeObj - an object that will be merged with this instance.\n * @return {undefined}\n */\n update(userMergeObj) {\n const ThisModel = this.getClass();\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error(\n [\n `Tried to update a ${ThisModel.modelName} model instance without a session. `,\n \"You cannot call `.update` on an instance that you did not receive from the database.\",\n ].join(\"\")\n );\n }\n\n const mergeObj = { ...userMergeObj };\n\n const { fields, virtualFields } = ThisModel;\n\n const m2mRelations = {};\n\n // If an array of entities or id's is supplied for a\n // many-to-many related field, clear the old relations\n // and add the new ones.\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const mergeKey in mergeObj) {\n const isRealField = fields.hasOwnProperty(mergeKey);\n\n if (isRealField) {\n const field = fields[mergeKey];\n\n if (field instanceof ForeignKey || field instanceof OneToOne) {\n // update one-one/fk relations\n mergeObj[mergeKey] = normalizeEntity(mergeObj[mergeKey]);\n } else if (field instanceof ManyToMany) {\n // field is forward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n\n if (!field.as) {\n /**\n * The relationship does not have an accessor\n * Discard the value from props as the field will be populated later with instances\n * from the target models when refreshing the M2M relations.\n * If the relationship does have an accessor (`as`) field then we do want to keep this\n * original value in the props to expose the raw list of IDs from the instance.\n */\n delete mergeObj[mergeKey];\n }\n }\n } else if (virtualFields.hasOwnProperty(mergeKey)) {\n const field = virtualFields[mergeKey];\n if (field instanceof ManyToMany) {\n // field is backward relation\n m2mRelations[mergeKey] = mergeObj[mergeKey];\n delete mergeObj[mergeKey];\n }\n }\n }\n\n const mergedFields = {\n ...this._fields,\n ...mergeObj,\n };\n\n const updatedModel = new ThisModel(mergedFields);\n // only update fields if they have changed (referentially)\n if (!this.equals(updatedModel)) {\n this._initFields(mergedFields);\n ThisModel.session.applyUpdate({\n action: UPDATE,\n query: getByIdQuery(this),\n payload: mergeObj,\n });\n }\n\n // update virtual fields\n this._refreshMany2Many(m2mRelations);\n }\n\n /**\n * Updates {@link Model} instance attributes to reflect the\n * database state in the current session.\n * @return {undefined}\n */\n refreshFromState() {\n this._initFields(this.ref);\n }\n\n /**\n * Deletes the record for this {@link Model} instance.\n * You'll still be able to access fields and values on the instance.\n *\n * @return {undefined}\n */\n delete() {\n const ThisModel = this.getClass();\n if (typeof ThisModel.session === \"undefined\") {\n throw new Error(\n [\n `Tried to delete a ${ThisModel.modelName} model instance without a session. `,\n \"You cannot call `.delete` on an instance that you did not receive from the database.\",\n ].join(\"\")\n );\n }\n\n this._onDelete();\n ThisModel.session.applyUpdate({\n action: DELETE,\n query: getByIdQuery(this),\n });\n }\n\n /**\n * Update many-many relations for model.\n * @param relations\n * @return undefined\n * @private\n */\n _refreshMany2Many(relations) {\n const ThisModel = this.getClass();\n const { fields, virtualFields, modelName } = ThisModel;\n\n Object.keys(relations).forEach((name) => {\n const reverse = !fields.hasOwnProperty(name);\n const field = virtualFields[name];\n const values = relations[name];\n\n if (!Array.isArray(values)) {\n throw new TypeError(\n `Failed to resolve many-to-many relationship: ${modelName}[${name}] must be an array (passed: ${values})`\n );\n }\n\n const normalizedNewIds = values.map(normalizeEntity);\n const uniqueIds = [...new Set(normalizedNewIds)];\n\n if (normalizedNewIds.length !== uniqueIds.length) {\n throw new Error(\n `Found duplicate id(s) when passing \"${normalizedNewIds}\" to ${ThisModel.modelName}.${name} value`\n );\n }\n\n const throughModelName =\n field.through || m2mName(ThisModel.modelName, name);\n const ThroughModel = ThisModel.session[throughModelName];\n\n let fromField;\n let toField;\n\n if (!reverse) {\n ({ from: fromField, to: toField } = field.throughFields);\n } else {\n ({ from: toField, to: fromField } = field.throughFields);\n }\n\n const currentIds = ThroughModel.filter(\n (through) => through[fromField] === this[ThisModel.idAttribute]\n )\n .toRefArray()\n .map((ref) => ref[toField]);\n\n const diffActions = arrayDiffActions(currentIds, normalizedNewIds);\n\n if (diffActions) {\n const { delete: idsToDelete, add: idsToAdd } = diffActions;\n if (idsToDelete.length > 0) {\n this[field.as || name].remove(...idsToDelete);\n }\n\n if (idsToAdd.length > 0) {\n this[field.as || name].add(...idsToAdd);\n }\n }\n });\n }\n\n /**\n * @return {undefined}\n * @private\n */\n _onDelete() {\n const { virtualFields } = this.getClass();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in virtualFields) {\n const field = virtualFields[key];\n if (field instanceof ManyToMany) {\n // Delete any many-to-many rows the entity is included in.\n const descriptorKey = field.as || key;\n this[descriptorKey].clear();\n } else if (field instanceof ForeignKey) {\n const relatedQs = this[key];\n if (relatedQs.exists()) {\n relatedQs.update({ [field.relatedName]: null });\n }\n } else if (field instanceof OneToOne) {\n // Set null to any foreign keys or one to ones pointed to\n // this instance.\n if (this[key] !== null) {\n this[key][field.relatedName] = null;\n }\n }\n }\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * Returns a boolean indicating if an entity\n * with the id `id` exists in the state.\n *\n * @param {*} id - a value corresponding to the id attribute of the {@link Model} class.\n * @return {Boolean} a boolean indicating if entity with `id` exists in the state\n * @deprecated Please use {@link Model.idExists} instead.\n */\n static hasId(id) {\n console.warn(\n \"`Model.hasId` has been deprecated. Please use `Model.idExists` instead.\"\n );\n return this.idExists(id);\n }\n\n /**\n * @deprecated See the 0.9 migration guide on the GitHub repo.\n * @throws {Error} Due to deprecation.\n */\n getNextState() {\n throw new Error(\n \"`Model.prototype.getNextState` has been removed. See the 0.9 \" +\n \"migration guide on the GitHub repo.\"\n );\n }\n};\n\nModel.fields = {\n id: attr(),\n};\nModel.virtualFields = {};\nModel.querySetClass = QuerySet;\n\nexport default Model;\n","import ops from \"immutable-ops\";\nimport filter from \"lodash/filter\";\nimport orderBy from \"lodash/orderBy\";\nimport reject from \"lodash/reject\";\nimport sortBy from \"lodash/sortBy\";\n\nimport { EXCLUDE, FILTER, ORDER_BY } from \"../constants\";\nimport { clauseFiltersByAttribute, clauseReducesResultSetSize } from \"../utils\";\n\nconst DEFAULT_TABLE_OPTIONS = {\n idAttribute: \"id\",\n arrName: \"items\",\n mapName: \"itemsById\",\n fields: {},\n};\n\n/**\n * @private\n * @param {*} _currMax - the current max id\n * @param {*} userPassedId - the new id passed to the create action\n *\n * Both may be undefined. The current max id in the case that this is the first Model\n * being created, and the new id if the id was not explicitly passed to the\n * database.\n *\n * @return {Array} the new max id and the id to use to create the new row\n *\n * If the id's are strings, the id must be passed explicitly every time.\n * In this case, the current max id will remain `NaN` due to `Math.max`, but that's fine.\n */\nfunction idSequencer(_currMax, userPassedId) {\n let currMax = _currMax;\n let newMax;\n let newId;\n\n if (currMax === undefined) {\n currMax = -1;\n }\n\n if (userPassedId === undefined) {\n newMax = currMax + 1;\n newId = newMax;\n } else {\n newMax = Math.max(currMax + 1, userPassedId);\n newId = userPassedId;\n }\n\n return [\n newMax, // new max id\n newId, // id to use for row creation\n ];\n}\n\n/**\n * Adapt order directions array to @{lodash.orderBy} API.\n *\n * @private\n *\n * @param {Array<Boolean|'asc'|'desc'>} orders? - an array of optional order query directions as provided to {@Link {QuerySet.orderBy}}\n * @return {Array<'asc'|'desc'>|undefined} A normalized ordering array or undefined if none was provided.\n */\nfunction normalizeOrders(orders) {\n if (orders === undefined) {\n return undefined;\n }\n const convert = (order) => {\n if ([\"desc\", false].includes(order)) {\n return \"desc\";\n }\n return \"asc\";\n };\n return Array.isArray(orders) ? orders.map(convert) : convert(orders);\n}\n\n/**\n * Handles the underlying data structure for a {@link Model} class.\n * @private\n */\nexport class Table {\n /**\n * Creates a new {@link Table} instance.\n * @param {Object} userOpts - options to use.\n * @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.\n * @param {string} [userOpts.arrName=items] - the state attribute where an array of\n * entity id's are stored\n * @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects\n * are stored in a id to entity object\n * map.\n * @param {string} [userOpts.fields={}] - mapping of field key to {@link Field} object\n */\n constructor(userOpts) {\n Object.assign(this, DEFAULT_TABLE_OPTIONS, userOpts);\n }\n\n /**\n * Returns a reference to the object at index `id`\n * in state `branch`.\n *\n * @param {Object} branch - the state\n * @param {Number} id - the id of the object to get\n * @return {Object|undefined} A reference to the raw object in the state or\n * `undefined` if not found.\n */\n accessId(branch, id) {\n return branch[this.mapName][id];\n }\n\n accessIds(branch, ids) {\n const map = branch[this.mapName];\n return ids.map((id) => map[id]);\n }\n\n idExists(branch, id) {\n return branch[this.mapName].hasOwnProperty(id);\n }\n\n accessIdList(branch) {\n return branch[this.arrName];\n }\n\n accessList(branch) {\n return this.accessIds(branch, this.accessIdList(branch));\n }\n\n getMaxId(branch) {\n return this.getMeta(branch, \"maxId\");\n }\n\n setMaxId(tx, branch, newMaxId) {\n return this.setMeta(tx, branch, \"maxId\", newMaxId);\n }\n\n nextId(id) {\n return id + 1;\n }\n\n /**\n * Returns the default state for the data structure.\n * @return {Object} The default state for this {@link ORM} instance's data structure\n */\n getEmptyState() {\n const pkIndex = {\n [this.arrName]: [],\n [this.mapName]: {},\n };\n const attrIndexes = Object.keys(this.fields)\n .filter((attr) => attr !== this.idAttribute)\n .filter((attr) => this.fields[attr].index)\n .reduce(\n (indexes, attr) => ({\n ...indexes,\n [attr]: {},\n }),\n {}\n );\n return {\n ...pkIndex,\n indexes: attrIndexes,\n meta: {},\n };\n }\n\n setMeta(tx, branch, key, value) {\n const { batchToken, withMutations } = tx;\n if (withMutations) {\n const res = ops.mutable.setIn([\"meta\", key], value, branch);\n return res;\n }\n\n return ops.batch.setIn(batchToken, [\"meta\", key], value, branch);\n }\n\n getMeta(branch, key) {\n return branch.meta[key];\n }\n\n query(branch, clauses) {\n if (clauses.length === 0) {\n return this.accessList(branch);\n }\n\n const { idAttribute } = this;\n\n const optimallyOrderedClauses = sortBy(clauses, (clause) => {\n if (clauseFiltersByAttribute(clause, idAttribute)) {\n return 1;\n }\n\n if (clauseReducesResultSetSize(clause)) {\n return 2;\n }\n\n return 3;\n });\n\n const reducer = (rows, clause) => {\n const { type, payload } = clause;\n if (!rows) {\n /**\n * First time this reducer is called during query.\n * This is where we apply query optimizations.\n */\n if (clauseFiltersByAttribute(clause, idAttribute)) {\n /**\n * Payload specified a primary key. Use PK index\n * to look up the single row identified by the PK.\n */\n const id = payload[idAttribute];\n const remainingPayload = Object.keys(payload).reduce(\n (withoutPkAttr, filterAttr) => {\n if (filterAttr !== idAttribute) {\n withoutPkAttr[filterAttr] = payload[filterAttr];\n }\n return withoutPkAttr;\n },\n {}\n );\n const ids = this.idExists(branch, id) ? [id] : [];\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-PK columns.\n * Filter accessed row by remaining payload (if one was found).\n */\n return reducer(this.accessIds(branch, ids), {\n ...clause,\n payload: remainingPayload,\n });\n }\n /**\n * No need to filter these rows any further.\n * The primary key value satisfies this clause's conditions.\n */\n return this.accessIds(branch, ids);\n }\n if (type === FILTER && typeof payload === \"object\") {\n const indexes = Object.entries(branch.indexes);\n const accessedIndexes = [];\n const indexAttrs = [];\n indexes.forEach(([attr, index]) => {\n if (clauseFiltersByAttribute(clause, attr)) {\n /**\n * Payload specified an indexed attribute. Use index\n * to potentially decrease amount of accessed rows.\n */\n if (index.hasOwnProperty(payload[attr])) {\n accessedIndexes.push(index[payload[attr]]);\n indexAttrs.push(attr);\n }\n }\n });\n /**\n * Calculate set of unique PK values corresponding to each\n * foreign key's attribute value. Then retrieve all those rows.\n */\n if (accessedIndexes.length) {\n const lastIndex = accessedIndexes.pop();\n const indexedIds = accessedIndexes.reduce(\n (result, index) => {\n const indexSet = new Set(index);\n return result.filter(\n Set.prototype.has,\n indexSet\n );\n },\n lastIndex\n );\n const remainingPayload = Object.keys(payload).reduce(\n (withoutIndexAttrs, filterAttr) => {\n if (!indexAttrs.includes(filterAttr)) {\n withoutIndexAttrs[filterAttr] =\n payload[filterAttr];\n }\n return withoutIndexAttrs;\n },\n {}\n );\n if (Object.keys(remainingPayload).length) {\n /**\n * Payload has additional, non-indexed columns.\n * Filter indexed rows by remaining payload (if any were found).\n */\n return reducer(this.accessIds(branch, indexedIds), {\n ...clause,\n payload: remainingPayload,\n });\n }\n /**\n * No need to filter these rows any further.\n * The used indexes satisfy this clause's conditions.\n */\n return this.accessIds(branch, indexedIds);\n }\n }\n\n // Give up optimization: Retrieve all rows (full table scan).\n return reducer(this.accessList(branch), clause);\n }\n\n switch (type) {\n case FILTER: {\n return filter(rows, payload);\n }\n case EXCLUDE: {\n return reject(rows, payload);\n }\n case ORDER_BY: {\n const [iteratees, orders] = payload;\n return orderBy(rows, iteratees, normalizeOrders(orders));\n }\n default:\n return rows;\n }\n };\n\n return optimallyOrderedClauses.reduce(reducer, undefined);\n }\n\n /**\n * Returns the data structure including a new object `entry`\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object} entry - the object to insert\n * @return {Object} an object with two keys: `state` and `created`.\n * `state` is the new table state and `created` is the\n * row that was created.\n */\n insert(tx, branch, entry) {\n const { batchToken, withMutations } = tx;\n\n const hasId = entry.hasOwnProperty(this.idAttribute);\n\n let workingState = branch;\n\n // This will not affect string id's.\n const [newMaxId, id] = idSequencer(\n this.getMaxId(branch),\n entry[this.idAttribute]\n );\n workingState = this.setMaxId(tx, branch, newMaxId);\n\n const finalEntry = hasId\n ? entry\n : ops.batch.set(batchToken, this.idAttribute, id, entry);\n\n const indexesToAppendTo = Object.keys(workingState.indexes)\n .filter(\n (fkAttr) =>\n entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null\n )\n .map((fkAttr) => [fkAttr, entry[fkAttr]]);\n\n if (withMutations) {\n ops.mutable.push(id, workingState[this.arrName]);\n ops.mutable.set(id, finalEntry, workingState[this.mapName]);\n // add id to indexes\n indexesToAppendTo.forEach(([attr, value]) => {\n const attrIndex = workingState.indexes[attr];\n if (attrIndex.hasOwnProperty(value)) {\n ops.mutable.push(id, attrIndex[value]);\n } else {\n ops.mutable.set(value, [id], attrIndex);\n }\n });\n return {\n state: workingState,\n created: finalEntry,\n };\n }\n\n const nextIndexes = ops.batch.merge(\n batchToken,\n indexesToAppendTo.reduce(\n (indexMap, [attr, value]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.push(\n batchToken,\n id,\n indexMap[attr][value] || []\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...workingState.indexes }\n ),\n workingState.indexes\n );\n\n const nextState = ops.batch.merge(\n batchToken,\n {\n [this.arrName]: ops.batch.push(\n batchToken,\n id,\n workingState[this.arrName]\n ),\n [this.mapName]: ops.batch.merge(\n batchToken,\n {\n [id]: finalEntry,\n },\n workingState[this.mapName]\n ),\n indexes: nextIndexes,\n },\n workingState\n );\n\n return {\n state: nextState,\n created: finalEntry,\n };\n }\n\n /**\n * Returns the data structure with objects where `rows`\n * are merged with `mergeObj`.\n *\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @param {Object} mergeObj - The object to merge with each row.\n * @return {Object}\n */\n update(tx, branch, rows, mergeObj) {\n const { batchToken, withMutations } = tx;\n\n const mergeObjInto = (row) => {\n const merge = withMutations\n ? ops.mutable.merge\n : ops.batch.merge(batchToken);\n return merge(mergeObj, row);\n };\n\n const set = withMutations ? ops.mutable.set : ops.batch.set(batchToken);\n\n const indexedAttrs = Object.keys(branch.indexes).filter((attr) =>\n mergeObj.hasOwnProperty(attr)\n );\n const indexIdsToAdd = [];\n const indexIdsToDelete = [];\n\n const nextMap = rows.reduce((map, row) => {\n const prevAttrValues = indexedAttrs.reduce(\n (valueMap, attr) => ({\n ...valueMap,\n [attr]: row[attr],\n }),\n {}\n );\n const result = mergeObjInto(row);\n const nextAttrValues = indexedAttrs.reduce(\n (valueMap, attr) => ({\n ...valueMap,\n [attr]: result[attr],\n }),\n {}\n );\n const id = result[this.idAttribute];\n const nextRow = set(id, result, map);\n indexedAttrs.forEach((attr) => {\n const { [attr]: prevValue } = prevAttrValues;\n const { [attr]: nextValue } = nextAttrValues;\n if (prevValue === nextValue) {\n // attribute has not changed, no need to update any index\n return;\n }\n if (prevValue !== null && typeof prevValue !== \"undefined\") {\n // remove id from attribute's index for its old value\n indexIdsToDelete.push([attr, prevValue, id]);\n }\n if (nextValue !== null) {\n // add id to attribute's index for its new value\n indexIdsToAdd.push([attr, nextValue, id]);\n }\n });\n return nextRow;\n }, branch[this.mapName]);\n\n let nextIndexes = branch.indexes;\n if (withMutations) {\n indexIdsToDelete.forEach(([attr, value, id]) => {\n const arr = nextIndexes[attr][value];\n const idx = arr.indexOf(id);\n ops.mutable.splice(idx, 1, [], arr);\n });\n indexIdsToAdd.forEach(([attr, value, id]) => {\n ops.mutable.push(id, nextIndexes[attr][value]);\n });\n } else {\n if (indexIdsToAdd.length) {\n nextIndexes = ops.batch.merge(\n batchToken,\n indexIdsToAdd.reduce(\n (indexMap, [attr, value, id]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.push(\n batchToken,\n id,\n indexMap[attr][value] || []\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...nextIndexes }\n ),\n nextIndexes\n );\n }\n if (indexIdsToDelete.length) {\n nextIndexes = ops.batch.merge(\n batchToken,\n indexIdsToDelete.reduce(\n (indexMap, [attr, value, id]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n {\n [value]: ops.batch.filter(\n batchToken,\n (rowId) => rowId !== id,\n indexMap[attr][value]\n ),\n },\n indexMap[attr]\n );\n return indexMap;\n },\n { ...nextIndexes }\n ),\n nextIndexes\n );\n }\n }\n\n return ops.batch.merge(\n batchToken,\n {\n [this.mapName]: nextMap,\n indexes: nextIndexes,\n },\n branch\n );\n }\n\n /**\n * Returns the data structure without rows `rows`.\n * @param {Object} tx - transaction info\n * @param {Object} branch - the data structure state\n * @param {Object[]} rows - rows to update\n * @return {Object} the data structure without ids in `idsToDelete`.\n */\n delete(tx, branch, rows) {\n const { batchToken, withMutations } = tx;\n\n const { arrName, mapName } = this;\n const arr = branch[arrName];\n\n const idsToDelete = rows.map((row) => row[this.idAttribute]);\n if (withMutations) {\n idsToDelete.forEach((id) => {\n const idx = arr.indexOf(id);\n ops.mutable.splice(idx, 1, [], arr);\n ops.mutable.omit(id, branch[mapName]);\n });\n // delete ids from all indexes\n Object.values(branch.indexes).forEach((attrIndex) =>\n Object.values(attrIndex).forEach((valueIndex) =>\n idsToDelete.forEach((id) => {\n const idx = valueIndex.indexOf(id);\n if (idx !== -1) {\n ops.mutable.splice(idx, 1, [], valueIndex);\n }\n })\n )\n );\n return branch;\n }\n\n const nextIndexes = ops.batch.merge(\n batchToken,\n Object.entries(branch.indexes).reduce(\n (indexMap, [attr, attrIndex]) => {\n indexMap[attr] = ops.batch.merge(\n batchToken,\n Object.entries(attrIndex).reduce(\n (attrIndexMap, [value, valueIndex]) => {\n attrIndexMap[value] = ops.batch.filter(\n batchToken,\n (id) => !idsToDelete.includes(id),\n valueIndex\n );\n return attrIndexMap;\n },\n { ...indexMap[attr] }\n ),\n indexMap[attr]\n );\n return indexMap;\n },\n { ...branch.indexes }\n ),\n branch.indexes\n );\n\n return ops.batch.merge(\n batchToken,\n {\n [arrName]: ops.batch.filter(\n batchToken,\n (id) => !idsToDelete.includes(id),\n branch[arrName]\n ),\n [mapName]: ops.batch.omit(\n batchToken,\n idsToDelete,\n branch[mapName]\n ),\n indexes: ops.batch.merge(\n batchToken,\n nextIndexes,\n branch.indexes\n ),\n },\n branch\n );\n }\n}\n\nexport default Table;\n","import ops from \"immutable-ops\";\n\nimport { CREATE, UPDATE, DELETE, SUCCESS, STATE_FLAG } from \"../constants\";\n\nimport Table from \"./Table\";\n\nconst BASE_EMPTY_STATE = {};\nObject.defineProperty(BASE_EMPTY_STATE, STATE_FLAG, {\n enumerable: true,\n value: true,\n});\n\n/** @private */\nfunction replaceTableState(tableName, newTableState, tx, state) {\n const { batchToken, withMutations } = tx;\n\n if (withMutations) {\n state[tableName] = newTableState;\n return state;\n }\n\n return ops.batch.set(batchToken, tableName, newTableState, state);\n}\n\n/** @private */\nfunction query(tables, querySpec, state) {\n const { table: tableName, clauses } = querySpec;\n const table = tables[tableName];\n const rows = table.query(state[tableName], clauses);\n return {\n rows,\n };\n}\n\n/** @private */\nfunction update(tables, updateSpec, tx, state) {\n const { action, payload } = updateSpec;\n\n let tableName;\n let nextTableState;\n let resultPayload;\n\n if (action === CREATE) {\n ({ table: tableName } = updateSpec);\n const table = tables[tableName];\n const currTableState = state[tableName];\n const result = table.insert(tx, currTableState, payload);\n nextTableState = result.state;\n resultPayload = result.created;\n } else {\n const { query: querySpec } = updateSpec;\n ({ table: tableName } = querySpec);\n const { rows } = query(tables, querySpec, state);\n\n const table = tables[tableName];\n const currTableState = state[tableName];\n\n if (action === UPDATE) {\n nextTableState = table.update(tx, currTableState, rows, payload);\n // return updated rows\n resultPayload = query(tables, querySpec, state).rows;\n } else if (action === DELETE) {\n nextTableState = table.delete(tx, currTableState, rows);\n // return original rows that we just deleted\n resultPayload = rows;\n } else {\n throw new Error(`Database received unknown update type: ${action}`);\n }\n }\n\n const nextDBState = replaceTableState(tableName, nextTableState, tx, state);\n return {\n status: SUCCESS,\n state: nextDBState,\n payload: resultPayload,\n };\n}\n\n/**\n * @memberof db\n * @param {Object} schemaSpec\n * @return Object database\n */\nexport function createDatabase(schemaSpec) {\n const { tables: tableSpecs } = schemaSpec;\n const tables = Object.entries(tableSpecs).reduce(\n (map, [tableName, tableSpec]) => ({\n ...map,\n [tableName]: new Table(tableSpec),\n }),\n {}\n );\n\n const getEmptyState = () =>\n Object.entries(tables).reduce(\n (map, [tableName, table]) => ({\n ...map,\n [tableName]: table.getEmptyState(),\n }),\n BASE_EMPTY_STATE\n );\n\n return {\n getEmptyState,\n query: query.bind(null, tables),\n update: update.bind(null, tables),\n // Used to inspect the schema.\n describe: (tableName) => tables[tableName],\n };\n}\n\nexport default createDatabase;\n","import { ID_ARG_KEY_SELECTOR } from \"../constants\";\n\nexport default class SelectorSpec {\n constructor({ parent, orm }) {\n this._parent = parent;\n this._orm = orm;\n this.keySelector = ID_ARG_KEY_SELECTOR;\n }\n\n get cachePath() {\n const basePath = this._parent ? this._parent.cachePath : [];\n return [...basePath, this.key];\n }\n\n get orm() {\n return this._orm;\n }\n\n get parent() {\n return this._parent;\n }\n}\n","import SelectorSpec from \"./SelectorSpec\";\n\nexport default class ModelBasedSelectorSpec extends SelectorSpec {\n constructor({ model, ...other }) {\n super(other);\n this._model = model;\n }\n\n get resultFunc() {\n return (session, idArg, ...other) => {\n const { [this._model.modelName]: ModelClass } = session;\n if (typeof idArg === \"undefined\") {\n return ModelClass.all()\n .toModelArray()\n .map((instance) =>\n this.valueForInstance(instance, session, ...other)\n );\n }\n if (Array.isArray(idArg)) {\n return idArg.map((id) =>\n this.valueForInstance(\n ModelClass.withId(id),\n session,\n ...other\n )\n );\n }\n return this.valueForInstance(\n ModelClass.withId(idArg),\n session,\n ...other\n );\n };\n }\n\n get model() {\n return this._model;\n }\n}\n","export default function idArgSelector(state, idArg) {\n return idArg;\n}\n","import ModelBasedSelectorSpec from \"./ModelBasedSelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nexport default class MapSelectorSpec extends ModelBasedSelectorSpec {\n constructor({ field, selector, ...other }) {\n super(other);\n this._field = field;\n this._selector = selector;\n }\n\n createResultFunc(parentSelector) {\n const { idAttribute } = this._parent.toModel;\n return (state, ...other) => {\n /**\n * The parent selector should return a ref array\n * in case of a single ID being passed.\n * Otherwise it should return an array of ref arrays.\n */\n const parentResult = parentSelector(state, ...other);\n const idArg = idArgSelector(state, ...other);\n const single = (refArray) => {\n if (refArray === null) {\n // an intermediate field could not be resolved\n return null;\n }\n return refArray.map((ref) =>\n this._selector(state, ref[idAttribute])\n );\n };\n if (typeof idArg === \"undefined\" || Array.isArray(idArg)) {\n return parentResult.map(single);\n }\n return single(parentResult);\n };\n }\n\n get selector() {\n return this._selector;\n }\n\n set selector(selector) {\n this._selector = selector;\n }\n\n get key() {\n return this._selector;\n }\n}\n","import SelectorSpec from \"./SelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nexport default class ModelSelectorSpec extends SelectorSpec {\n constructor({ model, ...other }) {\n super(other);\n this._model = model;\n }\n\n get key() {\n return this._model.modelName;\n }\n\n get dependencies() {\n return [this._orm, idArgSelector];\n }\n\n get resultFunc() {\n return ({ [this._model.modelName]: ModelClass }, idArg) => {\n if (typeof idArg === \"undefined\") {\n return ModelClass.all().toRefArray();\n }\n if (Array.isArray(idArg)) {\n return idArg.map((id) => {\n const instance = ModelClass.withId(id);\n return instance ? instance.ref : null;\n });\n }\n const instance = ModelClass.withId(idArg);\n return instance ? instance.ref : null;\n };\n }\n\n get model() {\n return this._model;\n }\n}\n","import MapSelectorSpec from \"./MapSelectorSpec\";\nimport ModelSelectorSpec from \"./ModelSelectorSpec\";\nimport ModelBasedSelectorSpec from \"./ModelBasedSelectorSpec\";\nimport idArgSelector from \"./idArgSelector\";\n\nimport QuerySet from \"../QuerySet\";\nimport Model from \"../Model\";\n\nimport ForeignKey from \"../fields/ForeignKey\";\nimport ManyToMany from \"../fields/ManyToMany\";\n\nexport default class FieldSelectorSpec extends ModelBasedSelectorSpec {\n constructor({ field, fieldModel, accessorName, isVirtual, ...other }) {\n super(other);\n this._field = field;\n this._fieldModel = fieldModel;\n this._accessorName = accessorName;\n this._isVirtual = isVirtual;\n }\n\n get key() {\n return this._accessorName;\n }\n\n get dependencies() {\n return [this._orm, idArgSelector];\n }\n\n valueForInstance(instance, session) {\n if (!instance) {\n return null;\n }\n let value;\n if (this._parent instanceof ModelSelectorSpec) {\n /* orm.Model.field */\n value = instance[this._accessorName];\n } else {\n /* orm.Model.field1.field2..fieldN.field */\n const { [this._parent.toModelName]: ParentToModel } = session;\n const parentRef = this._parent.valueForInstance(instance, session);\n const parentInstance = parentRef\n ? new ParentToModel(parentRef)\n : null;\n value = parentInstance ? parentInstance[this._accessorName] : null;\n }\n if (value instanceof Model) {\n return value.ref;\n }\n if (value instanceof QuerySet) {\n return value.toRefArray();\n }\n return value;\n }\n\n map(selector) {\n if (selector instanceof ModelSelectorSpec) {\n if (this.toModelName === selector.model.modelName) {\n throw new Error(\n `Cannot select models in a \\`map()\\` call. If you just want the \\`${this._accessorName}\\` as a ref array then you can simply drop the \\`map()\\`. Otherwise make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n } else {\n throw new Error(\n `Cannot select \\`${selector.model.modelName}\\` models in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n }\n } else if (\n selector instanceof FieldSelectorSpec ||\n selector instanceof MapSelectorSpec\n ) {\n if (this.toModelName !== selector.model.modelName) {\n throw new Error(\n `Cannot select fields of the \\`${selector.model.modelName}\\` model in this \\`map()\\` call. Make sure you're passing a field selector of the form \\`${this.toModelName}.<field>\\` or a custom selector instead.`\n );\n }\n } else if (\n !selector ||\n typeof selector !== \"function\" ||\n !selector.recomputations\n ) {\n throw new Error(\n `\\`map()\\` requires a selector as an input. Received: ${JSON.stringify(\n selector\n )} of type ${typeof selector}`\n );\n }\n if (\n !(this._field instanceof ForeignKey) &&\n !(this._field instanceof ManyToMany)\n ) {\n throw new Error(\"Cannot map selectors for non-collection fields\");\n }\n return new MapSelectorSpec({\n parent: this,\n model: this._model,\n orm: this._orm,\n field: this._field,\n selector,\n });\n }\n\n get toModelName() {\n return this._field.toModelName === \"this\"\n ? this._fieldModel.modelName\n : this._field.toModelName;\n }\n\n get toModel() {\n const db = this._orm.getDatabase();\n return db.describe(this.toModelName);\n }\n}\n","import ForeignKey from \"../fields/ForeignKey\";\nimport ManyToMany from \"../fields/ManyToMany\";\nimport RelationalField from \"../fields/RelationalField\";\n\nimport FieldSelectorSpec from \"./FieldSelectorSpec\";\nimport ModelSelectorSpec from \"./ModelSelectorSpec\";\n\n/**\n * @module selectors\n * @private\n */\n\nexport function createFieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual,\n}) {\n const fieldSelectorSpec = new FieldSelectorSpec({\n parent,\n model,\n field,\n fieldModel,\n accessorName,\n orm,\n isVirtual,\n });\n /* Do not even try to create field selectors below attributes. */\n if (!(field instanceof RelationalField)) {\n // \"orm.Author.name.publisher\" would be nonsense\n return fieldSelectorSpec;\n }\n /* Prevent field selectors below collections. */\n if (parent instanceof FieldSelectorSpec) {\n /* eslint-disable no-underscore-dangle */\n if (\n // \"orm.Author.books.publisher\" would be nonsense\n (parent._field instanceof ForeignKey && parent._isVirtual) ||\n // \"orm.Genre.books.publisher\" would be nonsense\n parent._field instanceof ManyToMany\n ) {\n throw new Error(\n `Cannot create a selector for \\`${parent._accessorName}.${accessorName}\\` because \\`${parent._accessorName}\\` is a collection field.`\n );\n }\n }\n const { toModelName } = field;\n const toModel = orm.get(\n toModelName === \"this\" ? model.modelName : toModelName\n );\n Object.entries(toModel.fields).forEach(\n ([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false,\n }),\n });\n }\n );\n Object.entries(toModel.virtualFields).forEach(\n ([relatedFieldName, relatedField]) => {\n const fieldAccessorName = relatedField.as || relatedFieldName;\n if (fieldSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n Object.defineProperty(fieldSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: fieldSelectorSpec,\n model,\n fieldModel: toModel,\n field: relatedField,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true,\n }),\n });\n }\n );\n return fieldSelectorSpec;\n}\n\nexport function createModelSelectorSpec({ model, orm }) {\n const modelSelectorSpec = new ModelSelectorSpec({\n parent: null,\n orm,\n model,\n });\n\n Object.entries(model.fields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: false,\n }),\n });\n });\n\n Object.entries(model.virtualFields).forEach(([fieldName, field]) => {\n const fieldAccessorName = field.as || fieldName;\n if (modelSelectorSpec.hasOwnProperty(fieldAccessorName)) {\n return;\n }\n Object.defineProperty(modelSelectorSpec, fieldAccessorName, {\n get: () =>\n createFieldSelectorSpec({\n parent: modelSelectorSpec,\n model,\n fieldModel: model,\n field,\n accessorName: fieldAccessorName,\n orm,\n isVirtual: true,\n }),\n });\n });\n\n return modelSelectorSpec;\n}\n","/* eslint-disable max-classes-per-file */\nimport Session from \"./Session\";\nimport Model from \"./Model\";\nimport { createDatabase as defaultCreateDatabase } from \"./db\";\nimport { attr } from \"./fields\";\nimport Field from \"./fields/Field\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\n\nimport { createModelSelectorSpec } from \"./selectors\";\n\nimport {\n m2mName,\n attachQuerySetMethods,\n m2mToFieldName,\n m2mFromFieldName,\n warnDeprecated,\n} from \"./utils\";\n\nconst ORM_DEFAULTS = {\n createDatabase: defaultCreateDatabase,\n};\n\nconst RESERVED_TABLE_OPTIONS = [\"indexes\", \"meta\"];\nconst isReservedTableOption = (word) => RESERVED_TABLE_OPTIONS.includes(word);\n\n/**\n * ORM - the Object Relational Mapper.\n *\n * Use instances of this class to:\n *\n * - Register your {@link Model} classes using {@link ORM#register}\n * - Get the empty state for the underlying database with {@link ORM#getEmptyState}\n * - Start an immutable database session with {@link ORM#session}\n * - Start a mutating database session with {@link ORM#mutableSession}\n *\n * Internally, this class handles generating a schema specification from models\n * to the database.\n */\nclass ORM {\n /**\n * Creates a new ORM instance.\n *\n * @param {Object} [opts]\n * @param {Function} [opts.stateSelector] - function that given a Redux state tree\n * will return the ORM state's subtree,\n * e.g. `state => state.orm`\n * (necessary if you want to use selectors)\n * @param {Function} [opts.createDatabase] - function that creates a database\n */\n constructor(opts) {\n const { createDatabase } = { ...ORM_DEFAULTS, ...(opts || {}) };\n this.createDatabase = createDatabase;\n this.registry = [];\n this.implicitThroughModels = [];\n this.installedFields = {};\n this.stateSelector = opts ? opts.stateSelector : null;\n }\n\n /**\n * Registers a {@link Model} class to the ORM.\n *\n * If the model has declared any ManyToMany fields, their\n * through models will be generated and registered with\n * this call, unless a custom through model has been specified.\n *\n * @param {...Model} models - a {@link Model} class to register\n * @return {undefined}\n */\n register(...models) {\n models.forEach((model) => {\n if (model.modelName === undefined) {\n throw new Error(\n \"A model was passed that doesn't have a modelName set\"\n );\n }\n\n model.invalidateClassCache();\n\n this.registerManyToManyModelsFor(model);\n this.registry.push(model);\n\n Object.defineProperty(this, model.modelName, {\n get: () => {\n // make sure virtualFields are set up\n this._setupModelPrototypes(this.registry);\n\n return createModelSelectorSpec({\n model,\n orm: this,\n });\n },\n });\n });\n }\n\n registerManyToManyModelsFor(model) {\n const { fields } = model;\n const thisModelName = model.modelName;\n\n Object.entries(fields).forEach(([fieldName, fieldInstance]) => {\n if (!(fieldInstance instanceof ManyToMany)) {\n return;\n }\n\n let toModelName;\n if (fieldInstance.toModelName === \"this\") {\n toModelName = thisModelName;\n } else {\n toModelName = fieldInstance.toModelName; // eslint-disable-line prefer-destructuring\n }\n\n const selfReferencing = thisModelName === toModelName;\n const fromFieldName = m2mFromFieldName(thisModelName);\n const toFieldName = m2mToFieldName(toModelName);\n\n if (fieldInstance.through) {\n if (selfReferencing && !fieldInstance.throughFields) {\n throw new Error(\n \"Self-referencing many-to-many relationship at \" +\n `\"${thisModelName}.${fieldName}\" using custom ` +\n `model \"${fieldInstance.through}\" has no ` +\n \"throughFields key. Cannot determine which \" +\n \"fields reference the instances partaking \" +\n \"in the relationship.\"\n );\n }\n } else {\n const Through = class ThroughModel extends Model {};\n\n Through.modelName = m2mName(thisModelName, fieldName);\n\n const PlainForeignKey = class PlainForeignKey extends ForeignKey {\n get installsBackwardsVirtualField() {\n return false;\n }\n\n get installsBackwardsDescriptor() {\n return false;\n }\n };\n const ForeignKeyClass = selfReferencing\n ? PlainForeignKey\n : ForeignKey;\n Through.fields = {\n id: attr(),\n [fromFieldName]: new ForeignKeyClass(thisModelName),\n [toFieldName]: new ForeignKeyClass(toModelName),\n };\n\n Through.invalidateClassCache();\n this.implicitThroughModels.push(Through);\n }\n });\n }\n\n /**\n * Gets a {@link Model} class by its name from the registry.\n * @param {string} modelName - the name of the {@link Model} class to get\n * @throws If {@link Model} class is not found.\n * @return {Model} the {@link Model} class, if found\n */\n get(modelName) {\n const allModels = this.registry.concat(this.implicitThroughModels);\n const found = Object.values(allModels).find(\n (model) => model.modelName === modelName\n );\n\n if (typeof found === \"undefined\") {\n throw new Error(`Did not find model ${modelName} from registry.`);\n }\n return found;\n }\n\n getModelClasses() {\n this._setupModelPrototypes(this.registry);\n this._setupModelPrototypes(this.implicitThroughModels);\n return this.registry.concat(this.implicitThroughModels);\n }\n\n generateSchemaSpec() {\n const models = this.getModelClasses();\n const tables = models.reduce((spec, modelClass) => {\n const tableName = modelClass.modelName;\n const tableSpec = modelClass.tableOptions();\n Object.keys(tableSpec)\n .filter(isReservedTableOption)\n .forEach((key) => {\n throw new Error(\n `Reserved keyword \\`${key}\\` used in ${tableName}.options.`\n );\n });\n spec[tableName] = {\n fields: { ...modelClass.fields },\n ...tableSpec,\n };\n return spec;\n }, {});\n return { tables };\n }\n\n getDatabase() {\n if (!this.db) {\n this.db = this.createDatabase(this.generateSchemaSpec());\n }\n return this.db;\n }\n\n /**\n * Returns the empty database state.\n * @return {Object} the empty state\n */\n getEmptyState() {\n return this.getDatabase().getEmptyState();\n }\n\n /**\n * Begins an immutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n session(state) {\n return new Session(this, this.getDatabase(), state);\n }\n\n /**\n * Begins a mutable database session.\n *\n * @param {Object} state - the state the database manages\n * @return {Session} a new {@link Session} instance\n */\n mutableSession(state) {\n return new Session(this, this.getDatabase(), state, true);\n }\n\n /**\n * @private\n */\n _setupModelPrototypes(models) {\n models\n .filter((model) => !model.isSetUp)\n .forEach((model) => {\n const { fields, modelName, querySetClass } = model;\n Object.entries(fields).forEach(([fieldName, field]) => {\n if (!(field instanceof Field)) {\n throw new Error(\n `${modelName}.${fieldName} is of type \"${typeof field}\" ` +\n \"but must be an instance of Field. Please use the \" +\n \"`attr`, `fk`, `oneToOne` and `many` \" +\n \"functions to define fields.\"\n );\n }\n if (!this._isFieldInstalled(modelName, fieldName)) {\n this._installField(field, fieldName, model);\n this._setFieldInstalled(modelName, fieldName);\n }\n });\n attachQuerySetMethods(model, querySetClass);\n model.isSetUp = true;\n });\n }\n\n /**\n * @private\n */\n _isFieldInstalled(modelName, fieldName) {\n return this.installedFields.hasOwnProperty(modelName)\n ? !!this.installedFields[modelName][fieldName]\n : false;\n }\n\n /**\n * @private\n */\n _setFieldInstalled(modelName, fieldName) {\n if (!this.installedFields.hasOwnProperty(modelName)) {\n this.installedFields[modelName] = {};\n }\n this.installedFields[modelName][fieldName] = true;\n }\n\n /**\n * Installs a field on a model and its related models if necessary.\n * @private\n */\n _installField(field, fieldName, model) {\n const FieldInstaller = field.installerClass;\n new FieldInstaller({\n field,\n fieldName,\n model,\n orm: this,\n }).run();\n }\n\n // DEPRECATED AND REMOVED METHODS\n\n /**\n * @deprecated Use {@link ORM#mutableSession} instead.\n */\n withMutations(state) {\n warnDeprecated(\n \"`ORM.prototype.withMutations` has been deprecated. \" +\n \"Use `ORM.prototype.mutableSession` instead.\"\n );\n return this.mutableSession(state);\n }\n\n /**\n * @deprecated Use {@link ORM#session} instead.\n */\n from(state) {\n warnDeprecated(\n \"`ORM.prototype.from` has been deprecated. \" +\n \"Use `ORM.prototype.session` instead.\"\n );\n return this.session(state);\n }\n\n /**\n * @deprecated Use {@link ORM#getEmptyState} instead.\n */\n getDefaultState() {\n warnDeprecated(\n \"`ORM.prototype.getDefaultState` has been deprecated. Use \" +\n \"`ORM.prototype.getEmptyState` instead.\"\n );\n return this.getEmptyState();\n }\n\n /**\n * @deprecated Define a Model class instead.\n */\n define() {\n throw new Error(\n \"`ORM.prototype.define` has been removed. Please define a Model class.\"\n );\n }\n}\n\nexport function DeprecatedSchema() {\n throw new Error(\n \"Schema has been renamed to ORM. Please import ORM instead of Schema \" +\n \"from Redux-ORM.\"\n );\n}\n\nexport { ORM };\n\nexport default ORM;\n","import { STATE_FLAG } from \"./constants\";\n\nconst defaultEqualityCheck = (a, b) => a === b;\nexport const eqCheck = defaultEqualityCheck;\n\nconst isOrmState = (arg) =>\n arg && typeof arg === \"object\" && arg.hasOwnProperty(STATE_FLAG);\n\nconst argsAreEqual = (lastArgs, nextArgs, equalityCheck) =>\n nextArgs.every(\n (arg, index) =>\n (isOrmState(arg) && isOrmState(lastArgs[index])) ||\n equalityCheck(arg, lastArgs[index])\n );\n\nconst rowsAreEqual = (ids, rowsA, rowsB) =>\n ids.every((id) => rowsA[id] === rowsB[id]);\n\nconst accessedModelInstancesAreEqual = (previous, ormState, orm) => {\n const { accessedInstances } = previous;\n\n return Object.entries(accessedInstances).every(([modelName, instances]) => {\n // if the entire table has not been changed, we have nothing to do\n if (previous.ormState[modelName] === ormState[modelName]) {\n return true;\n }\n\n const { mapName } = orm.getDatabase().describe(modelName);\n\n const { [mapName]: previousRows } = previous.ormState[modelName];\n const { [mapName]: rows } = ormState[modelName];\n\n const accessedIds = Object.keys(instances);\n return rowsAreEqual(accessedIds, previousRows, rows);\n });\n};\n\nconst accessedIndexesAreEqual = (previous, ormState) => {\n const { accessedIndexes } = previous;\n\n return Object.entries(accessedIndexes).every(([modelName, indexes]) =>\n Object.entries(indexes).every(([column, values]) =>\n values.every(\n (value) =>\n previous.ormState[modelName].indexes[column][value] ===\n ormState[modelName].indexes[column][value]\n )\n )\n );\n};\n\nconst fullTableScannedModelsAreEqual = (previous, ormState) =>\n previous.fullTableScannedModels.every(\n (modelName) => previous.ormState[modelName] === ormState[modelName]\n );\n\n/**\n * A memoizer to use with redux-orm\n * selectors. When the memoized function is first run,\n * the memoizer will remember the models that are accessed\n * during that function run.\n *\n * On subsequent runs, the memoizer will check if those\n * models' states have changed compared to the previous run.\n *\n * Memoization algorithm operates like this:\n *\n * 1. Has the selector been run before? If not, go to 6.\n *\n * 2. If the selector has other input selectors in addition to the\n * ORM state selector, check their results for equality with the previous results.\n * If they aren't equal, go to 6.\n *\n * 3. Some filter queries may have required scanning entire tables during the last run.\n * If any of those tables have changed, go to 6.\n *\n * 4. Check which foreign key indexes the database has used to speed up queries\n * during the last run. If any have changed, go to 6.\n *\n * 5. Check which Model's instances the selector has accessed during the last run.\n * Check for equality with each of those states versus their states in the\n * previous ORM state. If all of them are equal, return the previous result.\n *\n * 6. Run the selector. Check the Session object used by the selector for\n * which Model's states were accessed, and merge them with the previously\n * saved information about accessed models (if-else branching can change\n * which models are accessed on different inputs). Save the ORM state and\n * other arguments the selector was called with, overriding previously\n * saved values. Save the selector result. Return the selector result.\n *\n * @private\n * @param {Function} func - function to memoize\n * @param {Function} argEqualityCheck - equality check function to use with normal\n * selector args\n * @param {ORM} orm - a redux-orm ORM instance\n * @return {Function} `func` memoized.\n */\nexport function memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {\n let previous = {\n /* Result of the previous function call */\n result: null,\n /* Arguments to the previous function call (excluding ORM state) */\n args: null,\n /**\n * Snapshot of the previous database.\n *\n * Lets us know how the tables looked like\n * during the previous function call.\n */\n ormState: null,\n /**\n * Names of models whose tables have been scanned completely\n * during previous function call (contains only model names)\n * Format example: ['Book']\n */\n fullTableScannedModels: [],\n /**\n * Map of which model instances have been accessed\n * during previous function call.\n * Contains only PKs of accessed instances.\n * Format example: { Book: { 1: true, 3: true } }\n */\n accessedInstances: {},\n /**\n * Map of which attribute indexes have been accessed\n * during previous function call.\n * Contains only attributes that were actually filtered on.\n * Author.withId(3).books would add 3 to the authorId index below.\n * Format example: { Book: { authorId: [1, 2], publisherId: [5] } }\n */\n accessedIndexes: {},\n };\n\n return (...stateAndArgs) => {\n /**\n * The first argument to this function needs to be\n * the ORM's reducer state in the user's Redux store.\n */\n const [ormState, ...args] = stateAndArgs;\n\n const selectorWasCalledBefore = Boolean(previous.args);\n if (\n selectorWasCalledBefore &&\n argsAreEqual(previous.args, args, argEqualityCheck) &&\n fullTableScannedModelsAreEqual(previous, ormState) &&\n accessedIndexesAreEqual(previous, ormState) &&\n accessedModelInstancesAreEqual(previous, ormState, orm)\n ) {\n /**\n * None of this selector's dependencies have changed\n * since the last time that we called it.\n */\n return previous.result;\n }\n\n /**\n * Start a session so that the selector can access the database.\n * Make this session immutable. This way we can find out if\n * the operations that the selector performs are cacheable.\n */\n const session = orm.session(ormState);\n /* Replace all ORM state arguments by the session above */\n const argsWithSession = args.map((arg) =>\n isOrmState(arg) ? session : arg\n );\n\n /* This is where we call the actual function */\n const result = func.apply(null, argsWithSession); // eslint-disable-line prefer-spread\n\n /**\n * The metadata for the previous call are no longer valid.\n * Update cached values.\n */\n previous = {\n /* Arguments that were passed to the selector */\n args,\n /* Selector result */\n result,\n /* Redux state slice for session.state */\n ormState,\n /* Rows retrieved by resolved primary key */\n accessedInstances: session.accessedModelInstances,\n /* Foreign key indexes that were used to speed up queries */\n accessedIndexes: session.accessedIndexes,\n /* Tables that had to be scanned completely */\n fullTableScannedModels: session.fullTableScannedModels,\n };\n\n return result;\n };\n}\n","import { createSelectorCreator } from \"reselect\";\nimport createCachedSelector, { FlatMapCache } from \"re-reselect\";\n\nimport { memoize } from \"./memoize\";\n\nimport { ORM } from \"./ORM\";\nimport SelectorSpec from \"./selectors/SelectorSpec\";\nimport MapSelectorSpec from \"./selectors/MapSelectorSpec\";\n\n/**\n * @module redux\n * @desc Provides functions for integration with Redux.\n */\n\n/**\n * Calls all models' reducers if they exist.\n *\n * @return {undefined}\n * @global\n */\nexport function defaultUpdater(session, action) {\n session.sessionBoundModels.forEach((modelClass) => {\n if (typeof modelClass.reducer === \"function\") {\n // This calls this.applyUpdate to update this.state\n modelClass.reducer(action, modelClass, session);\n }\n });\n}\n\n/**\n * Call the returned function to pass actions to Redux-ORM.\n *\n * @global\n *\n * @param {ORM} orm - the ORM instance.\n * @param {Function} [updater] - the function updating the ORM state based on the given action.\n * @return {Function} reducer that will update the ORM state.\n */\nexport function createReducer(orm, updater = defaultUpdater) {\n return (state, action) => {\n const session = orm.session(state || orm.getEmptyState());\n updater(session, action);\n return session.state;\n };\n}\n\n/**\n * @private\n * @param {SelectorSpec} spec\n */\nfunction createSelectorFromSpec(spec) {\n if (spec instanceof MapSelectorSpec) {\n const parentSelector = createSelectorFromSpec(spec.parent);\n return spec.createResultFunc(parentSelector);\n }\n return createCachedSelector(\n spec.dependencies,\n spec.resultFunc\n )({\n keySelector: spec.keySelector,\n cacheObject: new FlatMapCache(),\n selectorCreator: createSelector, // eslint-disable-line no-use-before-define\n });\n}\n\n/**\n * Tries to find ORM instance using the argument.\n * @private\n * @param {*} arg\n */\nfunction toORM(arg) {\n /* eslint-disable no-underscore-dangle */\n if (arg instanceof ORM) {\n return arg;\n }\n if (arg instanceof SelectorSpec) {\n return arg._orm;\n }\n return false;\n}\n\nconst selectorCache = new Map();\nconst SELECTOR_KEY = Symbol.for(\"REDUX_ORM_SELECTOR\");\n\n/**\n * @private\n * @param {function|ORM|SelectorSpec} arg\n */\nfunction toSelector(arg) {\n if (typeof arg === \"function\") {\n return arg;\n }\n if (arg instanceof ORM) {\n return arg.stateSelector;\n }\n if (arg instanceof MapSelectorSpec) {\n // the argument to map() needs to be callable\n arg.selector = toSelector(arg.selector);\n }\n if (arg instanceof SelectorSpec) {\n const { orm, cachePath } = arg;\n let level;\n\n // the selector cache for the spec's ORM\n if (!selectorCache.has(orm)) {\n selectorCache.set(orm, new Map());\n }\n const ormSelectors = selectorCache.get(orm);\n\n /**\n * Drill down into selector map by cachePath.\n *\n * The selector itself is stored under a special SELECTOR_KEY\n * so that we can store selectors below it as well.\n */\n level = ormSelectors;\n for (let i = 0; i < cachePath.length; ++i) {\n const storageKey = cachePath[i];\n if (!level.has(storageKey)) {\n level.set(storageKey, new Map());\n }\n level = level.get(storageKey);\n }\n if (level && level.has(SELECTOR_KEY)) {\n // Cache hit: the selector has been created before\n return level.get(SELECTOR_KEY);\n }\n // Cache miss: the selector needs to be created\n const selector = createSelectorFromSpec(arg);\n // Save the selector at the cachePath position\n level.set(SELECTOR_KEY, selector);\n\n return selector;\n }\n throw new Error(\n `Failed to interpret selector argument: ${JSON.stringify(\n arg\n )} of type ${typeof arg}`\n );\n}\n\n/**\n * Returns a memoized selector based on passed arguments.\n * This is similar to `reselect`'s `createSelector`,\n * except you can also pass a single function to be memoized.\n *\n * If you pass multiple functions, the format will be the\n * same as in `reselect`. The last argument is the selector\n * function and the previous are input selectors.\n *\n * When you use this method to create a selector, the returned selector\n * expects the whole `redux-orm` state branch as input. In the selector\n * function that you pass as the last argument, any of the arguments\n * you pass first will be considered selectors and mapped\n * to their outputs, like in `reselect`.\n *\n * Here are some example selectors:\n *\n * ```javascript\n * // orm is an instance of ORM\n * // reduxState is the state of a Redux store\n * const books = createSelector(orm.Book);\n * books(reduxState) // array of book refs\n *\n * const bookAuthors = createSelector(orm.Book.authors);\n * bookAuthors(reduxState) // two-dimensional array of author refs for each book\n * ```\n * Selectors can easily be applied to related models:\n * ```javascript\n * const bookAuthorNames = createSelector(\n * orm.Book.authors.map(orm.Author.name),\n * );\n * bookAuthorNames(reduxState, 8) // names of all authors of book with ID 8\n * bookAuthorNames(reduxState, [8, 9]) // 2D array of names of all authors of books with IDs 8 and 9\n * ```\n * Also note that `orm.Author.name` did not need to be wrapped in another `createSelector` call,\n * although that would be possible.\n *\n * For more complex calculations you can access\n * entire session objects by passing an ORM instance.\n * ```javascript\n * const freshBananasCost = createSelector(\n * orm,\n * session => {\n * const banana = session.Product.get({\n * name: \"Banana\",\n * });\n * // amount of fresh bananas in shopping cart\n * const amount = session.ShoppingCart.filter({\n * product_id: banana.id,\n * is_fresh: true,\n * }).count();\n * return `USD ${amount * banana.price}`;\n * }\n * );\n * ```\n *\n * redux-orm uses a special memoization function to avoid recomputations.\n *\n * Everytime a selector runs, this function records which instances\n * of your `Model`s were accessed.<br>\n * On subsequent runs, the selector first checks if the previously\n * accessed instances or `args` have changed in any way:\n * <ul>\n * <li>If yes, the selector calls the function you passed to it.</li>\n * <li>If not, it just returns the previous result\n * (unless you call it for the first time).</li>\n * </ul>\n *\n * This way you can use pure rendering in your React components\n * for performance gains.\n *\n * @global\n *\n * @param {...Function} args - zero or more input selectors\n * and the selector function.\n * @return {Function} memoized selector\n */\nexport function createSelector(...args) {\n if (!args.length) {\n throw new Error(\"Cannot create a selector without arguments.\");\n }\n\n const resultArg = args.pop();\n const dependencies = Array.isArray(args[0]) ? args[0] : args;\n\n const orm = dependencies.map(toORM).find(Boolean);\n const inputFuncs = dependencies.map(toSelector);\n\n if (typeof resultArg === \"function\") {\n if (!orm) {\n throw new Error(\n \"Failed to resolve the current ORM database state. Please pass an ORM instance or an ORM selector as an argument to `createSelector()`.\"\n );\n } else if (!orm.stateSelector) {\n throw new Error(\n \"Failed to resolve the current ORM database state. Please pass an object to the ORM constructor that specifies a `stateSelector` function.\"\n );\n } else if (typeof orm.stateSelector !== \"function\") {\n throw new Error(\n `Failed to resolve the current ORM database state. Please pass a function when specifying the ORM's \\`stateSelector\\`. Received: ${JSON.stringify(\n orm.stateSelector\n )} of type ${typeof orm.stateSelector}`\n );\n }\n\n return createSelectorCreator(\n memoize,\n undefined,\n orm\n )([orm.stateSelector, ...inputFuncs], resultArg);\n }\n\n if (resultArg instanceof ORM) {\n throw new Error(\n \"ORM instances cannot be the result function of selectors. You can access your models in the last function that you pass to `createSelector()`.\"\n );\n }\n if (inputFuncs.length) {\n console.warn(\n \"Your input selectors will be ignored: the passed result function does not require any input.\"\n );\n }\n\n return toSelector(resultArg);\n}\n","import QuerySet from \"./QuerySet\";\nimport Model from \"./Model\";\nimport { DeprecatedSchema, ORM } from \"./ORM\";\nimport Session from \"./Session\";\nimport { createReducer, createSelector } from \"./redux\";\nimport ForeignKey from \"./fields/ForeignKey\";\nimport ManyToMany from \"./fields/ManyToMany\";\nimport OneToOne from \"./fields/OneToOne\";\nimport Attribute from \"./fields/Attribute\";\nimport { fk, many, oneToOne, attr } from \"./fields\";\n\nconst Schema = DeprecatedSchema;\n\nconst Backend = function RemovedBackend() {\n throw new Error(\n \"Having a custom Backend instance is now unsupported. \" +\n \"Documentation for database customization is upcoming, for now \" +\n \"please look at the db folder in the source.\"\n );\n};\n\nexport {\n Attribute,\n QuerySet,\n Model,\n ORM,\n Schema,\n Backend,\n Session,\n ForeignKey,\n ManyToMany,\n OneToOne,\n fk,\n many,\n attr,\n oneToOne,\n createReducer,\n createSelector,\n};\n\nexport default Model;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/node_modules/redux-orm/es/Model.js b/node_modules/redux-orm/es/Model.js
index 541a8d1..b630452 100644
--- a/node_modules/redux-orm/es/Model.js
+++ b/node_modules/redux-orm/es/Model.js
@@ -274,7 +274,7 @@ var Model = /*#__PURE__*/function () {
var value = userProps[key];
props[key] = normalizeEntity(value);
} else if (field.getDefault) {
- props[key] = field.getDefault();
+ props[key] = field.getDefault(userProps);
}
} else if (valuePassed) {
// Save for later processing
diff --git a/node_modules/redux-orm/es/redux-orm-tests.js b/node_modules/redux-orm/es/redux-orm-tests.js
new file mode 100644
index 0000000..a33fa22
--- /dev/null
+++ b/node_modules/redux-orm/es/redux-orm-tests.js
@@ -0,0 +1,769 @@
+import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
+import _defineProperty from "@babel/runtime/helpers/defineProperty";
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+import { attr, createSelector as createOrmSelector, fk, many, Model, ORM } from "./";
+
+var Book = /*#__PURE__*/function (_Model) {
+ _inheritsLoose(Book, _Model);
+
+ function Book() {
+ return _Model.apply(this, arguments) || this;
+ }
+
+ Book.reducer = function reducer(action, _Book) {
+ switch (action.type) {
+ case "CREATE_BOOK":
+ _Book.create(action.payload);
+
+ break;
+
+ case "DELETE_BOOK":
+ _Book.filter(function (book) {
+ return book.title === action.payload.title;
+ })["delete"]();
+
+ break;
+
+ default:
+ break;
+ }
+ };
+
+ return Book;
+}(Model);
+
+_defineProperty(Book, "modelName", "Book");
+
+_defineProperty(Book, "fields", {
+ title: attr(),
+ coverArt: attr({
+ getDefault: function getDefault() {
+ return "empty.png";
+ }
+ }),
+ publisher: fk("Publisher", "books"),
+ authors: many({
+ to: "Person",
+ relatedName: "books",
+ through: "Authorship"
+ })
+});
+
+_defineProperty(Book, "options", {
+ idAttribute: "title"
+});
+
+var Person = /*#__PURE__*/function (_Model2) {
+ _inheritsLoose(Person, _Model2);
+
+ function Person() {
+ return _Model2.apply(this, arguments) || this;
+ }
+
+ return Person;
+}(Model);
+
+_defineProperty(Person, "modelName", "Person");
+
+_defineProperty(Person, "fields", {
+ id: attr(),
+ firstName: attr(),
+ lastName: attr(),
+ nationality: attr()
+});
+
+var Authorship = /*#__PURE__*/function (_Model3) {
+ _inheritsLoose(Authorship, _Model3);
+
+ function Authorship() {
+ return _Model3.apply(this, arguments) || this;
+ }
+
+ return Authorship;
+}(Model);
+
+_defineProperty(Authorship, "modelName", "Authorship");
+
+_defineProperty(Authorship, "fields", {
+ year: attr(),
+ book: fk("Book"),
+ author: fk("Person")
+});
+
+var Publisher = /*#__PURE__*/function (_Model4) {
+ _inheritsLoose(Publisher, _Model4);
+
+ function Publisher() {
+ return _Model4.apply(this, arguments) || this;
+ }
+
+ return Publisher;
+}(Model);
+
+_defineProperty(Publisher, "modelName", "Publisher");
+
+_defineProperty(Publisher, "fields", {
+ index: attr(),
+ name: attr()
+});
+
+_defineProperty(Publisher, "options", {
+ idAttribute: "index"
+});
+
+var schema = {
+ Book: Book,
+ Authorship: Authorship,
+ Person: Person,
+ Publisher: Publisher
+};
+
+// create ORM instance and register { Book, Publisher, Person, Authorship } schema
+var ormFixture = function ormFixture() {
+ var orm = new ORM({
+ stateSelector: function stateSelector(state) {
+ return state.db;
+ }
+ });
+ orm.register(Book, Authorship, Person, Publisher);
+ return orm;
+}; // create ORM instance and acquire new session
+
+
+var sessionFixture = function sessionFixture() {
+ var orm = ormFixture();
+ return orm.session(orm.getEmptyState());
+}; // argOptionalityAtModelCreation - inferred optionality of ModelType.create argument properties
+
+
+(function () {
+ var _sessionFixture = sessionFixture(),
+ Book = _sessionFixture.Book,
+ Publisher = _sessionFixture.Publisher;
+ /**
+ * 1.A. `number` Model identifiers are optional due to built-in incremental sequencing of numeric identifiers
+ * @see {@link PublisherFields.index}
+ */
+
+
+ Publisher.create({
+ name: "P1"
+ });
+ /**
+ * 1.B. `string` identifiers are mandatory
+ */
+
+ Book.create({
+ publisher: 1,
+ coverArt: "foo.bmp"
+ }); // $ExpectError
+
+ /**
+ * 2. non-relational fields with corresponding descriptors that contain defined `getDefault` callback: (`attr({ getDefault: () => 'empty.png' })`)
+ * @see {@link Book#fields.coverArt}
+ */
+
+ Book.create({
+ title: "B2",
+ publisher: 1
+ });
+ /**
+ * 3. both attribute and relational fields where corresponding ModelFields interface property has optional (`?`) modifier
+ * @see {@link BookFields.authors}
+ */
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: "foo.bmp"
+ });
+})(); // argPropertyTypeRestrictionsOnCreate - ModelFields contribute to type constraints within ModelType.create arguments
+
+
+(function () {
+ var _sessionFixture2 = sessionFixture(),
+ Book = _sessionFixture2.Book,
+ Publisher = _sessionFixture2.Publisher,
+ Person = _sessionFixture2.Person;
+ /** Keys of declared model fields interface contribute strict requirements regarding corresponding property types */
+
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: "foo.png",
+ authors: ["A1"]
+ });
+ /* Incompatible property types: */
+
+ Book.create({
+ title: 1,
+ publisher: 1
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: 4
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ authors: {}
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ authors: function authors() {
+ return null;
+ }
+ }); // $ExpectError
+
+ /**
+ * Properties associated to relational fields may be supplied with:
+ *
+ * - a primitive type matching id type of relation target
+ * - Model/SessionBoundModel instance matching relation target
+ *
+ * In case of MutableQuerySets/many-to-many relationships, an array of union of above-mentioned types is accepted
+ */
+
+ var authorModel = Person.create({
+ id: "A1",
+ firstName: "A1",
+ lastName: "A1"
+ });
+ var publisherModel = Publisher.create({
+ name: "P1"
+ });
+ Book.create({
+ title: "B1",
+ publisher: publisherModel,
+ authors: [authorModel]
+ });
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.index,
+ authors: [authorModel, "A1", authorModel, authorModel.ref.id]
+ });
+ /** Id types are verified to match relation target */
+
+ Book.create({
+ title: "B1",
+ publisher: authorModel
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.ref,
+ authors: [publisherModel.ref, "A1"]
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: "P1 "
+ }
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: 0
+ },
+ authors: [authorModel, true]
+ }); // $ExpectError
+})(); // argPropertyTypeRestrictionsOnUpsert - ModelFields contribute to type constraints within ModelType.create arguments
+
+
+(function () {
+ var _sessionFixture3 = sessionFixture(),
+ Book = _sessionFixture3.Book,
+ Publisher = _sessionFixture3.Publisher,
+ Person = _sessionFixture3.Person;
+ /** Upsert requires id to be provided */
+
+
+ Book.upsert({
+ publisher: 1
+ }); // $ExpectError
+ // $ExpectType SessionBoundModel<Book, Pick<{ title: string; publisher: number; }, never>> || SessionBoundModel<Book, CustomInstanceProps<Book, { title: string; publisher: number; }>>
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1
+ });
+ /* Incompatible property types: */
+
+ Book.upsert({
+ title: 4,
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ coverArt: 4
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: {}
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: function authors() {
+ return null;
+ }
+ }); // $ExpectError
+
+ /**
+ * Properties associated to relational fields may be supplied with:
+ *
+ * - a primitive type matching id type of relation target
+ * - a Ref type derived from relation target
+ * - Model/SessionBoundModel instance matching relation target
+ * - a map containing {Idkey:IdType} entry, where IdKey/IdType are compatible with relation target id key:type signature
+ *
+ * In case of MutableQuerySets/many-to-many relationships, an array of union of above-mentioned types is accepted
+ */
+
+ var authorModel = Person.upsert({
+ id: "A1",
+ firstName: "A1",
+ lastName: "A1"
+ });
+ var publisherModel = Publisher.upsert({
+ name: "P1",
+ index: 1
+ });
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: [authorModel]
+ });
+ Book.upsert({
+ title: "B1",
+ publisher: publisherModel,
+ authors: [authorModel]
+ });
+ /** Id types are verified to match relation target */
+
+ Book.create({
+ title: "B1",
+ publisher: authorModel
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.ref,
+ authors: [publisherModel.ref, "A1"]
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: "P1 "
+ }
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: 0
+ },
+ authors: [authorModel, true]
+ }); // $ExpectError
+})(); // restriction of allowed ORM.register args
+
+
+(function () {
+ var incompleteSchema = {
+ Book: Book,
+ Authorship: Authorship,
+ Person: Person
+ };
+ var orm = new ORM();
+ orm.register(Book, Authorship, Person, Publisher); // $ExpectError
+})(); // inference of ORM branch state type
+
+
+(function () {
+ var emptyState = ormFixture().getEmptyState();
+ var bookTableState = emptyState.Book; // $ExpectType TableState<typeof Book>
+
+ var bookItemsById = emptyState.Book.itemsById; // $ExpectType { readonly [K: string]: Ref<Book>; }
+
+ var authorshipMetaState = emptyState.Authorship.meta.maxId; // $ExpectType number
+
+ var bookMetaState = emptyState.Book.meta.maxId; // $ExpectType number | null
+})(); // sessionInstanceExtendedWithNarrowedModelClasses - indexing session instance using registered Model.modelName returns narrowed Model class
+
+
+(function () {
+ var _sessionFixture4 = sessionFixture(),
+ Book = _sessionFixture4.Book,
+ Person = _sessionFixture4.Person,
+ Publisher = _sessionFixture4.Publisher; // $ExpectType { Book: ModelType<Book>; Person: ModelType<Person>; Publisher: ModelType<Publisher>; }
+
+
+ var sessionBoundModels = {
+ Book: Book,
+ Person: Person,
+ Publisher: Publisher
+ };
+ return _objectSpread({}, sessionBoundModels);
+})(); // IdKey and IdType mapped types support for valid identifier configurations
+
+
+(function () {})(); // Model#create result retains custom properties supplied during call
+
+
+(function () {
+ var _sessionFixture5 = sessionFixture(),
+ Book = _sessionFixture5.Book;
+
+ var basicBook = Book.create({
+ title: "book",
+ publisher: 1
+ });
+ // $ExpectType "title" | "coverArt" | "publisher" | "authors" || keyof BookFields
+ var basicBookTitle = basicBook.title; // $ExpectType string
+
+ var authors = basicBook.authors; // $ExpectType MutableQuerySet<Person, {}>
+
+ var unknownPropertyError = basicBook.customProp; // $ExpectError
+
+ var customProp = {
+ foo: 0,
+ bar: true
+ };
+ var extendedBook = Book.create({
+ title: "extendedBook",
+ publisher: 1,
+ customProp: customProp
+ });
+ // $ExpectType "title" | "coverArt" | "publisher" | "authors" | "customProp" || keyof BookFields | "customProp"
+ var extendedBookTitle = extendedBook.title; // $ExpectType string
+
+ var instanceCustomProp = extendedBook.customProp; // $ExpectType { foo: number; bar: boolean; }
+})(); // reducer API is intact
+
+
+(function () {
+ var orm = ormFixture();
+ return function (state, action) {
+ var session = orm.session(state);
+ session.Book.create(action.payload);
+ return session.state;
+ };
+})(); // QuerySet type is retained though query chain until terminated.
+// Orders are optional, must conform to SortOrder type when present.
+// QuerySet.orderBy overloads accept iteratees applicable to QuerySet's type only
+// orderByArguments
+
+
+(function () {
+ var _sessionFixture6 = sessionFixture(),
+ Book = _sessionFixture6.Book;
+
+ var booksQuerySet = Book.all(); // $ExpectType readonly Ref<Book>[]
+
+ booksQuerySet.orderBy("title").orderBy(function (book) {
+ return book.publisher;
+ }, "desc").orderBy(function (book) {
+ return book.title;
+ }, false).orderBy("publisher", "asc").orderBy("publisher", true).toRefArray(); // $ExpectType readonly Ref<Book>[]
+
+ booksQuerySet.orderBy(["title"], ["asc"]).orderBy(["publisher", "title"], [true, "desc"]).orderBy([function (book) {
+ return book.title;
+ }], ["desc"]).orderBy(["title"]).orderBy([function (book) {
+ return book.title;
+ }, "publisher"], ["desc", false]).toRefArray();
+ booksQuerySet.orderBy("notABookPropertyKey"); // $ExpectError
+
+ booksQuerySet.orderBy([function (book) {
+ return book.notABookPropertyKey;
+ }], false); // $ExpectError
+
+ booksQuerySet.orderBy("title", "inc"); // $ExpectError
+
+ booksQuerySet.orderBy("title", 4); // $ExpectError
+
+ booksQuerySet.orderBy(["notABookPropertyKey"]); // $ExpectError
+
+ booksQuerySet.orderBy([function (book) {
+ return book.notABookPropertyKey;
+ }]); // $ExpectError
+
+ booksQuerySet.orderBy(["title"], ["inc"]); // $ExpectError
+
+ booksQuerySet.orderBy(["title"], [4]); // $ExpectError
+})(); // selectors
+
+
+(function () {
+ // test fixture, use reselect.createSelector in production code
+ var createSelector = function createSelector(param1Creator, combiner) {
+ return function (state) {
+ return combiner(param1Creator(state));
+ };
+ };
+
+ var orm = ormFixture();
+ var ormSelector = createOrmSelector(orm, function (session) {
+ return session.Book.all().toRefArray()[0];
+ });
+ var selector = createSelector(function (_ref) {
+ var db = _ref.db;
+ return db;
+ }, ormSelector);
+ createSelector(function (_ref2) {
+ var db = _ref2.db;
+ return db;
+ }, ormSelector // $ExpectError
+ );
+ selector({
+ db: orm.getEmptyState()
+ }); // $ExpectType Ref<Book>
+})(); // advanced selectors
+
+
+(function () {
+ var orm = ormFixture();
+ var selector0 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (session) {
+ return session.Book.first().ref;
+ });
+ var selector1 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.bar;
+ }, function (session, title) {
+ return session.Book.get({
+ title: title
+ }).ref;
+ });
+ var selector2 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title) {
+ return session.Book.get({
+ id: id,
+ title: title
+ }).ref;
+ });
+ var selector3 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (session, id, title, id2) {
+ return session.Book.get({
+ id: id,
+ title: title,
+ id2: id2
+ }).ref;
+ });
+ var selector4 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title, id2, title2) {
+ return session.Book.get({
+ id: id,
+ title: title,
+ id2: id2,
+ title2: title2
+ }).ref;
+ });
+ var selector5 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (session) {
+ return session.Book.get({
+ title: arguments.length <= 2 ? undefined : arguments[2]
+ }).ref;
+ });
+ var selector6 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title) {
+ return session.Book.get({
+ title: title
+ }).ref;
+ });
+ var invalidSelector = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (session, foo, missingArg) {
+ return foo;
+ } // $ExpectError
+ );
+ var invalidSelector2 = createOrmSelector(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (session, foo) {
+ return session.Book.withId(foo).ref;
+ } // $ExpectError
+ );
+ var state = {
+ db: orm.getEmptyState(),
+ foo: 1,
+ bar: "foo"
+ };
+ selector0(state); // $ExpectType Ref<Book>
+
+ selector1(state); // $ExpectType Ref<Book>
+
+ selector2(state); // $ExpectType Ref<Book>
+
+ selector3(state); // $ExpectType Ref<Book>
+
+ selector4(state); // $ExpectType Ref<Book>
+
+ selector5(state); // $ExpectType Ref<Book>
+
+ selector6(state); // $ExpectType Ref<Book>
+})(); // redux-orm-types#7
+
+
+(function () {
+ var _sessionFixture7 = sessionFixture(),
+ Book = _sessionFixture7.Book;
+
+ Book.exists({
+ title: "foo"
+ });
+ Book.all().exists();
+ Book.exists(); // $ExpectError
+
+ Book.exists("foo"); // $ExpectError
+
+ Book.all().exists({}); // $ExpectError
+})(); // redux-orm-types#8
+
+
+(function () {
+ var _sessionFixture8 = sessionFixture(),
+ Book = _sessionFixture8.Book;
+
+ Book.all().toModelArray();
+ Book.all().toRefArray();
+ Book.toModelArray(); // $ExpectError
+
+ Book.toRefArray(); // $ExpectError
+})(); // redux-orm-types#9
+
+
+(function () {
+ var _sessionFixture9 = sessionFixture(),
+ Book = _sessionFixture9.Book,
+ Person = _sessionFixture9.Person,
+ Publisher = _sessionFixture9.Publisher;
+
+ var author = Person.create({
+ id: "1",
+ firstName: "foo",
+ lastName: "bar",
+ nationality: "pl"
+ });
+ var publisher = Publisher.create({
+ name: "foo"
+ });
+ Book.create({
+ title: "foo",
+ publisher: 1
+ });
+ Book.create({
+ title: "foo",
+ publisher: 1,
+ coverArt: "bar"
+ });
+ Book.create({
+ title: "foo",
+ publisher: publisher,
+ coverArt: "bar",
+ authors: ["foo", author]
+ });
+ Book.create({
+ title: "foo",
+ publisher: author
+ }); // $ExpectError
+
+ Book.create({
+ title: "foo",
+ publisher: "error"
+ }); // $ExpectError
+
+ Book.create({
+ title: "foo",
+ publisher: publisher,
+ coverArt: "bar",
+ authors: [3, author]
+ }); // $ExpectError
+})(); // redux-orm-types#18
+
+
+(function () {
+ return many({
+ to: "Bar",
+ relatedName: "foos",
+ through: "FooBar",
+ throughFields: ["foo", "bar"]
+ });
+})();
\ No newline at end of file
diff --git a/node_modules/redux-orm/lib/Model.js b/node_modules/redux-orm/lib/Model.js
index b2982a2..f707fea 100644
--- a/node_modules/redux-orm/lib/Model.js
+++ b/node_modules/redux-orm/lib/Model.js
@@ -293,7 +293,7 @@ var Model = /*#__PURE__*/function () {
var value = userProps[key];
props[key] = (0, _utils.normalizeEntity)(value);
} else if (field.getDefault) {
- props[key] = field.getDefault();
+ props[key] = field.getDefault(userProps);
}
} else if (valuePassed) {
// Save for later processing
diff --git a/node_modules/redux-orm/lib/redux-orm-tests.js b/node_modules/redux-orm/lib/redux-orm-tests.js
new file mode 100644
index 0000000..5863ac7
--- /dev/null
+++ b/node_modules/redux-orm/lib/redux-orm-tests.js
@@ -0,0 +1,767 @@
+"use strict";
+
+var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
+
+var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
+
+var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
+
+var _ = require("./");
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+var Book = /*#__PURE__*/function (_Model) {
+ (0, _inheritsLoose2["default"])(Book, _Model);
+
+ function Book() {
+ return _Model.apply(this, arguments) || this;
+ }
+
+ Book.reducer = function reducer(action, _Book) {
+ switch (action.type) {
+ case "CREATE_BOOK":
+ _Book.create(action.payload);
+
+ break;
+
+ case "DELETE_BOOK":
+ _Book.filter(function (book) {
+ return book.title === action.payload.title;
+ })["delete"]();
+
+ break;
+
+ default:
+ break;
+ }
+ };
+
+ return Book;
+}(_.Model);
+
+(0, _defineProperty2["default"])(Book, "modelName", "Book");
+(0, _defineProperty2["default"])(Book, "fields", {
+ title: (0, _.attr)(),
+ coverArt: (0, _.attr)({
+ getDefault: function getDefault() {
+ return "empty.png";
+ }
+ }),
+ publisher: (0, _.fk)("Publisher", "books"),
+ authors: (0, _.many)({
+ to: "Person",
+ relatedName: "books",
+ through: "Authorship"
+ })
+});
+(0, _defineProperty2["default"])(Book, "options", {
+ idAttribute: "title"
+});
+
+var Person = /*#__PURE__*/function (_Model2) {
+ (0, _inheritsLoose2["default"])(Person, _Model2);
+
+ function Person() {
+ return _Model2.apply(this, arguments) || this;
+ }
+
+ return Person;
+}(_.Model);
+
+(0, _defineProperty2["default"])(Person, "modelName", "Person");
+(0, _defineProperty2["default"])(Person, "fields", {
+ id: (0, _.attr)(),
+ firstName: (0, _.attr)(),
+ lastName: (0, _.attr)(),
+ nationality: (0, _.attr)()
+});
+
+var Authorship = /*#__PURE__*/function (_Model3) {
+ (0, _inheritsLoose2["default"])(Authorship, _Model3);
+
+ function Authorship() {
+ return _Model3.apply(this, arguments) || this;
+ }
+
+ return Authorship;
+}(_.Model);
+
+(0, _defineProperty2["default"])(Authorship, "modelName", "Authorship");
+(0, _defineProperty2["default"])(Authorship, "fields", {
+ year: (0, _.attr)(),
+ book: (0, _.fk)("Book"),
+ author: (0, _.fk)("Person")
+});
+
+var Publisher = /*#__PURE__*/function (_Model4) {
+ (0, _inheritsLoose2["default"])(Publisher, _Model4);
+
+ function Publisher() {
+ return _Model4.apply(this, arguments) || this;
+ }
+
+ return Publisher;
+}(_.Model);
+
+(0, _defineProperty2["default"])(Publisher, "modelName", "Publisher");
+(0, _defineProperty2["default"])(Publisher, "fields", {
+ index: (0, _.attr)(),
+ name: (0, _.attr)()
+});
+(0, _defineProperty2["default"])(Publisher, "options", {
+ idAttribute: "index"
+});
+var schema = {
+ Book: Book,
+ Authorship: Authorship,
+ Person: Person,
+ Publisher: Publisher
+};
+
+// create ORM instance and register { Book, Publisher, Person, Authorship } schema
+var ormFixture = function ormFixture() {
+ var orm = new _.ORM({
+ stateSelector: function stateSelector(state) {
+ return state.db;
+ }
+ });
+ orm.register(Book, Authorship, Person, Publisher);
+ return orm;
+}; // create ORM instance and acquire new session
+
+
+var sessionFixture = function sessionFixture() {
+ var orm = ormFixture();
+ return orm.session(orm.getEmptyState());
+}; // argOptionalityAtModelCreation - inferred optionality of ModelType.create argument properties
+
+
+(function () {
+ var _sessionFixture = sessionFixture(),
+ Book = _sessionFixture.Book,
+ Publisher = _sessionFixture.Publisher;
+ /**
+ * 1.A. `number` Model identifiers are optional due to built-in incremental sequencing of numeric identifiers
+ * @see {@link PublisherFields.index}
+ */
+
+
+ Publisher.create({
+ name: "P1"
+ });
+ /**
+ * 1.B. `string` identifiers are mandatory
+ */
+
+ Book.create({
+ publisher: 1,
+ coverArt: "foo.bmp"
+ }); // $ExpectError
+
+ /**
+ * 2. non-relational fields with corresponding descriptors that contain defined `getDefault` callback: (`attr({ getDefault: () => 'empty.png' })`)
+ * @see {@link Book#fields.coverArt}
+ */
+
+ Book.create({
+ title: "B2",
+ publisher: 1
+ });
+ /**
+ * 3. both attribute and relational fields where corresponding ModelFields interface property has optional (`?`) modifier
+ * @see {@link BookFields.authors}
+ */
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: "foo.bmp"
+ });
+})(); // argPropertyTypeRestrictionsOnCreate - ModelFields contribute to type constraints within ModelType.create arguments
+
+
+(function () {
+ var _sessionFixture2 = sessionFixture(),
+ Book = _sessionFixture2.Book,
+ Publisher = _sessionFixture2.Publisher,
+ Person = _sessionFixture2.Person;
+ /** Keys of declared model fields interface contribute strict requirements regarding corresponding property types */
+
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: "foo.png",
+ authors: ["A1"]
+ });
+ /* Incompatible property types: */
+
+ Book.create({
+ title: 1,
+ publisher: 1
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ coverArt: 4
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ authors: {}
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: 1,
+ authors: function authors() {
+ return null;
+ }
+ }); // $ExpectError
+
+ /**
+ * Properties associated to relational fields may be supplied with:
+ *
+ * - a primitive type matching id type of relation target
+ * - Model/SessionBoundModel instance matching relation target
+ *
+ * In case of MutableQuerySets/many-to-many relationships, an array of union of above-mentioned types is accepted
+ */
+
+ var authorModel = Person.create({
+ id: "A1",
+ firstName: "A1",
+ lastName: "A1"
+ });
+ var publisherModel = Publisher.create({
+ name: "P1"
+ });
+ Book.create({
+ title: "B1",
+ publisher: publisherModel,
+ authors: [authorModel]
+ });
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.index,
+ authors: [authorModel, "A1", authorModel, authorModel.ref.id]
+ });
+ /** Id types are verified to match relation target */
+
+ Book.create({
+ title: "B1",
+ publisher: authorModel
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.ref,
+ authors: [publisherModel.ref, "A1"]
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: "P1 "
+ }
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: 0
+ },
+ authors: [authorModel, true]
+ }); // $ExpectError
+})(); // argPropertyTypeRestrictionsOnUpsert - ModelFields contribute to type constraints within ModelType.create arguments
+
+
+(function () {
+ var _sessionFixture3 = sessionFixture(),
+ Book = _sessionFixture3.Book,
+ Publisher = _sessionFixture3.Publisher,
+ Person = _sessionFixture3.Person;
+ /** Upsert requires id to be provided */
+
+
+ Book.upsert({
+ publisher: 1
+ }); // $ExpectError
+ // $ExpectType SessionBoundModel<Book, Pick<{ title: string; publisher: number; }, never>> || SessionBoundModel<Book, CustomInstanceProps<Book, { title: string; publisher: number; }>>
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1
+ });
+ /* Incompatible property types: */
+
+ Book.upsert({
+ title: 4,
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: "P1"
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ coverArt: 4
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: {}
+ }); // $ExpectError
+
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: function authors() {
+ return null;
+ }
+ }); // $ExpectError
+
+ /**
+ * Properties associated to relational fields may be supplied with:
+ *
+ * - a primitive type matching id type of relation target
+ * - a Ref type derived from relation target
+ * - Model/SessionBoundModel instance matching relation target
+ * - a map containing {Idkey:IdType} entry, where IdKey/IdType are compatible with relation target id key:type signature
+ *
+ * In case of MutableQuerySets/many-to-many relationships, an array of union of above-mentioned types is accepted
+ */
+
+ var authorModel = Person.upsert({
+ id: "A1",
+ firstName: "A1",
+ lastName: "A1"
+ });
+ var publisherModel = Publisher.upsert({
+ name: "P1",
+ index: 1
+ });
+ Book.upsert({
+ title: "B1",
+ publisher: 1,
+ authors: [authorModel]
+ });
+ Book.upsert({
+ title: "B1",
+ publisher: publisherModel,
+ authors: [authorModel]
+ });
+ /** Id types are verified to match relation target */
+
+ Book.create({
+ title: "B1",
+ publisher: authorModel
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: publisherModel.ref,
+ authors: [publisherModel.ref, "A1"]
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: "P1 "
+ }
+ }); // $ExpectError
+
+ Book.create({
+ title: "B1",
+ publisher: {
+ index: 0
+ },
+ authors: [authorModel, true]
+ }); // $ExpectError
+})(); // restriction of allowed ORM.register args
+
+
+(function () {
+ var incompleteSchema = {
+ Book: Book,
+ Authorship: Authorship,
+ Person: Person
+ };
+ var orm = new _.ORM();
+ orm.register(Book, Authorship, Person, Publisher); // $ExpectError
+})(); // inference of ORM branch state type
+
+
+(function () {
+ var emptyState = ormFixture().getEmptyState();
+ var bookTableState = emptyState.Book; // $ExpectType TableState<typeof Book>
+
+ var bookItemsById = emptyState.Book.itemsById; // $ExpectType { readonly [K: string]: Ref<Book>; }
+
+ var authorshipMetaState = emptyState.Authorship.meta.maxId; // $ExpectType number
+
+ var bookMetaState = emptyState.Book.meta.maxId; // $ExpectType number | null
+})(); // sessionInstanceExtendedWithNarrowedModelClasses - indexing session instance using registered Model.modelName returns narrowed Model class
+
+
+(function () {
+ var _sessionFixture4 = sessionFixture(),
+ Book = _sessionFixture4.Book,
+ Person = _sessionFixture4.Person,
+ Publisher = _sessionFixture4.Publisher; // $ExpectType { Book: ModelType<Book>; Person: ModelType<Person>; Publisher: ModelType<Publisher>; }
+
+
+ var sessionBoundModels = {
+ Book: Book,
+ Person: Person,
+ Publisher: Publisher
+ };
+ return _objectSpread({}, sessionBoundModels);
+})(); // IdKey and IdType mapped types support for valid identifier configurations
+
+
+(function () {})(); // Model#create result retains custom properties supplied during call
+
+
+(function () {
+ var _sessionFixture5 = sessionFixture(),
+ Book = _sessionFixture5.Book;
+
+ var basicBook = Book.create({
+ title: "book",
+ publisher: 1
+ });
+ // $ExpectType "title" | "coverArt" | "publisher" | "authors" || keyof BookFields
+ var basicBookTitle = basicBook.title; // $ExpectType string
+
+ var authors = basicBook.authors; // $ExpectType MutableQuerySet<Person, {}>
+
+ var unknownPropertyError = basicBook.customProp; // $ExpectError
+
+ var customProp = {
+ foo: 0,
+ bar: true
+ };
+ var extendedBook = Book.create({
+ title: "extendedBook",
+ publisher: 1,
+ customProp: customProp
+ });
+ // $ExpectType "title" | "coverArt" | "publisher" | "authors" | "customProp" || keyof BookFields | "customProp"
+ var extendedBookTitle = extendedBook.title; // $ExpectType string
+
+ var instanceCustomProp = extendedBook.customProp; // $ExpectType { foo: number; bar: boolean; }
+})(); // reducer API is intact
+
+
+(function () {
+ var orm = ormFixture();
+ return function (state, action) {
+ var session = orm.session(state);
+ session.Book.create(action.payload);
+ return session.state;
+ };
+})(); // QuerySet type is retained though query chain until terminated.
+// Orders are optional, must conform to SortOrder type when present.
+// QuerySet.orderBy overloads accept iteratees applicable to QuerySet's type only
+// orderByArguments
+
+
+(function () {
+ var _sessionFixture6 = sessionFixture(),
+ Book = _sessionFixture6.Book;
+
+ var booksQuerySet = Book.all(); // $ExpectType readonly Ref<Book>[]
+
+ booksQuerySet.orderBy("title").orderBy(function (book) {
+ return book.publisher;
+ }, "desc").orderBy(function (book) {
+ return book.title;
+ }, false).orderBy("publisher", "asc").orderBy("publisher", true).toRefArray(); // $ExpectType readonly Ref<Book>[]
+
+ booksQuerySet.orderBy(["title"], ["asc"]).orderBy(["publisher", "title"], [true, "desc"]).orderBy([function (book) {
+ return book.title;
+ }], ["desc"]).orderBy(["title"]).orderBy([function (book) {
+ return book.title;
+ }, "publisher"], ["desc", false]).toRefArray();
+ booksQuerySet.orderBy("notABookPropertyKey"); // $ExpectError
+
+ booksQuerySet.orderBy([function (book) {
+ return book.notABookPropertyKey;
+ }], false); // $ExpectError
+
+ booksQuerySet.orderBy("title", "inc"); // $ExpectError
+
+ booksQuerySet.orderBy("title", 4); // $ExpectError
+
+ booksQuerySet.orderBy(["notABookPropertyKey"]); // $ExpectError
+
+ booksQuerySet.orderBy([function (book) {
+ return book.notABookPropertyKey;
+ }]); // $ExpectError
+
+ booksQuerySet.orderBy(["title"], ["inc"]); // $ExpectError
+
+ booksQuerySet.orderBy(["title"], [4]); // $ExpectError
+})(); // selectors
+
+
+(function () {
+ // test fixture, use reselect.createSelector in production code
+ var createSelector = function createSelector(param1Creator, combiner) {
+ return function (state) {
+ return combiner(param1Creator(state));
+ };
+ };
+
+ var orm = ormFixture();
+ var ormSelector = (0, _.createSelector)(orm, function (session) {
+ return session.Book.all().toRefArray()[0];
+ });
+ var selector = createSelector(function (_ref) {
+ var db = _ref.db;
+ return db;
+ }, ormSelector);
+ createSelector(function (_ref2) {
+ var db = _ref2.db;
+ return db;
+ }, ormSelector // $ExpectError
+ );
+ selector({
+ db: orm.getEmptyState()
+ }); // $ExpectType Ref<Book>
+})(); // advanced selectors
+
+
+(function () {
+ var orm = ormFixture();
+ var selector0 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (session) {
+ return session.Book.first().ref;
+ });
+ var selector1 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.bar;
+ }, function (session, title) {
+ return session.Book.get({
+ title: title
+ }).ref;
+ });
+ var selector2 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title) {
+ return session.Book.get({
+ id: id,
+ title: title
+ }).ref;
+ });
+ var selector3 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (session, id, title, id2) {
+ return session.Book.get({
+ id: id,
+ title: title,
+ id2: id2
+ }).ref;
+ });
+ var selector4 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title, id2, title2) {
+ return session.Book.get({
+ id: id,
+ title: title,
+ id2: id2,
+ title2: title2
+ }).ref;
+ });
+ var selector5 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (session) {
+ return session.Book.get({
+ title: arguments.length <= 2 ? undefined : arguments[2]
+ }).ref;
+ });
+ var selector6 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (s) {
+ return s.foo;
+ }, function (s) {
+ return s.bar;
+ }, function (session, id, title) {
+ return session.Book.get({
+ title: title
+ }).ref;
+ });
+ var invalidSelector = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (session, foo, missingArg) {
+ return foo;
+ } // $ExpectError
+ );
+ var invalidSelector2 = (0, _.createSelector)(orm, function (s) {
+ return s.db;
+ }, function (s) {
+ return s.foo;
+ }, function (session, foo) {
+ return session.Book.withId(foo).ref;
+ } // $ExpectError
+ );
+ var state = {
+ db: orm.getEmptyState(),
+ foo: 1,
+ bar: "foo"
+ };
+ selector0(state); // $ExpectType Ref<Book>
+
+ selector1(state); // $ExpectType Ref<Book>
+
+ selector2(state); // $ExpectType Ref<Book>
+
+ selector3(state); // $ExpectType Ref<Book>
+
+ selector4(state); // $ExpectType Ref<Book>
+
+ selector5(state); // $ExpectType Ref<Book>
+
+ selector6(state); // $ExpectType Ref<Book>
+})(); // redux-orm-types#7
+
+
+(function () {
+ var _sessionFixture7 = sessionFixture(),
+ Book = _sessionFixture7.Book;
+
+ Book.exists({
+ title: "foo"
+ });
+ Book.all().exists();
+ Book.exists(); // $ExpectError
+
+ Book.exists("foo"); // $ExpectError
+
+ Book.all().exists({}); // $ExpectError
+})(); // redux-orm-types#8
+
+
+(function () {
+ var _sessionFixture8 = sessionFixture(),
+ Book = _sessionFixture8.Book;
+
+ Book.all().toModelArray();
+ Book.all().toRefArray();
+ Book.toModelArray(); // $ExpectError
+
+ Book.toRefArray(); // $ExpectError
+})(); // redux-orm-types#9
+
+
+(function () {
+ var _sessionFixture9 = sessionFixture(),
+ Book = _sessionFixture9.Book,
+ Person = _sessionFixture9.Person,
+ Publisher = _sessionFixture9.Publisher;
+
+ var author = Person.create({
+ id: "1",
+ firstName: "foo",
+ lastName: "bar",
+ nationality: "pl"
+ });
+ var publisher = Publisher.create({
+ name: "foo"
+ });
+ Book.create({
+ title: "foo",
+ publisher: 1
+ });
+ Book.create({
+ title: "foo",
+ publisher: 1,
+ coverArt: "bar"
+ });
+ Book.create({
+ title: "foo",
+ publisher: publisher,
+ coverArt: "bar",
+ authors: ["foo", author]
+ });
+ Book.create({
+ title: "foo",
+ publisher: author
+ }); // $ExpectError
+
+ Book.create({
+ title: "foo",
+ publisher: "error"
+ }); // $ExpectError
+
+ Book.create({
+ title: "foo",
+ publisher: publisher,
+ coverArt: "bar",
+ authors: [3, author]
+ }); // $ExpectError
+})(); // redux-orm-types#18
+
+
+(function () {
+ return (0, _.many)({
+ to: "Bar",
+ relatedName: "foos",
+ through: "FooBar",
+ throughFields: ["foo", "bar"]
+ });
+})();
\ No newline at end of file
diff --git a/node_modules/redux-orm/src/Model.js b/node_modules/redux-orm/src/Model.js
index 20f66ef..6263d01 100644
--- a/node_modules/redux-orm/src/Model.js
+++ b/node_modules/redux-orm/src/Model.js
@@ -71,7 +71,7 @@ const Model = class Model {
const propsObj = Object(props);
this._fields = { ...propsObj };
- Object.keys(propsObj).forEach(fieldName => {
+ Object.keys(propsObj).forEach((fieldName) => {
// In this case, we got a prop that wasn't defined as a field.
// Assuming it's an arbitrary data field, making an instance-specific
// descriptor for it.
@@ -80,7 +80,7 @@ const Model = class Model {
if (!(fieldName in this)) {
Object.defineProperty(this, fieldName, {
get: () => this._fields[fieldName],
- set: value => this.set(fieldName, value),
+ set: (value) => this.set(fieldName, value),
configurable: true,
enumerable: true,
});
@@ -292,7 +292,7 @@ const Model = class Model {
const declaredFieldNames = Object.keys(this.fields);
const declaredVirtualFieldNames = Object.keys(this.virtualFields);
- declaredFieldNames.forEach(key => {
+ declaredFieldNames.forEach((key) => {
const field = this.fields[key];
const valuePassed = userProps.hasOwnProperty(key);
if (!(field instanceof ManyToMany)) {
@@ -300,7 +300,7 @@ const Model = class Model {
const value = userProps[key];
props[key] = normalizeEntity(value);
} else if (field.getDefault) {
- props[key] = field.getDefault();
+ props[key] = field.getDefault(userProps);
}
} else if (valuePassed) {
// Save for later processing
@@ -320,7 +320,7 @@ const Model = class Model {
});
// add backward many-many if required
- declaredVirtualFieldNames.forEach(key => {
+ declaredVirtualFieldNames.forEach((key) => {
if (!m2mRelations.hasOwnProperty(key)) {
const field = this.virtualFields[key];
if (
@@ -527,12 +527,12 @@ const Model = class Model {
const className = ThisModel.modelName;
const fieldNames = Object.keys(ThisModel.fields);
const fields = fieldNames
- .map(fieldName => {
+ .map((fieldName) => {
const field = ThisModel.fields[fieldName];
if (field instanceof ManyToMany) {
const ids = this[fieldName]
.toModelArray()
- .map(model => model.getId());
+ .map((model) => model.getId());
return `${fieldName}: [${ids.join(", ")}]`;
}
const val = this._fields[fieldName];
@@ -697,7 +697,7 @@ const Model = class Model {
const ThisModel = this.getClass();
const { fields, virtualFields, modelName } = ThisModel;
- Object.keys(relations).forEach(name => {
+ Object.keys(relations).forEach((name) => {
const reverse = !fields.hasOwnProperty(name);
const field = virtualFields[name];
const values = relations[name];
@@ -731,10 +731,10 @@ const Model = class Model {
}
const currentIds = ThroughModel.filter(
- through => through[fromField] === this[ThisModel.idAttribute]
+ (through) => through[fromField] === this[ThisModel.idAttribute]
)
.toRefArray()
- .map(ref => ref[toField]);
+ .map((ref) => ref[toField]);
const diffActions = arrayDiffActions(currentIds, normalizedNewIds);
diff --git a/node_modules/redux-orm/src/ORM.js b/node_modules/redux-orm/src/ORM.js
index a0b00dd..5872107 100644
--- a/node_modules/redux-orm/src/ORM.js
+++ b/node_modules/redux-orm/src/ORM.js
@@ -22,7 +22,7 @@ const ORM_DEFAULTS = {
};
const RESERVED_TABLE_OPTIONS = ["indexes", "meta"];
-const isReservedTableOption = word => RESERVED_TABLE_OPTIONS.includes(word);
+const isReservedTableOption = (word) => RESERVED_TABLE_OPTIONS.includes(word);
/**
* ORM - the Object Relational Mapper.
@@ -68,7 +68,7 @@ class ORM {
* @return {undefined}
*/
register(...models) {
- models.forEach(model => {
+ models.forEach((model) => {
if (model.modelName === undefined) {
throw new Error(
"A model was passed that doesn't have a modelName set"
@@ -163,7 +163,7 @@ class ORM {
get(modelName) {
const allModels = this.registry.concat(this.implicitThroughModels);
const found = Object.values(allModels).find(
- model => model.modelName === modelName
+ (model) => model.modelName === modelName
);
if (typeof found === "undefined") {
@@ -185,7 +185,7 @@ class ORM {
const tableSpec = modelClass.tableOptions();
Object.keys(tableSpec)
.filter(isReservedTableOption)
- .forEach(key => {
+ .forEach((key) => {
throw new Error(
`Reserved keyword \`${key}\` used in ${tableName}.options.`
);
@@ -239,8 +239,8 @@ class ORM {
*/
_setupModelPrototypes(models) {
models
- .filter(model => !model.isSetUp)
- .forEach(model => {
+ .filter((model) => !model.isSetUp)
+ .forEach((model) => {
const { fields, modelName, querySetClass } = model;
Object.entries(fields).forEach(([fieldName, field]) => {
if (!(field instanceof Field)) {
diff --git a/node_modules/redux-orm/src/QuerySet.js b/node_modules/redux-orm/src/QuerySet.js
index 5dd357d..33bedbc 100644
--- a/node_modules/redux-orm/src/QuerySet.js
+++ b/node_modules/redux-orm/src/QuerySet.js
@@ -75,7 +75,7 @@ const QuerySet = class QuerySet {
*/
toModelArray() {
const { modelClass: ModelClass } = this;
- return this._evaluate().map(props => new ModelClass(props));
+ return this._evaluate().map((props) => new ModelClass(props));
}
/**
@@ -287,7 +287,7 @@ const QuerySet = class QuerySet {
const { session, modelName: table } = this.modelClass;
this.toModelArray().forEach(
- model => model._onDelete() // eslint-disable-line no-underscore-dangle
+ (model) => model._onDelete() // eslint-disable-line no-underscore-dangle
);
session.applyUpdate({
diff --git a/node_modules/redux-orm/src/Session.js b/node_modules/redux-orm/src/Session.js
index ce40ba8..27e0707 100644
--- a/node_modules/redux-orm/src/Session.js
+++ b/node_modules/redux-orm/src/Session.js
@@ -26,7 +26,7 @@ const Session = class Session {
this.models = schema.getModelClasses();
- this.sessionBoundModels = this.models.map(modelClass => {
+ this.sessionBoundModels = this.models.map((modelClass) => {
function SessionBoundModel() {
return Reflect.construct(
modelClass,
@@ -65,7 +65,7 @@ const Session = class Session {
if (!data.accessedInstances) {
data.accessedInstances = {};
}
- modelIds.forEach(id => {
+ modelIds.forEach((id) => {
data.accessedInstances[id] = true;
});
}
@@ -170,9 +170,9 @@ const Session = class Session {
const { rows } = result;
const { idAttribute } = this[table];
- const accessedIds = new Set(rows.map(row => row[idAttribute]));
+ const accessedIds = new Set(rows.map((row) => row[idAttribute]));
- const anyClauseFilteredByPk = clauses.some(clause => {
+ const anyClauseFilteredByPk = clauses.some((clause) => {
if (!clauseFiltersByAttribute(clause, idAttribute)) {
return false;
}
@@ -186,8 +186,8 @@ const Session = class Session {
const accessedIndexes = [];
const { indexes } = this.state[table];
- clauses.forEach(clause => {
- Object.keys(indexes).forEach(attr => {
+ clauses.forEach((clause) => {
+ Object.keys(indexes).forEach((attr) => {
if (!clauseFiltersByAttribute(clause, attr)) {
return;
}
diff --git a/node_modules/redux-orm/src/db/Database.js b/node_modules/redux-orm/src/db/Database.js
index 25ad4c0..023f090 100644
--- a/node_modules/redux-orm/src/db/Database.js
+++ b/node_modules/redux-orm/src/db/Database.js
@@ -105,7 +105,7 @@ export function createDatabase(schemaSpec) {
query: query.bind(null, tables),
update: update.bind(null, tables),
// Used to inspect the schema.
- describe: tableName => tables[tableName],
+ describe: (tableName) => tables[tableName],
};
}
diff --git a/node_modules/redux-orm/src/db/Table.js b/node_modules/redux-orm/src/db/Table.js
index 66670b2..9301f28 100644
--- a/node_modules/redux-orm/src/db/Table.js
+++ b/node_modules/redux-orm/src/db/Table.js
@@ -63,7 +63,7 @@ function normalizeOrders(orders) {
if (orders === undefined) {
return undefined;
}
- const convert = order => {
+ const convert = (order) => {
if (["desc", false].includes(order)) {
return "desc";
}
@@ -107,7 +107,7 @@ export class Table {
accessIds(branch, ids) {
const map = branch[this.mapName];
- return ids.map(id => map[id]);
+ return ids.map((id) => map[id]);
}
idExists(branch, id) {
@@ -144,8 +144,8 @@ export class Table {
[this.mapName]: {},
};
const attrIndexes = Object.keys(this.fields)
- .filter(attr => attr !== this.idAttribute)
- .filter(attr => this.fields[attr].index)
+ .filter((attr) => attr !== this.idAttribute)
+ .filter((attr) => this.fields[attr].index)
.reduce(
(indexes, attr) => ({
...indexes,
@@ -181,7 +181,7 @@ export class Table {
const { idAttribute } = this;
- const optimallyOrderedClauses = sortBy(clauses, clause => {
+ const optimallyOrderedClauses = sortBy(clauses, (clause) => {
if (clauseFiltersByAttribute(clause, idAttribute)) {
return 1;
}
@@ -344,9 +344,10 @@ export class Table {
const indexesToAppendTo = Object.keys(workingState.indexes)
.filter(
- fkAttr => entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null
+ (fkAttr) =>
+ entry.hasOwnProperty(fkAttr) && entry[fkAttr] !== null
)
- .map(fkAttr => [fkAttr, entry[fkAttr]]);
+ .map((fkAttr) => [fkAttr, entry[fkAttr]]);
if (withMutations) {
ops.mutable.push(id, workingState[this.arrName]);
@@ -427,7 +428,7 @@ export class Table {
update(tx, branch, rows, mergeObj) {
const { batchToken, withMutations } = tx;
- const mergeObjInto = row => {
+ const mergeObjInto = (row) => {
const merge = withMutations
? ops.mutable.merge
: ops.batch.merge(batchToken);
@@ -436,7 +437,7 @@ export class Table {
const set = withMutations ? ops.mutable.set : ops.batch.set(batchToken);
- const indexedAttrs = Object.keys(branch.indexes).filter(attr =>
+ const indexedAttrs = Object.keys(branch.indexes).filter((attr) =>
mergeObj.hasOwnProperty(attr)
);
const indexIdsToAdd = [];
@@ -460,7 +461,7 @@ export class Table {
);
const id = result[this.idAttribute];
const nextRow = set(id, result, map);
- indexedAttrs.forEach(attr => {
+ indexedAttrs.forEach((attr) => {
const { [attr]: prevValue } = prevAttrValues;
const { [attr]: nextValue } = nextAttrValues;
if (prevValue === nextValue) {
@@ -523,7 +524,7 @@ export class Table {
{
[value]: ops.batch.filter(
batchToken,
- rowId => rowId !== id,
+ (rowId) => rowId !== id,
indexMap[attr][value]
),
},
@@ -561,17 +562,17 @@ export class Table {
const { arrName, mapName } = this;
const arr = branch[arrName];
- const idsToDelete = rows.map(row => row[this.idAttribute]);
+ const idsToDelete = rows.map((row) => row[this.idAttribute]);
if (withMutations) {
- idsToDelete.forEach(id => {
+ idsToDelete.forEach((id) => {
const idx = arr.indexOf(id);
ops.mutable.splice(idx, 1, [], arr);
ops.mutable.omit(id, branch[mapName]);
});
// delete ids from all indexes
- Object.values(branch.indexes).forEach(attrIndex =>
- Object.values(attrIndex).forEach(valueIndex =>
- idsToDelete.forEach(id => {
+ Object.values(branch.indexes).forEach((attrIndex) =>
+ Object.values(attrIndex).forEach((valueIndex) =>
+ idsToDelete.forEach((id) => {
const idx = valueIndex.indexOf(id);
if (idx !== -1) {
ops.mutable.splice(idx, 1, [], valueIndex);
@@ -592,7 +593,7 @@ export class Table {
(attrIndexMap, [value, valueIndex]) => {
attrIndexMap[value] = ops.batch.filter(
batchToken,
- id => !idsToDelete.includes(id),
+ (id) => !idsToDelete.includes(id),
valueIndex
);
return attrIndexMap;
@@ -613,7 +614,7 @@ export class Table {
{
[arrName]: ops.batch.filter(
batchToken,
- id => !idsToDelete.includes(id),
+ (id) => !idsToDelete.includes(id),
branch[arrName]
),
[mapName]: ops.batch.omit(
diff --git a/node_modules/redux-orm/src/descriptors.js b/node_modules/redux-orm/src/descriptors.js
index 6344e86..84fbc11 100644
--- a/node_modules/redux-orm/src/descriptors.js
+++ b/node_modules/redux-orm/src/descriptors.js
@@ -166,14 +166,14 @@ function manyToManyDescriptor(
* referenced by any instance of the current model
*/
const referencedOtherIds = new Set(
- throughQs.toRefArray().map(obj => obj[otherReferencingField])
+ throughQs.toRefArray().map((obj) => obj[otherReferencingField])
);
/**
* selects all instances of other model that are referenced
* by any instance of the current model
*/
- const qs = OtherModel.filter(otherModelInstance =>
+ const qs = OtherModel.filter((otherModelInstance) =>
referencedOtherIds.has(
otherModelInstance[OtherModel.idAttribute]
)
@@ -190,21 +190,21 @@ function manyToManyDescriptor(
qs.add = function add(...entities) {
const idsToAdd = new Set(entities.map(normalizeEntity));
- const existingQs = throughQs.filter(through =>
+ const existingQs = throughQs.filter((through) =>
idsToAdd.has(through[otherReferencingField])
);
if (existingQs.exists()) {
const existingIds = existingQs
.toRefArray()
- .map(through => through[otherReferencingField]);
+ .map((through) => through[otherReferencingField]);
throw new Error(
`Tried to add already existing ${OtherModel.modelName} id(s) ${existingIds} to the ${ThisModel.modelName} instance with id ${thisId}`
);
}
- idsToAdd.forEach(id => {
+ idsToAdd.forEach((id) => {
ThroughModel.create({
[otherReferencingField]: id,
[thisReferencingField]: thisId,
@@ -235,7 +235,7 @@ function manyToManyDescriptor(
qs.remove = function remove(...entities) {
const idsToRemove = new Set(entities.map(normalizeEntity));
- const entitiesToDelete = throughQs.filter(through =>
+ const entitiesToDelete = throughQs.filter((through) =>
idsToRemove.has(through[otherReferencingField])
);
@@ -243,10 +243,10 @@ function manyToManyDescriptor(
// Tried deleting non-existing entities.
const entitiesToDeleteIds = entitiesToDelete
.toRefArray()
- .map(through => through[otherReferencingField]);
+ .map((through) => through[otherReferencingField]);
const unexistingIds = [...idsToRemove].filter(
- id => !entitiesToDeleteIds.includes(id)
+ (id) => !entitiesToDeleteIds.includes(id)
);
throw new Error(
diff --git a/node_modules/redux-orm/src/fields/ManyToMany.js b/node_modules/redux-orm/src/fields/ManyToMany.js
index 5b49ab1..c8b2747 100644
--- a/node_modules/redux-orm/src/fields/ManyToMany.js
+++ b/node_modules/redux-orm/src/fields/ManyToMany.js
@@ -98,8 +98,8 @@ export class ManyToMany extends RelationalField {
* determine which field references which model
* and infer the directions from that
*/
- const throughModelFieldReferencing = otherModel =>
- Object.keys(throughModel.fields).find(someFieldName =>
+ const throughModelFieldReferencing = (otherModel) =>
+ Object.keys(throughModel.fields).find((someFieldName) =>
throughModel.fields[someFieldName].references(otherModel)
);
diff --git a/node_modules/redux-orm/src/memoize.js b/node_modules/redux-orm/src/memoize.js
index b9f7c86..f5ef592 100644
--- a/node_modules/redux-orm/src/memoize.js
+++ b/node_modules/redux-orm/src/memoize.js
@@ -3,7 +3,7 @@ import { STATE_FLAG } from "./constants";
const defaultEqualityCheck = (a, b) => a === b;
export const eqCheck = defaultEqualityCheck;
-const isOrmState = arg =>
+const isOrmState = (arg) =>
arg && typeof arg === "object" && arg.hasOwnProperty(STATE_FLAG);
const argsAreEqual = (lastArgs, nextArgs, equalityCheck) =>
@@ -14,7 +14,7 @@ const argsAreEqual = (lastArgs, nextArgs, equalityCheck) =>
);
const rowsAreEqual = (ids, rowsA, rowsB) =>
- ids.every(id => rowsA[id] === rowsB[id]);
+ ids.every((id) => rowsA[id] === rowsB[id]);
const accessedModelInstancesAreEqual = (previous, ormState, orm) => {
const { accessedInstances } = previous;
@@ -41,7 +41,7 @@ const accessedIndexesAreEqual = (previous, ormState) => {
return Object.entries(accessedIndexes).every(([modelName, indexes]) =>
Object.entries(indexes).every(([column, values]) =>
values.every(
- value =>
+ (value) =>
previous.ormState[modelName].indexes[column][value] ===
ormState[modelName].indexes[column][value]
)
@@ -51,7 +51,7 @@ const accessedIndexesAreEqual = (previous, ormState) => {
const fullTableScannedModelsAreEqual = (previous, ormState) =>
previous.fullTableScannedModels.every(
- modelName => previous.ormState[modelName] === ormState[modelName]
+ (modelName) => previous.ormState[modelName] === ormState[modelName]
);
/**
@@ -160,7 +160,7 @@ export function memoize(func, argEqualityCheck = defaultEqualityCheck, orm) {
*/
const session = orm.session(ormState);
/* Replace all ORM state arguments by the session above */
- const argsWithSession = args.map(arg =>
+ const argsWithSession = args.map((arg) =>
isOrmState(arg) ? session : arg
);
diff --git a/node_modules/redux-orm/src/redux.js b/node_modules/redux-orm/src/redux.js
index 94a1b9e..603769d 100644
--- a/node_modules/redux-orm/src/redux.js
+++ b/node_modules/redux-orm/src/redux.js
@@ -19,7 +19,7 @@ import MapSelectorSpec from "./selectors/MapSelectorSpec";
* @global
*/
export function defaultUpdater(session, action) {
- session.sessionBoundModels.forEach(modelClass => {
+ session.sessionBoundModels.forEach((modelClass) => {
if (typeof modelClass.reducer === "function") {
// This calls this.applyUpdate to update this.state
modelClass.reducer(action, modelClass, session);
diff --git a/node_modules/redux-orm/src/selectors/MapSelectorSpec.js b/node_modules/redux-orm/src/selectors/MapSelectorSpec.js
index 095c9de..c971d12 100644
--- a/node_modules/redux-orm/src/selectors/MapSelectorSpec.js
+++ b/node_modules/redux-orm/src/selectors/MapSelectorSpec.js
@@ -18,12 +18,12 @@ export default class MapSelectorSpec extends ModelBasedSelectorSpec {
*/
const parentResult = parentSelector(state, ...other);
const idArg = idArgSelector(state, ...other);
- const single = refArray => {
+ const single = (refArray) => {
if (refArray === null) {
// an intermediate field could not be resolved
return null;
}
- return refArray.map(ref =>
+ return refArray.map((ref) =>
this._selector(state, ref[idAttribute])
);
};
diff --git a/node_modules/redux-orm/src/selectors/ModelBasedSelectorSpec.js b/node_modules/redux-orm/src/selectors/ModelBasedSelectorSpec.js
index 1c754d0..13b00f8 100644
--- a/node_modules/redux-orm/src/selectors/ModelBasedSelectorSpec.js
+++ b/node_modules/redux-orm/src/selectors/ModelBasedSelectorSpec.js
@@ -12,12 +12,12 @@ export default class ModelBasedSelectorSpec extends SelectorSpec {
if (typeof idArg === "undefined") {
return ModelClass.all()
.toModelArray()
- .map(instance =>
+ .map((instance) =>
this.valueForInstance(instance, session, ...other)
);
}
if (Array.isArray(idArg)) {
- return idArg.map(id =>
+ return idArg.map((id) =>
this.valueForInstance(
ModelClass.withId(id),
session,
diff --git a/node_modules/redux-orm/src/selectors/ModelSelectorSpec.js b/node_modules/redux-orm/src/selectors/ModelSelectorSpec.js
index 3609bfe..65800e6 100644
--- a/node_modules/redux-orm/src/selectors/ModelSelectorSpec.js
+++ b/node_modules/redux-orm/src/selectors/ModelSelectorSpec.js
@@ -21,7 +21,7 @@ export default class ModelSelectorSpec extends SelectorSpec {
return ModelClass.all().toRefArray();
}
if (Array.isArray(idArg)) {
- return idArg.map(id => {
+ return idArg.map((id) => {
const instance = ModelClass.withId(id);
return instance ? instance.ref : null;
});
diff --git a/node_modules/redux-orm/src/utils.js b/node_modules/redux-orm/src/utils.js
index da0436f..2066ee4 100644
--- a/node_modules/redux-orm/src/utils.js
+++ b/node_modules/redux-orm/src/utils.js
@@ -99,7 +99,7 @@ function attachQuerySetMethods(modelClass, querySetClass) {
// There is no way to get a property descriptor for the whole prototype chain;
// only from an objects own properties. Therefore we traverse the whole prototype
// chain for querySet.
- forEachSuperClass(querySetClass, cls => {
+ forEachSuperClass(querySetClass, (cls) => {
for (let i = 0; i < leftToDefine.length; i++) {
let defined = false;
const methodName = leftToDefine[i];
@@ -175,9 +175,9 @@ function objectShallowEquals(a, b) {
/** */
function arrayDiffActions(sourceArr, targetArr) {
- const itemsInBoth = sourceArr.filter(item => targetArr.includes(item));
- const deleteItems = sourceArr.filter(item => !itemsInBoth.includes(item));
- const addItems = targetArr.filter(item => !itemsInBoth.includes(item));
+ const itemsInBoth = sourceArr.filter((item) => targetArr.includes(item));
+ const deleteItems = sourceArr.filter((item) => !itemsInBoth.includes(item));
+ const addItems = targetArr.filter((item) => !itemsInBoth.includes(item));
if (deleteItems.length || addItems.length) {
return {