{"version":3,"file":"assets/js/pcf_bundle_content.js","mappings":"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","sources":["webpack:///../node_modules/element-remove/index.js","webpack:///../node_modules/eligrey-classlist-js-polyfill/classList.js","webpack:///../node_modules/smart-timeout/index.js","webpack:///../node_modules/smart-timeout/lib/timeout.js","webpack:///./typescript/PCF/flyout-content-controller.ts","webpack:///./typescript/PCF/flyout-content.ts","webpack:///./typescript/PCF/flyout-controller.ts","webpack:///./typescript/PCF/notification-service.ts","webpack:///./typescript/PCF/stickyFlyOutNotificationService.ts","webpack:///./typescript/TP/CompareButton.ts","webpack:///./typescript/TP/MobileToolbarButton.ts","webpack:///./typescript/TP/TileScaleButton.ts","webpack:///./typescript/TP/TileScaleButtonEx.ts","webpack:///./typescript/TP/TouchPointFactory.ts","webpack:///./typescript/TP/TouchPointIdentifier.ts","webpack:///./typescript/errorhandler.ts","webpack:///./typescript/helpers/MpcScopeDetection.ts","webpack:///./typescript/helpers/MpcSettings.ts","webpack:///./typescript/helpers/call-limiter.ts","webpack:///./typescript/helpers/comparePageButtonUrlUpdater.ts","webpack:///./typescript/helpers/deviceDetectionHelper.ts","webpack:///./typescript/helpers/event-bus.ts","webpack:///./typescript/helpers/htmlElementsHelper.ts","webpack:///./typescript/helpers/navigationService.ts","webpack:///./typescript/helpers/polyfills.ts","webpack:///./typescript/helpers/scrollLock.ts","webpack:///./typescript/helpers/vanillajax.ts","webpack:///./typescript/local-storage-service.ts","webpack:///../node_modules/axios/dist/browser/axios.cjs","webpack:///webpack/bootstrap","webpack:///webpack/runtime/global","webpack:///webpack/runtime/make namespace object","webpack:///./pcf-bundle-content.ts"],"sourcesContent":["(function (arr) {\n  arr.forEach(function (item) {\n    if (item.hasOwnProperty('remove')) {\n      return;\n    }\n    Object.defineProperty(item, 'remove', {\n      configurable: true,\n      enumerable: true,\n      writable: true,\n      value: function remove() {\n        this.parentNode && this.parentNode.removeChild(this);\n      }\n    });\n  });\n})([Element.prototype, CharacterData.prototype, DocumentType.prototype].filter(Boolean));\n","/*\n * classList.js: Cross-browser full element.classList implementation.\n * 1.2.20180112\n *\n * By Eli Grey, http://eligrey.com\n * License: Dedicated to the public domain.\n *   See https://github.com/eligrey/classList.js/blob/master/LICENSE.md\n */\n\n/*global self, document, DOMException */\n\n/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */\n\nif (\"document\" in self) {\n\n// Full polyfill for browsers with no classList support\n// Including IE < Edge missing SVGElement.classList\nif (\n\t   !(\"classList\" in document.createElement(\"_\")) \n\t|| document.createElementNS\n\t&& !(\"classList\" in document.createElementNS(\"http://www.w3.org/2000/svg\",\"g\"))\n) {\n\n(function (view) {\n\n\"use strict\";\n\nif (!('Element' in view)) return;\n\nvar\n\t  classListProp = \"classList\"\n\t, protoProp = \"prototype\"\n\t, elemCtrProto = view.Element[protoProp]\n\t, objCtr = Object\n\t, strTrim = String[protoProp].trim || function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, \"\");\n\t}\n\t, arrIndexOf = Array[protoProp].indexOf || function (item) {\n\t\tvar\n\t\t\t  i = 0\n\t\t\t, len = this.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tif (i in this && this[i] === item) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t// Vendors: please allow content code to instantiate DOMExceptions\n\t, DOMEx = function (type, message) {\n\t\tthis.name = type;\n\t\tthis.code = DOMException[type];\n\t\tthis.message = message;\n\t}\n\t, checkTokenAndGetIndex = function (classList, token) {\n\t\tif (token === \"\") {\n\t\t\tthrow new DOMEx(\n\t\t\t\t  \"SYNTAX_ERR\"\n\t\t\t\t, \"The token must not be empty.\"\n\t\t\t);\n\t\t}\n\t\tif (/\\s/.test(token)) {\n\t\t\tthrow new DOMEx(\n\t\t\t\t  \"INVALID_CHARACTER_ERR\"\n\t\t\t\t, \"The token must not contain space characters.\"\n\t\t\t);\n\t\t}\n\t\treturn arrIndexOf.call(classList, token);\n\t}\n\t, ClassList = function (elem) {\n\t\tvar\n\t\t\t  trimmedClasses = strTrim.call(elem.getAttribute(\"class\") || \"\")\n\t\t\t, classes = trimmedClasses ? trimmedClasses.split(/\\s+/) : []\n\t\t\t, i = 0\n\t\t\t, len = classes.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tthis.push(classes[i]);\n\t\t}\n\t\tthis._updateClassName = function () {\n\t\t\telem.setAttribute(\"class\", this.toString());\n\t\t};\n\t}\n\t, classListProto = ClassList[protoProp] = []\n\t, classListGetter = function () {\n\t\treturn new ClassList(this);\n\t}\n;\n// Most DOMException implementations don't allow calling DOMException's toString()\n// on non-DOMExceptions. Error's toString() is sufficient here.\nDOMEx[protoProp] = Error[protoProp];\nclassListProto.item = function (i) {\n\treturn this[i] || null;\n};\nclassListProto.contains = function (token) {\n\treturn ~checkTokenAndGetIndex(this, token + \"\");\n};\nclassListProto.add = function () {\n\tvar\n\t\t  tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tif (!~checkTokenAndGetIndex(this, token)) {\n\t\t\tthis.push(token);\n\t\t\tupdated = true;\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.remove = function () {\n\tvar\n\t\t  tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t\t, index\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tindex = checkTokenAndGetIndex(this, token);\n\t\twhile (~index) {\n\t\t\tthis.splice(index, 1);\n\t\t\tupdated = true;\n\t\t\tindex = checkTokenAndGetIndex(this, token);\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.toggle = function (token, force) {\n\tvar\n\t\t  result = this.contains(token)\n\t\t, method = result ?\n\t\t\tforce !== true && \"remove\"\n\t\t:\n\t\t\tforce !== false && \"add\"\n\t;\n\n\tif (method) {\n\t\tthis[method](token);\n\t}\n\n\tif (force === true || force === false) {\n\t\treturn force;\n\t} else {\n\t\treturn !result;\n\t}\n};\nclassListProto.replace = function (token, replacement_token) {\n\tvar index = checkTokenAndGetIndex(token + \"\");\n\tif (~index) {\n\t\tthis.splice(index, 1, replacement_token);\n\t\tthis._updateClassName();\n\t}\n}\nclassListProto.toString = function () {\n\treturn this.join(\" \");\n};\n\nif (objCtr.defineProperty) {\n\tvar classListPropDesc = {\n\t\t  get: classListGetter\n\t\t, enumerable: true\n\t\t, configurable: true\n\t};\n\ttry {\n\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t} catch (ex) { // IE 8 doesn't support enumerable:true\n\t\t// adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36\n\t\t// modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected\n\t\tif (ex.number === undefined || ex.number === -0x7FF5EC54) {\n\t\t\tclassListPropDesc.enumerable = false;\n\t\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t\t}\n\t}\n} else if (objCtr[protoProp].__defineGetter__) {\n\telemCtrProto.__defineGetter__(classListProp, classListGetter);\n}\n\n}(self));\n\n}\n\n// There is full or partial native classList support, so just check if we need\n// to normalize the add/remove and toggle APIs.\n\n(function () {\n\t\"use strict\";\n\n\tvar testElement = document.createElement(\"_\");\n\n\ttestElement.classList.add(\"c1\", \"c2\");\n\n\t// Polyfill for IE 10/11 and Firefox <26, where classList.add and\n\t// classList.remove exist but support only one argument at a time.\n\tif (!testElement.classList.contains(\"c2\")) {\n\t\tvar createMethod = function(method) {\n\t\t\tvar original = DOMTokenList.prototype[method];\n\n\t\t\tDOMTokenList.prototype[method] = function(token) {\n\t\t\t\tvar i, len = arguments.length;\n\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\ttoken = arguments[i];\n\t\t\t\t\toriginal.call(this, token);\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t\tcreateMethod('add');\n\t\tcreateMethod('remove');\n\t}\n\n\ttestElement.classList.toggle(\"c3\", false);\n\n\t// Polyfill for IE 10 and Firefox <24, where classList.toggle does not\n\t// support the second argument.\n\tif (testElement.classList.contains(\"c3\")) {\n\t\tvar _toggle = DOMTokenList.prototype.toggle;\n\n\t\tDOMTokenList.prototype.toggle = function(token, force) {\n\t\t\tif (1 in arguments && !this.contains(token) === !force) {\n\t\t\t\treturn force;\n\t\t\t} else {\n\t\t\t\treturn _toggle.call(this, token);\n\t\t\t}\n\t\t};\n\n\t}\n\n\t// replace() polyfill\n\tif (!(\"replace\" in document.createElement(\"_\").classList)) {\n\t\tDOMTokenList.prototype.replace = function (token, replacement_token) {\n\t\t\tvar\n\t\t\t\t  tokens = this.toString().split(\" \")\n\t\t\t\t, index = tokens.indexOf(token + \"\")\n\t\t\t;\n\t\t\tif (~index) {\n\t\t\t\ttokens = tokens.slice(index);\n\t\t\t\tthis.remove.apply(this, tokens);\n\t\t\t\tthis.add(replacement_token);\n\t\t\t\tthis.add.apply(this, tokens.slice(1));\n\t\t\t}\n\t\t}\n\t}\n\n\ttestElement = null;\n}());\n\n}","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar timeout_1 = require(\"./lib/timeout\");\nmodule.exports = timeout_1.Timeout;\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n            r[k] = a[j];\n    return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MetadataRecord = /** @class */ (function () {\n    function MetadataRecord(callback, key, ms, params) {\n        this.callback = callback;\n        this.key = key;\n        this.ms = ms;\n        this.params = params;\n        this.paused = false;\n        this.startTime = new Date().getTime();\n        this.timeSpentWaiting = 0;\n    }\n    return MetadataRecord;\n}());\nvar Timeout = /** @class */ (function () {\n    function Timeout() {\n    }\n    /**\n     * clear timeout and optionally erase all knowledge of its existence\n     * @param key\n     * @param erase\n     */\n    Timeout.clear = function (key, erase) {\n        if (erase === void 0) { erase = true; }\n        clearTimeout(Timeout.keyId[key]);\n        delete Timeout.keyId[key];\n        delete Timeout.keyCall[key];\n        if (erase) {\n            delete Timeout.metadata[key];\n            delete Timeout.originalMs[key];\n        }\n    };\n    Timeout.set = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var key;\n        var ms;\n        var params;\n        var callback;\n        if (args.length === 0) {\n            throw Error('Timeout.set() requires at least one argument');\n        }\n        if (typeof args[1] === 'function') {\n            key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n        }\n        else {\n            callback = args[0], ms = args[1], params = args.slice(2);\n            key = callback.toString();\n        }\n        if (!callback) {\n            throw Error('Timeout.set() requires a callback parameter');\n        }\n        Timeout.clear(key);\n        var invoke = function () {\n            Timeout.metadata[key].executedTime = new Date().getTime();\n            callback.apply(void 0, params);\n        };\n        Timeout.keyId[key] = setTimeout(invoke, ms || 0);\n        Timeout.keyCall[key] = function () { return callback.apply(void 0, params); };\n        Timeout.originalMs[key] = Timeout.originalMs[key] || ms;\n        Timeout.metadata[key] = new MetadataRecord(callback, key, ms, params);\n        return function () { return Timeout.executed(key); };\n    };\n    Timeout.create = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        if (args.length === 0) {\n            throw Error('Timeout.create() requires at least one argument');\n        }\n        var key;\n        if (typeof args[1] === 'function') {\n            key = args[0];\n        }\n        else {\n            var callback = args[0];\n            key = callback.toString();\n        }\n        return Timeout.exists(key) ? false : Timeout.set.apply(Timeout, args);\n    };\n    /**\n     * elapsed time since the timeout was created\n     * @param key\n     */\n    Timeout.elapsed = function (key) {\n        var metaDataRecord = Timeout.metadata[key];\n        if (!metaDataRecord)\n            return 0;\n        return Math.max(0, new Date().getTime() - metaDataRecord.startTime);\n    };\n    /**\n     * timeout has been created\n     * @param key\n     */\n    Timeout.exists = function (key) {\n        return key in Timeout.keyId || (Timeout.metadata)[key] !== undefined;\n    };\n    /**\n     * fire the callback on demand, without affecting the timeout or meta data (execution time)\n     * @param key\n     * @returns {(false|any)} false if timeout does not exist or the return value of the callback\n     */\n    Timeout.call = function (key) {\n        return Timeout.exists(key) && (Timeout.keyCall)[key]();\n    };\n    /**\n     * test if a timeout has run\n     * @param key\n     */\n    Timeout.executed = function (key) {\n        return Timeout.exists(key) && !!Timeout.metadata[key].executedTime;\n    };\n    /**\n     * when timeout was last executed\n     * @param key\n     */\n    Timeout.lastExecuted = function (key) {\n        return !Timeout.executed(key)\n            ? null\n            : new Date(Timeout.metadata[key].executedTime);\n    };\n    /**\n     * metadata about a timeout\n     * @param key\n     */\n    Timeout.meta = function (key) {\n        return Timeout.metadata[key];\n    };\n    /**\n     * timeout does exist, but has not yet run\n     * @param key\n     */\n    Timeout.pending = function (key) {\n        return Timeout.exists(key) && !Timeout.executed(key);\n    };\n    /**\n     * timeout does exist, but will not execute because it is paused\n     * @param key\n     */\n    Timeout.paused = function (key) {\n        return Timeout.exists(key)\n            && !Timeout.executed(key)\n            && Timeout.metadata[key].paused;\n    };\n    /**\n     * remaining time until timeout will occur\n     * @param key\n     */\n    Timeout.remaining = function (key) {\n        if (!Timeout.metadata[key])\n            return 0;\n        var metaDataRecord = Timeout.metadata[key];\n        return Timeout.paused(key)\n            ? metaDataRecord.ms - metaDataRecord.timeSpentWaiting\n            : Math.max(0, metaDataRecord.startTime + metaDataRecord.ms - new Date().getTime());\n    };\n    /**\n     * set timeout anew, optionally with new time and params\n     * @param key\n     * @param ms new millisecs before execution\n     * @param params new parameters to callback\n     */\n    Timeout.reset = function (key, ms) {\n        var params = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            params[_i - 2] = arguments[_i];\n        }\n        var metaDataRecord = Timeout.metadata[key];\n        if (!metaDataRecord)\n            return false;\n        Timeout.clear(key, false);\n        if (metaDataRecord.paused) {\n            metaDataRecord.paused = false;\n        }\n        return Timeout.set.apply(Timeout, __spreadArrays([key,\n            metaDataRecord.callback, ms !== null && ms !== void 0 ? ms : Timeout.originalMs[key]], (params || metaDataRecord.params)));\n    };\n    /**\n     * restart timeout with original time\n     * @param key\n     * @param force restart even even if not yet executed\n     */\n    Timeout.restart = function (key, force) {\n        if (force === void 0) { force = false; }\n        if (!Timeout.metadata[key] || (!force && Timeout.executed(key)))\n            return false;\n        var metaDataRecord = Timeout.metadata[key];\n        Timeout.clear(key, false);\n        if (metaDataRecord.paused) {\n            metaDataRecord.paused = false;\n        }\n        return Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, Timeout.originalMs[key]], metaDataRecord.params));\n    };\n    /**\n     * pause our execution countdown until we're ready for it to resume\n     * @param key\n     */\n    Timeout.pause = function (key) {\n        if (!Timeout.metadata[key] || Timeout.paused(key) || Timeout.executed(key))\n            return false;\n        Timeout.clear(key, false);\n        var metaDataRecord = Timeout.metadata[key];\n        metaDataRecord.paused = true;\n        metaDataRecord.timeSpentWaiting = new Date().getTime() - metaDataRecord.startTime;\n        return metaDataRecord.timeSpentWaiting;\n    };\n    /**\n     * resume paused Timeout with the remaining time\n     * @param key\n     */\n    Timeout.resume = function (key) {\n        if (!Timeout.metadata[key] || Timeout.executed(key))\n            return false;\n        var metaDataRecord = Timeout.metadata[key];\n        if (!metaDataRecord.paused)\n            return false;\n        var originalMs = Timeout.originalMs[key];\n        var remainingTime = metaDataRecord.ms - metaDataRecord.timeSpentWaiting;\n        var result = Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, remainingTime], metaDataRecord.params));\n        Timeout.originalMs[key] = originalMs;\n        return result;\n    };\n    Timeout.instantiate = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var key;\n        var ms;\n        var params;\n        var callback;\n        if (args.length === 0) {\n            throw Error('Timeout.set() requires at least one argument');\n        }\n        var linkToExisting = args.length === 1 && typeof args[0] !== 'function';\n        // hooking up to an existing timeout\n        if (linkToExisting) {\n            key = args[0];\n            var metadata = Timeout.meta(key);\n            if (!metadata) {\n                throw Error('Timeout.instantiate() attempted to link to nonexistent object by key');\n            }\n            ms = metadata.ms;\n            params = metadata.params;\n            callback = metadata.callback;\n        }\n        else if (typeof args[1] === 'function') {\n            key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n        }\n        else {\n            callback = args[0], ms = args[1], params = args.slice(2);\n            key = (\"\" + Math.random() + callback).replace(/\\s/g, '');\n        }\n        if (!callback) {\n            throw Error('Timeout.instantiate() requires a function parameter');\n        }\n        if (!linkToExisting) {\n            Timeout.set.apply(Timeout, __spreadArrays([key, callback, ms], params));\n        }\n        return {\n            call: function () { return Timeout.call(key); },\n            clear: function (erase) {\n                if (erase === void 0) { erase = true; }\n                return Timeout.clear(key, erase);\n            },\n            elapsed: function () { return Timeout.elapsed(key); },\n            executed: function () { return Timeout.executed(key); },\n            exists: function () { return Timeout.exists(key); },\n            lastExecuted: function () { return Timeout.lastExecuted(key); },\n            meta: function () { return Timeout.meta(key); },\n            pause: function () { return Timeout.pause(key); },\n            paused: function () { return Timeout.paused(key); },\n            pending: function () { return Timeout.pending(key); },\n            remaining: function () { return Timeout.remaining(key); },\n            reset: function (ms) {\n                var params = [];\n                for (var _i = 1; _i < arguments.length; _i++) {\n                    params[_i - 1] = arguments[_i];\n                }\n                return Timeout.reset.apply(Timeout, __spreadArrays([key, ms], params));\n            },\n            restart: function () { return Timeout.restart(key); },\n            resume: function () { return Timeout.resume(key); },\n            set: function (newCallback, newMs) {\n                if (newMs === void 0) { newMs = 0; }\n                var newParams = [];\n                for (var _i = 2; _i < arguments.length; _i++) {\n                    newParams[_i - 2] = arguments[_i];\n                }\n                return Timeout.set.apply(Timeout, __spreadArrays([key, newCallback, newMs], newParams));\n            },\n        };\n    };\n    Timeout.keyId = {};\n    Timeout.keyCall = {};\n    Timeout.originalMs = {};\n    Timeout.metadata = {};\n    return Timeout;\n}());\nexports.Timeout = Timeout;\n//# sourceMappingURL=timeout.js.map","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCFlyoutContent } from \"./flyout-content\";\nimport { MPCNotificationService } from \"./notification-service\";\nimport { MPCNavigationService } from \"../helpers/navigationService\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { ProductComparisonModel, Product } from \"../../../Models/Product.generated\";\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\nimport { MPCLocalStorageService } from \"../local-storage-service\";\nimport { MPCScopeDetection } from \"../helpers/MpcScopeDetection\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\n\nconst ArrowUpIcon = require(\"../../images/arrow-up.svg\") as string;\nconst ArrowRightIcon = require(\"../../images/arrow-right-2021.svg\") as string;\n\nexport module MPCFlyoutContentController {\n    import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n    import NotificationService = MPCNotificationService.NotificationService;\n    import FlyoutContent = MPCFlyoutContent.FlyoutContent;\n    import NavigationService = MPCNavigationService.NavigationService;\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n    import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\n    import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n    import ScopeDetection = MPCScopeDetection.ScopeDetection;\n    import MpcSettings = MpcSettingsModule.MpcSettings;\n\n    export class FlyoutContentController implements IFlyoutContentController {\n        private flyoutContentObject: FlyoutContent;\n        private static _instance: FlyoutContentController;\n        private flyoutContentContainer: HTMLElement;\n        private readonly flyoutContentScope: HTMLElement;\n        private notificationService: NotificationService;\n        private navigationService: NavigationService;\n        private flyoutHeader: HTMLElement;\n        private deviceDetectionHelper: DeviceDetectionHelper;\n        private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\n        private productComparisonModelManager: ProductComparisonModelManager;\n        private flyoutIconContainer: HTMLElement;\n        private disabledFromFocus: boolean;\n        \n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n        \n        constructor() {\n            this.flyoutContentScope = document.querySelector('.pcf-flyout-content-scope');\n\n            if (!this.flyoutContentScope) {\n                return;\n            }\n\n            this.init();\n            this.handleFicClick = this.handleFicClick.bind(this);\n        }\n        \n        private init(): void {\n            this.disabledFromFocus = true;\n            this.flyoutIconContainer = document.querySelector('.pcf-scope');\n\n            MpcSettings.instance.init(this.flyoutIconContainer);\n\n            this.loadFlyoutIcons();\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n            this.notificationService = NotificationService.instance;\n            this.notificationService.flyoutContentController = this;\n\n            if(!this.deviceDetectionHelper.isMobileShop()) {\n                this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\n                this.comparePageButtonUrlUpdater.init(this.flyoutContentScope);\n            }\n\n            // check local storage\n            this.productComparisonModelManager = ProductComparisonModelManager.instance;\n            this.checkCurrentLocalStorage();\n            \n            this.flyoutContentContainer = this.flyoutContentScope.querySelector('.flyout');\n            this.flyoutHeader = this.flyoutContentContainer.querySelector('.flyout-header');\n\n            this.flyoutContentObject = new FlyoutContent();\n\n            this.navigationService = NavigationService.instance;\n            this.navigationService.init(this.flyoutHeader, 'data-pcf-navigation-key', this.flyoutContentObject);\n\n            const closeFlyoutBtn = this.flyoutHeader.querySelector('.close-flyout-btn');\n\n            this.flyoutContentObject.init(this.flyoutContentContainer, this.navigationService, this, closeFlyoutBtn);\n            \n            // close/show flyout events\n            this.registerEventHandlers();\n        }\n\n        private loadFlyoutIcons(): void {\n            const closeArrow: HTMLElement = this.flyoutContentScope.querySelector('.close-arrow');\n            const compareButtonIcon: HTMLElement = this.flyoutContentScope.querySelector('.compare-button-icon');\n\n            closeArrow.innerHTML = ArrowUpIcon;\n            compareButtonIcon.innerHTML = ArrowRightIcon;\n        }\n\n        private registerEventHandlers(): void {\n            // For tab navigation:\n            this.flyoutIconContainer.addEventListener('click', () => { this.handleFicClick() });\n\n            const titleContainer: HTMLElement = this.flyoutHeader.querySelector('.title-container');\n            const titleCloseFlyoutBtn: HTMLElement = titleContainer.querySelector('.close-flyout-btn');\n            titleCloseFlyoutBtn.addEventListener('click', () => { this.handleCloseClickFromFlyoutFragment() });           \n\n            window.shell.subscribeTo('ESMKT.HeadR.FlyoutClosed', () => { this.cleanUpEmptyContent(); }, 'ESMKT.HeadR.FlyoutClosed');\n        }\n\n        private handleFicClick(): void {\n            this.disabledFromFocus = !this.disabledFromFocus;\n            this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\n            this.flyoutContentScope.toggleAttribute('group', !this.disabledFromFocus);\n        }\n\n        public hideFlyoutContent(): void {\n            this.flyoutContentContainer.classList.remove('pcf-show-flyout');\n        }\n\n        public handleFlyoutIconClick(): void {\n            if (!this.flyoutContentContainer.classList.toggle('pcf-show-flyout')) {\n                this.cleanUpEmptyContent();\n            }\n        }\n\n        private handleCloseClickFromFlyoutFragment(): void {\n            window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n            this.cleanUpEmptyContent();\n        }\n\n        public refresh(model: ProductComparisonModel): void {\n            this.flyoutContentObject.refresh(model);\n            if (model && model.activeNavigationTab) {\n                const newTabActivated: boolean = this.flyoutContentObject.setActiveNavigationTab(model.activeNavigationTab);\n                \n                // in case when user click go to category page from empty tab with removed all products. \n                // We will still have same active tab, because another one was not clicked yet.\n                if(!newTabActivated) {\n                    this.flyoutContentObject.updateContainerListVisibility(this.navigationService.markAnyNavigationTabActive());\n                }\n            }\n        }\n\n        public addProduct(salesArticleVariantKey: string, seoSlug: string, origin: string): void {\n            this.flyoutContentObject.addProduct(salesArticleVariantKey, seoSlug, origin).then((product: Product) => {\n                this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\n            });\n\n            // show Pcf Scope:\n            if (!this.deviceDetectionHelper.isMobileShop()) {\n                window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\n            }\n        }\n\n        public addProductByCompareLink(maNo: number, colorCode: number): void {\n            this.flyoutContentObject.addProductByMasterArticleNo(maNo, colorCode, \"content-page\").then((product: Product) => {\n                this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\n            });\n\n            // show Pcf Scope:\n            if (!this.deviceDetectionHelper.isMobileShop()) {\n                window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\n            }\n        }\n\n        public removeProductTP(salesArticleVariantKey: string): void {\n            this.flyoutContentObject.removeProductTP(salesArticleVariantKey);\n            \n            this.cleanUpEmptyContent();\n        }\n\n        public updateProductsCounter(counterNumber: number): void {\n            const productsCounter: HTMLElement = this.flyoutIconContainer.querySelector('.products-counter');\n            \n            let counter: number = Number(productsCounter.textContent.trim());\n            counter += counterNumber;\n            \n            productsCounter.innerText = counter.toString();\n        }\n\n        private cleanUpEmptyContent(): void {\n            this.disabledFromFocus = true;\n            this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\n\n            this.flyoutContentObject.removeEmptyContainerList();\n            this.navigationService.removeEmptyNavigationTabs();\n\n            if (this.isFlyoutContentEmpty()) {\n                if (!this.deviceDetectionHelper.isMobileShop()) {\n                    window.shell.publishTo('ManualProductComparison.HidePcfScope', undefined);\n                }\n            }\n        }\n\n        private isFlyoutContentEmpty(): boolean {\n            return this.flyoutContentObject.isFlyoutContentEmpty();\n        }\n\n        private announceNavigationTabCleanUpOutsidePcp(productComparisonModel: ProductComparisonModel): void {\n            const emptyNavigationTabs = productComparisonModel.emptyNavigationTabs;\n\n            if (emptyNavigationTabs.length && ScopeDetection.hasScopes(false, true))\n                this.productComparisonModelManager.setClearStoredEmptyNavigationTabs(true);\n        }\n\n        private checkCurrentLocalStorage(): void {\n            this.productComparisonModelManager.getModel()\n                .then((productComparisonModel: ProductComparisonModel) => {\n                    if (productComparisonModel && productComparisonModel.products && productComparisonModel.products.length > 0) {\n                        // init and update flyout:\n                        this.refresh(productComparisonModel);\n                    }\n                    else {\n                        // clear existing flyout content\n                        this.refresh(null);\n                    }\n                    this.announceNavigationTabCleanUpOutsidePcp(productComparisonModel);\n                });\n        }\n\n        public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\n            return this.productComparisonModelManager.checkIsProductAlreadyAdded(salesArticleVariantKey);\n        }\n\n    }\n}\n\nif (window.shell)\n    MPCFlyoutContentController.FlyoutContentController.instance;","import { MPCLocalStorageService } from \"../local-storage-service\";\nimport {MPCAddElementContext} from \"../typings/addElementContext\";\nimport {MPCGetProductInfoByCompareLinkContext} from '../typings/GetProductInfoByCompareLinkContext';\nimport {NlVanillajax, INlVanillajaxParams} from \"../helpers/vanillajax\";\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\nimport {MPCIAbstractContent} from \"../typings/iAbstractContent\";\nimport { MPCIFlyoutContentController} from \"../typings/iFlyoutContentController\";\nimport {MPCEventBus} from \"../helpers/event-bus\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\nimport { ProductComparisonModel, Product } from \"../../../Models/Product.generated\";\nconst RecycleBinIcon = require(\"../../images/icon_remove.svg\") as string;\nconst PlusIcon = require(\"../../images/plus-2021.svg\") as string;\nimport { MPCErrorHandlerModule } from \"../errorhandler\";\nimport { ErrorMessage } from \"../../../Models/ErrorMessage.generated\";\n\nexport module MPCFlyoutContent {\n    import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n    import AddElementContext = MPCAddElementContext.AddElementContext;\n    import GetProductInfoByCompareLinkContext = MPCGetProductInfoByCompareLinkContext.GetProductInfoByCompareLinkContext;\n    import INavigationService = MPCINavigationService.INavigationService;\n    import IAbstractContent = MPCIAbstractContent.IAbstractContent;\n    import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n    import EventBus = MPCEventBus.EventBus;\n    import MpcSettings = MpcSettingsModule.MpcSettings;\n    import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\n\n    export class FlyoutContent implements IAbstractContent {\n        private productComparisonModelManager: ProductComparisonModelManager;\n        private eventBus: EventBus;\n        private listContainersArray: Array<HTMLElement>;\n        private flyoutContent: HTMLElement;\n        private navigationService: INavigationService;\n        private oldListContainer: HTMLElement;\n        private iFlyoutContentController: IFlyoutContentController;\n        private emptyProductSlotTitle: string;\n        private clearFlyoutCategoryBtnTitle: string;\n        private activeCategoryTabName: string;\n        private closeFlyoutBtn: Element;\n\n        init(flyout: Element, navigationService: INavigationService, iFlyoutContentController: IFlyoutContentController, closeFlyoutBtn: Element): void {\n            this.productComparisonModelManager = ProductComparisonModelManager.instance;\n            this.eventBus = MPCEventBus.EventBus.instance;\n            this.flyoutContent = flyout.querySelector('.flyout-content');\n            this.emptyProductSlotTitle = this.flyoutContent.getAttribute(\"data-EmptyProductSlotTitle\");\n            this.clearFlyoutCategoryBtnTitle = this.flyoutContent.getAttribute(\"data-ClearFlyoutCategoryBtnTitle\");\n            this.listContainersArray = new Array<HTMLElement>();\n            this.navigationService = navigationService;\n            this.iFlyoutContentController = iFlyoutContentController;\n            this.closeFlyoutBtn = closeFlyoutBtn;\n        }\n\n        private clearCategoryProducts(listContainer: HTMLElement): void {\n            const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n            const listItems: NodeListOf<HTMLElement> = itemsContainer.querySelectorAll('.list-item:not(.empty-list-item)');\n            const listItemsArray: Array<HTMLElement> = Array.prototype.slice.call(listItems);\n            \n            for (const listItem of listItemsArray) {\n                this.removeProduct(listContainer, listItem, true);\n            }\n\n            const categoryName: string = this.getListContainerCategoryName(listContainer);\n            this.productComparisonModelManager.removeAllProductsOfCategory(categoryName);\n        }\n\n        public refresh(model: ProductComparisonModel): void {\n            if(model && model.products && model.products.length) {\n                for (const newProduct of model.products) {\n                    this.addProductToFlyoutContent(newProduct);\n                }\n                if (!model.activeNavigationTab) {\n                    this.navigationService.markActiveNavigationTab(model.products[0].categoryName);\n                }\n            }\n            else {\n                if(this.listContainersArray) {\n                    for (const listContainer of this.listContainersArray) {\n                        this.clearCategoryProducts(listContainer);\n                    }\n                }\n            }\n        }\n        \n        public addProduct(savKey: string, seoSlug: string, origin: string): Promise<Product> {\n            const context: AddElementContext = new class implements AddElementContext {\n                salesArticleVariantKey: string;\n                originSeoSlug: string;\n                origin: string;\n            };\n            context.salesArticleVariantKey = savKey;\n            context.originSeoSlug = seoSlug;\n            context.origin = origin;\n\n            // Call controller method, via ajax, and get image and text info from MPC\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\n            params.data = JSON.stringify(context);\n\n            let nlVanillajax = new NlVanillajax(params);\n            let postWithPromise = nlVanillajax.postWithPromise<Product>();\n            postWithPromise.then((productDataFromService: Product) => {\n                    this.handleProductInfoToAdd(productDataFromService);\n                    return productDataFromService;\n                })\n                .catch((err) => {\n                    //TODO user notification\n                    //console.error('could not retrieve product info', err.statusText);\n                });\n             return postWithPromise;\n        }\n        \n        public addProductByMasterArticleNo(maNo: number, colorCode: number, origin: string): Promise<any> {\n            const context = {} as GetProductInfoByCompareLinkContext;\n            context.masterArticleNo = maNo;\n            context.colorCode = colorCode;\n            context.origin = origin;\n\n            // Call controller method, via ajax, and get image and text info from MPC\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfoByCompareLink\";\n            params.data = JSON.stringify(context);\n\n            return new NlVanillajax(params).postWithPromise()\n                .then((productDataFromService: Product) => {\n                    this.handleProductInfoToAdd(productDataFromService);\n                    return productDataFromService;\n                })\n                .catch((err) => {\n                    ErrorHandlerManager.instance.LogError(<ErrorMessage>{\n                        message: \"error getting product info because: \" +\n                            err +\n                            \", masterArticleNo: \" +\n                            maNo\n                    }); \n                });\n        }\n\n        private handleProductInfoToAdd(productDataFromService: Product) {\n            // Handle the response and add article or show notification for customer\n            let productAdded: MPCLocalStorageService.AddResult;\n\n            if (productDataFromService) {\n                productAdded = this.productComparisonModelManager.addProduct(productDataFromService);\n                if (productAdded === MPCLocalStorageService.AddResult.Added) {\n                    this.addProductToFlyoutContent(productDataFromService);\n\n                    // notify touch points that products are added\n                    this.eventBus.publish(\"flyout.product-added\", productDataFromService.articleId.salesArticleVariantKey);\n                } else if (productAdded === MPCLocalStorageService.AddResult.Replaced) {\n                    this.changeProductVariantInFlyoutContent(productDataFromService);\n                    this.eventBus.publish(\"flyout.product-replaced\", productDataFromService.articleId.salesArticleVariantKey);\n                }\n                if (productAdded !== MPCLocalStorageService.AddResult.RejectedCapacity) {\n                    this.setActiveNavigationTab(productDataFromService.categoryName);\n                }\n            }\n        }\n\n        private removeProduct(listContainer: HTMLElement, listItem: HTMLElement, onlyDom: boolean = false): void {\n            // current element will be removed from DOM, so we need to move to next one:\n            if (window.shell.tabNav !== undefined)\n                window.shell.tabNav.focusNext();\n\n            const categoryName: string = this.getListContainerCategoryName(listContainer);\n            const savKey: string = listItem.getAttribute('data-pcf-sav-key');\n            const categoryUrl: string = listContainer.getAttribute('data-pcf-categoryUrl');\n            const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n\n            let productRemoved: boolean = true;\n            if (!onlyDom) {\n                // call remove method on service:\n                productRemoved = this.productComparisonModelManager.removeProduct(categoryName, savKey) != null;\n            }\n\n            if (productRemoved) {\n                // store order number before item will be removed from list:\n                const tabOrder = listItem.getAttribute('order');\n\n                // remove product from flyout:\n                itemsContainer.removeChild(listItem);\n                itemsContainer.appendChild(this.createEmptyListItem(categoryUrl, tabOrder));\n\n                // update flyout header\n                this.navigationService.createOrUpdateNavigationTab(categoryName, -1, null, null);\n                this.iFlyoutContentController.updateProductsCounter(-1);\n\n                // notify touch points and flyout footer\n                this.eventBus.publish(\"flyout.product-removed\", savKey);\n            }\n        }\n\n        private changeProductVariantInFlyoutContent(newProduct: Product): void {\n            let categoryName: string;\n            for (const listContainer of this.listContainersArray) {\n                categoryName = this.getListContainerCategoryName(listContainer);\n\n                if (categoryName == newProduct.categoryName) {\n                    for (const item of this.getContainerListItems(listContainer)) {\n                        if (item.getAttribute(\"data-pcf-masterArticleNo\") === newProduct.articleId.masterArticleNo.toString()) {\n                            item.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\n                            item.setAttribute('href', newProduct.detailsPageUrl);\n                            item.querySelector('.image-slot').setAttribute('src', newProduct.mainImage);\n                            item.querySelector('.image-slot').setAttribute('alt', newProduct.altTag);\n                        }\n                    }\n                    break;\n                }\n            }\n        }\n\n        private addProductToFlyoutContent(newProduct: Product): void {\n            let currentListContainer: HTMLElement;\n            let listContainerNotExists: boolean = true;\n            let categoryName: string;\n\n            // look for \"list-container\" with same categoryName or create new one\n            for (const listContainer of this.listContainersArray) {\n                categoryName = this.getListContainerCategoryName(listContainer);\n            \n                if(categoryName === newProduct.categoryName)\n                {\n                    this.createListItem(listContainer, newProduct);\n                    currentListContainer = listContainer;\n                    listContainerNotExists = false;\n                    break;\n                }\n                else {\n                    listContainerNotExists = true;\n                }\n            }\n\n            if (listContainerNotExists) {\n                let newListContainer: HTMLElement = this.createListContainer(newProduct);\n                this.createListItem(newListContainer, newProduct);\n                this.listContainersArray.push(newListContainer);\n                this.flyoutContent.appendChild(newListContainer);\n                currentListContainer = newListContainer;\n            }\n            \n            // hide old list container:\n            if (this.oldListContainer) {\n                this.oldListContainer.style.display = 'none';\n            }\n\n            currentListContainer.style.display = 'flex';\n            this.oldListContainer = currentListContainer;\n\n            // update navigation tab:\n            this.navigationService.createOrUpdateNavigationTab(newProduct.categoryName, 1, newProduct.navigationOrder, newProduct.articleId.salesArticleVariantKey);\n            this.iFlyoutContentController.updateProductsCounter(1);\n        }\n        \n        private createListContainer(newProduct: Product): HTMLElement {\n            const newListContainer: HTMLElement = document.createElement('div');\n            const newClearListBtn: HTMLElement = document.createElement('div');\n            const newItemsContainer: HTMLElement = document.createElement('div');\n            const btnId = 'cl_' + newProduct.categoryName;\n\n            newItemsContainer.className = 'items-container';\n            \n            newClearListBtn.className = 'clear-list-btn';\n            newClearListBtn.setAttribute('focusable', '');\n            newClearListBtn.setAttribute('order', '0');\n\n            newClearListBtn.innerHTML = this.clearFlyoutCategoryBtnTitle;\n            newClearListBtn.id = btnId;\n            newListContainer.className = 'list-container';\n            newListContainer.setAttribute('data-pcf-categoryName', newProduct.categoryName);\n            newListContainer.setAttribute('data-pcf-categoryUrl', newProduct.categoryUrl);\n            newListContainer.setAttribute('group', '');\n\n            newListContainer.appendChild(newClearListBtn);\n\n            // create empty list items:\n            for (let i: number = 0; i < MpcSettings.instance.maxProducts; i++) {\n                newItemsContainer.appendChild(\n                    this.createEmptyListItem(newProduct.categoryUrl, i.toString()));\n            }\n\n            newClearListBtn.addEventListener('click', () => { this.clearCategoryProducts(newListContainer) });\n            newListContainer.appendChild(newItemsContainer);\n\n            if (window.shell.tabNav !== undefined)\n                window.shell.tabNav.onActivated('#' + btnId, \n                    () => { window.shell.tabNav.focus(this.closeFlyoutBtn); });\n            \n            return newListContainer;\n        }\n        \n        private createEmptyListItem(categoryUrl: string, index: string): HTMLElement {\n            const newListItem: HTMLElement = document.createElement('a');\n            const newProductImageHolder = document.createElement('div');\n            const newRemoveProductButton = document.createElement('div');\n            const newProductDescription = document.createElement('div');\n            const plusIcon: HTMLElement = document.createElement('div');\n\n            plusIcon.setAttribute('class', 'mpc-plus');\n            plusIcon.innerHTML = PlusIcon;\n\n            newProductDescription.innerHTML = this.emptyProductSlotTitle;\n            newProductDescription.className = 'description-slot';\n            newRemoveProductButton.className = 'remove-item-container';\n            newProductImageHolder.className = 'image-holder';\n            newListItem.setAttribute(\"href\", categoryUrl);\n            newListItem.className = 'list-item empty-list-item';\n            newListItem.setAttribute('focusable', '');\n\n            newProductImageHolder.appendChild(plusIcon);\n            newListItem.appendChild(newProductImageHolder);\n            newListItem.appendChild(newRemoveProductButton);\n            newListItem.appendChild(newProductDescription);\n            \n            return newListItem;\n        }\n        \n        private createListItem(listContainer: HTMLElement, newProduct: Product): void {\n            const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n            const newListItem: HTMLElement = document.createElement('a');\n            const newProductImageHolder = document.createElement('div');\n            const newProductImageSlot = document.createElement('img');\n            const newRemoveProductButton: HTMLElement = document.createElement('div');\n            const newProductDescription = document.createElement('div');\n            const itemOriginDetailsPageUrl: string = newProduct.detailsPageUrl.indexOf('?') !== -1 ?\n                newProduct.detailsPageUrl + '&itemorigin=productcomparison_flyout' :\n                newProduct.detailsPageUrl + '?itemorigin=productcomparison_flyout';\n\n            newProductDescription.innerHTML = newProduct.title;\n            newProductDescription.className = 'description-slot';\n\n            newRemoveProductButton.setAttribute('class', 'mpc-recycle');\n            newRemoveProductButton.setAttribute('focusable', '');\n            newRemoveProductButton.setAttribute('order', '0');\n            newRemoveProductButton.addEventListener('click', (event: MouseEvent) => {\n                this.removeProduct(listContainer, newListItem, false);\n                event.stopPropagation();\n                event.preventDefault();\n            });\n            newRemoveProductButton.innerHTML = RecycleBinIcon;\n            \n            newProductImageSlot.className = 'image-slot';\n            newProductImageSlot.setAttribute('src', newProduct.mainImage);\n            newProductImageSlot.setAttribute('alt', newProduct.altTag);\n            \n            newProductImageHolder.className = 'image-holder';\n            newProductImageHolder.setAttribute('focusable', '');\n            newProductImageHolder.setAttribute('order', '1');\n            \n            newListItem.setAttribute(\"href\", itemOriginDetailsPageUrl);\n\n            newListItem.setAttribute(\"data-pcf-masterArticleNo\", newProduct.articleId.masterArticleNo.toString());\n            newListItem.className = 'list-item';\n            newListItem.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\n            newListItem.setAttribute('group', '');\n\n            newProductImageHolder.appendChild(newProductImageSlot);\n            newListItem.appendChild(newProductImageHolder);\n            newListItem.appendChild(newRemoveProductButton);\n            newListItem.appendChild(newProductDescription);\n            \n            // remove empty list item:\n            const emptyListItem: HTMLElement = itemsContainer.querySelector('.empty-list-item');\n\n            if (!emptyListItem)\n                return;\n\n            let nextEmpty = emptyListItem.nextElementSibling;\n            itemsContainer.removeChild(emptyListItem);\n\n            // add new list item\n            if (nextEmpty) {\n                itemsContainer.insertBefore(newListItem, nextEmpty);\n            } else {\n                itemsContainer.appendChild(newListItem);\n            }\n        }\n        \n        private getListContainerCategoryName(listContainer: HTMLElement): string {\n            return listContainer.getAttribute('data-pcf-categoryName');\n        }\n        \n        public removeEmptyContainerList(): void {\n            // remove all empty list containers\n            if (!this.listContainersArray || this.listContainersArray.length <= 0)\n                return;\n\n            let removableContainers: Array<HTMLElement> = new Array<HTMLElement>();\n            let selectFirstTab: boolean = false;\n\n            for (const listContainer of this.listContainersArray) {\n                const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\n                const listItems: NodeListOf<HTMLElement> = itemsContainer.querySelectorAll('.empty-list-item');\n\n                if (listItems.length == MpcSettings.instance.maxProducts) {\n                    removableContainers.push(listContainer);\n                }\n            }\n\n            for (const tmpContainer of removableContainers) {\n                this.flyoutContent.removeChild(tmpContainer);\n                this.listContainersArray.splice(this.listContainersArray.indexOf(tmpContainer), 1);\n\n                // check does the active navigation tab will be removed like empty one:\n                const emptyTabCatName: string = this.getListContainerCategoryName(tmpContainer);\n\n                if (emptyTabCatName == this.activeCategoryTabName)\n                    selectFirstTab = true;\n            }\n                \n            if (this.listContainersArray.length > 0) {\n                if (selectFirstTab) {\n                    const selectedCategoryName: string = this.getListContainerCategoryName(this.listContainersArray[0]);\n                    this.setActiveNavigationTab(selectedCategoryName);\n                }\n                else {\n                    this.setActiveNavigationTab(this.activeCategoryTabName);\n                }\n            }\n        }\n\n        public updateContainerListVisibility(activeCategoryTabName: string): void {\n            for (const listContainer of this.listContainersArray) {\n                const tmpContainerCategoryName: string = this.getListContainerCategoryName(listContainer);\n                \n                if (tmpContainerCategoryName === activeCategoryTabName) {\n                    listContainer.style.display = 'flex';\n                    this.oldListContainer = listContainer;\n                } else {\n                    listContainer.style.display = 'none';\n                }\n            }\n\n            // write it to the localStorage:\n            this.activeCategoryTabName = activeCategoryTabName;\n            this.productComparisonModelManager.setActiveNavigationTab(activeCategoryTabName);\n        }\n\n        public isFlyoutContentEmpty(): boolean {\n            return this.listContainersArray == null \n                || this.listContainersArray == undefined \n                || this.listContainersArray.length == 0;\n        }\n\n        private getContainerListItems(listContainer: HTMLElement): Array<HTMLElement> {\n            const listItems: NodeListOf<HTMLElement> = listContainer.querySelector('.items-container')\n                .querySelectorAll('.list-item');\n            return Array.prototype.slice.call(listItems);\n        }\n\n        public removeProductTP(salesArticleVariantKey: string): void {\n            for (const listContainer of this.listContainersArray) {\n                const listItemsArray: Array<HTMLElement> = this.getContainerListItems(listContainer);\n\n                for (const listItem of listItemsArray) {\n                    const savKey: string = listItem.getAttribute('data-pcf-sav-key');\n\n                    if (savKey === salesArticleVariantKey) {\n                        this.removeProduct(listContainer, listItem, false);\n                        break;\n                    }\n                }\n            }\n        }\n\n        setActiveNavigationTab(activeNavigationTab: string): boolean {\n            const newTabActivated: boolean = this.navigationService.markActiveNavigationTab(activeNavigationTab);\n            \n            if(newTabActivated)\n                this.updateContainerListVisibility(activeNavigationTab);\n\n            return newTabActivated;\n        }\n    }\n}","import { MPCLocalStorageService } from \"../local-storage-service\";\nimport { MPCIFlyoutController } from \"../typings/iFlyoutController\";\nimport { MPCStickyFlyOutNotificationService } from \"./stickyFlyOutNotificationService\";\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\n\nexport module MPCFlyoutController {\n    import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n    import IFlyoutController = MPCIFlyoutController.IFlyoutController;\n    import StickyFlyOutNotificationService = MPCStickyFlyOutNotificationService.StickyFlyOutNotificationService;\n    import MpcSettings = MpcSettingsModule.MpcSettings;\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n    import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\n\n    export class FlyoutController implements IFlyoutController {\n        private static _instance: FlyoutController;\n        private readonly scope: HTMLElement;\n        private productComparisonModelManager: ProductComparisonModelManager;\n        private pcfScopeRendered: boolean;\n        private stickyFlyOutNotificationService: StickyFlyOutNotificationService;\n        private deviceDetectionHelper: DeviceDetectionHelper;\n        private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n        \n        public constructor() {\n            this.scope = document.querySelector('.pcf-scope');\n\n            if(!this.scope){\n                return;\n            }\n\n            this.init();\n        }\n\n        private init(): void {\n            this.pcfScopeRendered = false;\n            MpcSettings.instance.init(this.scope);\n\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n\n            if(this.deviceDetectionHelper.isMobileShop()) {\n                this.prepareMobile();\n            }\n\n            this.productComparisonModelManager = ProductComparisonModelManager.instance;\n\n            this.stickyFlyOutNotificationService = new StickyFlyOutNotificationService();\n            this.stickyFlyOutNotificationService.init(this.scope);\n            this.getCurrentProductsAmount();\n            this.loadFlyoutIcons();\n\n            this.registerEventHandlers();\n        }\n\n        private prepareMobile(): void {\n            document.body.appendChild(this.scope);\n\n            this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\n            this.comparePageButtonUrlUpdater.init(this.scope);\n        }\n\n        private registerEventHandlers(): void {\n            window.shell.subscribeTo(\"ManualProductComparison.ShowPcfScope\", () => {\n                this.showPcfScope();\n            }, \"ManualProductComparison.ShowPcfScope\");\n\n            window.shell.subscribeTo(\"ManualProductComparison.HidePcfScope\", () => {\n                this.hidePcfScope();\n            }, \"ManualProductComparison.HidePcfScope\");\n\n            const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\n            flyoutIconContainer.addEventListener('click', () => { this.handleFlyoutIconClick(); });\n        }\n\n        private handleFlyoutIconClick(): void {\n            window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n        }\n\n        private loadFlyoutIcons(): void {\n            // ie11 fix, works on other browsers too, but ie11 is special :( \n            const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\n\n            const scaleIcon: HTMLElement = document.createElement(\"div\");\n\n            if(flyoutIconContainer.classList.contains('mkt-headr-icon-wrapper')) {\n                // mkt-headr-icon all styles comes from header:\n                scaleIcon.className = \"mkt-headr-icon mpc-scale\";\n            }\n            else {\n                scaleIcon.className = \"flyout-icon mpc-scale\";\n            }\n\n            scaleIcon.innerHTML = ScaleIcon2021;\n            flyoutIconContainer.appendChild(scaleIcon);\n\n            const productsCounter: HTMLElement = document.createElement(\"div\");\n            productsCounter.className = \"products-counter\";\n            flyoutIconContainer.appendChild(productsCounter);\n            // ---------------------------------------------------------------\n\n            const compareButtonIcons: NodeListOf<HTMLElement> = this.scope.querySelectorAll('.compare-button-icon');\n            const compareButtonIconsArray: Array<HTMLElement> = Array.prototype.slice.call(compareButtonIcons);\n\n            for (const compareButtonIcon of compareButtonIconsArray) {\n                compareButtonIcon.innerHTML = ArrowRightIcon;\n            }\n        }\n\n        private getCurrentProductsAmount(): void {\n             this.productComparisonModelManager.getModel().then(model => {\n                 if (model.products.length > 0) {\n\n                     // show Pcf Scope:\n                     if (!this.deviceDetectionHelper.isMobileShop()) {\n                         this.showPcfScope(true);\n                     }\n                 }\n            });\n        }\n\n        private showPcfScope(renderWithoutAnimation: boolean = false): void {\n            // check for existing pcf scope:\n            if (!this.pcfScopeRendered) {\n                this.scope.style.display = 'block';\n                this.scope.classList.add('pcf-scope-position');\n\n                if (renderWithoutAnimation)\n                    this.scope.classList.add('pcf-no-animation');\n                \n                this.scope.classList.add('show-pcf-scope');\n                this.pcfScopeRendered = true;\n            }\n        }\n\n        hidePcfScope(): void {\n            this.scope.classList.remove('pcf-no-animation');\n            this.scope.classList.remove('show-pcf-scope');\n            setTimeout(()=>{ this.scope.classList.remove('pcf-scope-position'); }, 400);\n            setTimeout(()=>{ this.scope.style.display = 'none'; }, 400);\n            this.pcfScopeRendered = false;\n        }\n    }\n}\n\nif(window.shell)\n    MPCFlyoutController.FlyoutController.instance;","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCScrollLock } from \"../helpers/scrollLock\";\nconst SmartTimeout = require(\"smart-timeout\");\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\n\nexport module MPCNotificationService {\n    import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n    import ScrollLock = MPCScrollLock.ScrollLock;\n\n    export class NotificationService {\n        private readonly scope: HTMLElement;\n        public flyoutContentController: IFlyoutContentController;\n        private static _instance: NotificationService;\n        private existingNotificationTimeout: any;\n        private deviceDetectionHelper : DeviceDetectionHelper;\n        private flyoutContainer: HTMLElement;\n        private scrollLock: ScrollLock;\n\n        private maxProductsCountNotification: HTMLElement;\n        private newProductNotification: HTMLElement;\n        private emptyListNotification: HTMLElement;\n        private flyoutIconContainer: HTMLElement;\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        constructor() {\n            this.scope = document.querySelector('.pcf-scope');\n\n            if(this.scope)\n            {\n                this.init();\n            }\n        }\n        \n        private init(): void {\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n            this.scrollLock = ScrollLock.instance;\n            this.flyoutContainer = this.scope.querySelector('.flyout-container');\n            const notifications = this.flyoutContainer.querySelectorAll(\".notification\");\n\n            for (let notification of <HTMLElement[]><any>notifications) {\n                const closeBtns = notification.querySelectorAll('.close-flyout-btn'); //multiple because there is the x for Web and the footer button for Mobile\n                const openFlyoutBtns = notification.querySelectorAll('.open-flyout-button');//multiple because \"new-product' has two (Web has a compact layout without footer)\n                const navigationBtn = notification.querySelector('.navigate-to-products-button');\n\n                for (let comparisonListButton of <HTMLElement[]><any>openFlyoutBtns) {\n                    const iconSlot: HTMLElement = comparisonListButton.querySelector('.open-flyout-button-icon');\n                    iconSlot.innerHTML = ArrowRightIcon;\n                    comparisonListButton.addEventListener('click', ()=> { this.goToFlyoutComparisonList(notification); });\n                }\n\n                for (let closeBtn of <HTMLElement[]><any>closeBtns) {\n                    closeBtn.addEventListener('click', () => { this.closeNotification(notification); });\n                }\n\n                if (navigationBtn != null) {\n                    const iconSlot: HTMLElement = navigationBtn.querySelector('.navigate-products-button-icon');\n                    iconSlot.innerHTML = ArrowRightIcon;\n                }\n            }\n            \n            this.maxProductsCountNotification = this.scope.querySelector('.max-products-count-notification');\n            this.newProductNotification = this.scope.querySelector('.new-product-notification');\n            this.emptyListNotification = this.scope.querySelector('.empty-list-notification');\n            this.flyoutIconContainer = this.scope.querySelector('.flyout-icon-container');\n\n            // close any active notification flyout if any other flyout is opening from headR:\n            // we need it because notification flyouts are not fragments and headR is not responsible for them\n            window.shell.subscribeTo('ESMKT.HeadR.FlyoutOpening', () => { this.closeAnyActiveNotification(); }, 'ESMKT.HeadR.FlyoutOpening');\n        }\n\n        notifyNewProductAdded(title: string, mainImage: string, altTag: string): void {\n            this.showNotification(this.newProductNotification, () => {\n                this.replaceNotificationContent(title, mainImage, altTag);\n            });\n        }\n        \n        notifyMaximumProductsCountReached(): void {\n            this.showNotification(this.maxProductsCountNotification, null);\n        }\n\n        notifyEmptyList(): void {\n            this.initializeNavigationButtonOnEmptyNotificationOnce(); //Workaround because this class exists twice (PCF & PCP)\n            this.showNotification(this.emptyListNotification, null);\n        }\n\n        closeAnyActiveNotification(): void {\n            if (this.maxProductsCountNotification.classList.contains('show-notification'))\n                this.closeNotification(this.maxProductsCountNotification);\n\n            if (this.newProductNotification.classList.contains('show-notification'))\n                this.closeNotification(this.newProductNotification);\n            \n            if (this.emptyListNotification.classList.contains('show-notification'))\n                this.closeNotification(this.emptyListNotification);\n        }\n\n        private initializeNavigationButtonOnEmptyNotificationOnce(): void {\n            const navigationBtn = this.emptyListNotification.querySelector('.navigate-to-products-button');\n\n            const eventFunction: EventListener = () => {\n                this.showMobileHeaderMenu();\n                this.closeNotification(this.emptyListNotification);\n                navigationBtn.removeEventListener('click', eventFunction);\n            }\n\n            if (navigationBtn != null && window.headrapi)\n                navigationBtn.addEventListener('click', eventFunction);\n        }\n\n        private showMobileHeaderMenu(): void {\n            if (window.headrapi)\n                window.headrapi.toggleMenu();\n        }\n\n        private replaceNotificationContent(title: string, mainImage: string, altTag: string): void {\n            const productInfoContainer: HTMLElement\n                = this.newProductNotification.querySelector('.product-info-container');\n\n            productInfoContainer.querySelector('.description-container')\n                .querySelector('.title').innerHTML = title;\n            productInfoContainer.querySelector('.image-slot').setAttribute('src', mainImage);\n            productInfoContainer.querySelector('.image-slot').setAttribute('alt', altTag);\n        }\n\n        private goToFlyoutComparisonList(notification: HTMLElement): void {\n            this.closeNotification(notification);\n\n            window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\n        }\n\n        private closeExistingNotification(): void {\n            const existingNotification: HTMLElement = this.flyoutContainer.querySelector('.show-notification');\n\n            if (existingNotification) {\n                SmartTimeout.clear(this.closeExistingNotification);\n                existingNotification.classList.remove('show-notification');\n                this.renderFlyoutContainerOverlay(false);\n            }\n        }\n\n        private closeNotification(notification: HTMLElement): void {\n            SmartTimeout.clear(this.closeExistingNotification);\n            notification.classList.remove('show-notification');\n            this.flyoutIconContainer.classList.remove('notification_background');\n            this.renderFlyoutContainerOverlay(false);\n        }\n\n        private showNotification(notification: HTMLElement, updateNotificationContent?: () => void): void {\n            this.triggerAppShellPublish();\n\n            // on category page, you can click many compare buttons fast, so check for older notification\n            let deferNotification = false;\n            if (this.existingNotificationTimeout ||\n                notification.classList.contains('show-notification')) {\n                this.closeExistingNotification();\n                deferNotification = true;\n            } \n\n            let showInner = () => {\n                if (this.flyoutContentController)\n                    this.flyoutContentController.hideFlyoutContent();\n\n                if (updateNotificationContent)\n                    updateNotificationContent();\n\n                this.renderFlyoutContainerOverlay(true);\n\n                notification.classList.add('show-notification');\n                this.flyoutIconContainer.classList.add('notification_background');\n\n                if (!this.deviceDetectionHelper.isMobileShop()) {\n                    // close new product notification after 4500 ms\n                    this.existingNotificationTimeout =\n                        SmartTimeout.set(() => { this.closeNotification(notification) }, 4500);\n                }\n            };\n\n            if(deferNotification)\n                SmartTimeout.set(showInner, 500);\n            else \n                showInner();\n        }\n\n        private triggerAppShellPublish(): void {\n            // close modal dialogs in legacy WF\n            if (window.shell) {\n                window.shell.publishTo('mpc.close-modal', '');\n                window.shell.publishTo('ESPP.OrderModal.Close', '');\n            }\n        }\n\n        private renderFlyoutContainerOverlay(renderOverlay: boolean): void {\n            if(this.deviceDetectionHelper.isMobileShop()) {\n                if(renderOverlay) {\n                    this.scope.classList.add('render-overlay');\n                    this.scope.ontouchmove = (event: TouchEvent) => { event.preventDefault(); }; // iOS ScrollLock\n                    this.scrollLock.lock();\n                }\n                else {\n                    if(this.scope.classList.contains('render-overlay')) {\n                        this.scope.classList.remove('render-overlay');\n                        this.scope.ontouchmove = () => { };\n                        this.scrollLock.unlock();\n                    }\n                }\n            }\n        }\n\n    }\n}","import { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\n\nexport module MPCStickyFlyOutNotificationService {\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n    \n    export class StickyFlyOutNotificationService {\n        private scope: HTMLElement;\n        private deviceDetectionHelper : DeviceDetectionHelper;\n        private maxProductsCountNotification: HTMLElement;\n        private flyoutNewProductNotification: HTMLElement;\n        private flyout: HTMLElement;\n        private tabletHeaderHeightCalculated: number;\n\n        public constructor() {\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n        }\n\n        public init(scope: HTMLElement): void {\n            this.scope = scope;\n            this.tabletHeaderHeightCalculated = 38;\n            const flyoutContainer: HTMLElement = this.scope.querySelector('.flyout-container');\n\n            if (flyoutContainer && this.deviceDetectionHelper.isTabletHandHeldDevice()) {\n                this.maxProductsCountNotification = flyoutContainer.querySelector('.max-products-count-notification');\n                this.flyoutNewProductNotification = flyoutContainer.querySelector('.new-product-notification');\n                this.maxProductsCountNotification.classList.add('sticky-flyout-notification');\n                this.flyoutNewProductNotification.classList.add('sticky-flyout-notification');\n\n                // todo: remove with ESPP-2482\n                /* if(!mktHeaderOnline) {\n                    this.flyout = flyoutContainer.querySelector('.flyout');\n                    this.flyout.classList.add('sticky-flyout');\n\n                    window.addEventListener('scroll', () => { this.handleFlyOutNotificationOnScroll() });\n                    window.addEventListener('scroll', () => { this.handleFlyOutOnScroll() });\n\n                    this.handleFlyOutOnScroll();\n                } */\n\n                this.handleFlyOutNotificationOnScroll();\n                \n            }\n        }\n\n        private handleFlyOutNotificationOnScroll(): void {\n            if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\n                this.maxProductsCountNotification.classList.remove(\"fixed\");\n                this.flyoutNewProductNotification.classList.remove(\"fixed\");\n            }\n            else {\n                this.maxProductsCountNotification.classList.add(\"fixed\");\n                this.flyoutNewProductNotification.classList.add(\"fixed\");\n            }\n        }\n\n        private handleFlyOutOnScroll(): void {\n            if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\n                this.flyout.classList.remove(\"fixed\");\n            }\n            else {\n                this.flyout.classList.add(\"fixed\");\n            }\n        }\n    }\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { IResponseData } from \"../typings/VariantSelection\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCCompareButton {\r\n    import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n    import TouchPointContext = MPCITouchPoint.TouchPointContext;\r\n\r\n    export class CompareButton implements ITouchPoint {\r\n        private markerElement: HTMLElement;\r\n        private parentContainer: HTMLElement;\r\n        private touchPointElement: HTMLElement;\r\n        private slug: string;\r\n        private origin: string;\r\n        private salesArticleVariantKey: string;\r\n        private displayedInCategoryNavKey: string;\r\n        private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;        \r\n\r\n        constructor(marker: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string,\r\n            parentContainer: HTMLElement) {\r\n            this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n            this.parentContainer = parentContainer;\r\n            this.markerElement = marker;\r\n            this.salesArticleVariantKey = salesArticleVariantKey;\r\n            this.slug = slug;\r\n            this.origin = origin;\r\n            this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n            \r\n            // only for new details page:\r\n            if(this.parentContainer)\r\n                this.initializeNew();\r\n            else\r\n                this.getTouchPoint();\r\n\r\n            // Subscribe to new details page and update necessary changed variant info:\r\n            if (typeof window !== 'undefined' && window.shell) {\r\n                window.shell.subscribeTo(\r\n                    'ESPP.DetailPage.PageUpdate',\r\n                    (response: IResponseData) => {\r\n                        this.updateSaveKeyFromOutsideTheScope(\r\n                            response.orderModule.articleInfo.salesArticleVariantKey);\r\n                    },\r\n                    'ESCID.ESPP.ManualProductComparison');\r\n            }\r\n\r\n            if (typeof window !== 'undefined' && window.shell) {\r\n                window.shell.subscribeTo(\r\n                    'ESPP.OrderModal.Update',\r\n                    ({ response }: { response: IResponseData } ) => {\r\n                        this.updateSaveKeyFromOutsideTheScope(\r\n                            response.orderModule.articleInfo.salesArticleVariantKey);\r\n                    },\r\n                    'ESCID.ESPP.ManualProductComparison');\r\n            }\r\n        }\r\n\r\n        private updateSaveKeyFromOutsideTheScope(savKey: string): void {\r\n            this.salesArticleVariantKey = savKey;\r\n        }\r\n\r\n        update(oldSavKey: string, newSavKey: string): void {\r\n            return;\r\n        }\r\n\r\n        private getTouchPoint(): void {\r\n            const context: TouchPointContext = new class implements TouchPointContext {\r\n                SeoSlug: string;\r\n            };\r\n            context.SeoSlug = this.slug;\r\n\r\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\r\n            const subPath = this.markerElement.classList.contains(\"scope-om-new\")\r\n                ? \"TouchPoint/ForOrderModalNew/\"\r\n                : \"TouchPoint/ForDetailsPage/\";\r\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + subPath;\r\n            params.url += \"?context.SeoSlug=\" + this.slug;\r\n            params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n            params.url += \"&context.ItemOrigin=\" + this.origin;\r\n            if(this.displayedInCategoryNavKey)\r\n                params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n            params.contentType = ContentType.Plain;\r\n            new NlVanillajax(params).getWithPromise()\r\n                .then((response: HtmlResult) => {\r\n                    let container: HTMLElement = document.createElement('div');\r\n                    container.innerHTML = response.Html;\r\n                    this.touchPointElement = container.querySelector(\".touchpoint\");  //there might be text nodes in there, so not childNodes[0]\r\n                    if (!this.touchPointElement) {\r\n                        throw new Error(\"no touchpoint returned from service\");\r\n                    }                    \r\n                    this.removePreviousButton();\r\n                    this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n                    this.initialize();\r\n                })\r\n                .catch(() => {\r\n                    //empty response indicates this article has disabled comparing for some reason\r\n                    if (this.markerElement) {\r\n                        this.markerElement.remove();\r\n                    } else if (this.touchPointElement) {\r\n                        this.touchPointElement.remove();\r\n                    }\r\n                });\r\n        }\r\n\r\n        private removePreviousButton(): void {\r\n            const previousButton: HTMLElement =\r\n                this.markerElement.parentElement.querySelector('.compare-button-wrapper');\r\n\r\n            if (previousButton)\r\n                previousButton.remove();\r\n        }\r\n\r\n\r\n        private initialize(): void {\r\n            this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n            this.touchPointElement.addEventListener('click', (event: Event) => {\r\n                event.preventDefault();\r\n            });\r\n            this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n                this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n            }, 1000, true).bind(this));\r\n        }\r\n\r\n        // only for new details page:\r\n        private initializeNew(): void {\r\n            this.parentContainer.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n            this.parentContainer.addEventListener('click', (event: Event) => {\r\n                event.preventDefault();\r\n            });\r\n            this.parentContainer.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n                this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n            }, 1000, true).bind(this));\r\n        }\r\n    }\r\n}","import { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCLocalStorageService } from \"../local-storage-service\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCMobileToolbarButton {\r\n    import EventBus = MPCEventBus.EventBus;\r\n    import MpcSettings = MpcSettingsModule.MpcSettings;\r\n    import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n\r\n    export class MobileToolbarButton  {\r\n        private static _instance: MobileToolbarButton;\r\n        private eventBus: EventBus;\r\n        private toolbarButtons: NodeListOf<HTMLElement>;\r\n        private compareButtons: HTMLElement[];\r\n        private tbw_mlt: string;\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        private constructor() {\r\n            this.eventBus = EventBus.instance;\r\n            document.addEventListener(\"DOMContentLoaded\", () => {\r\n                this.initialize();\r\n            });\r\n        }\r\n\r\n        private initialize() {\r\n            this.toolbarButtons = document.querySelectorAll(\".mpc-scope .toolbar-button-wrapper\");\r\n            if (!this.toolbarButtons || !this.toolbarButtons.length) {\r\n                return;\r\n            }\r\n\r\n            this.compareButtons = new Array();\r\n\r\n            // for TouchPoint Accessibility:\r\n            if(this.toolbarButtons[0].children && this.toolbarButtons[0].children.length > 0) {\r\n                this.tbw_mlt = this.toolbarButtons[0].children[0].innerHTML;\r\n            }\r\n\r\n            this.toolbarButtons.forEach((toolbarButton: HTMLElement) => {\r\n                // compareButton exists only in legacy shop, all other places contains toolbar-button-wrapper\r\n                if (toolbarButton.closest('.compare-button'))\r\n                    this.compareButtons.push(toolbarButton.closest('.compare-button'));\r\n                else\r\n                    this.compareButtons.push(toolbarButton);\r\n\r\n                toolbarButton.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n                toolbarButton.addEventListener(\"click\", () => {\r\n                    // New category page:\r\n                    window.shell.publishTo('ArticleTileService.Mobile.ToggleTouchPointOnTile', undefined);\r\n\r\n                    // Legacy category page, remove later!!!: \r\n                    this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n                    let categoryNavKey: string;\r\n                    if (MpcSettings.instance.MobileCategoryNavKey) {\r\n                        categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n                    }\r\n\r\n                    this.compareButtons.forEach((compareButton: HTMLElement) => {\r\n                        if (compareButton.classList.contains('active')) {\r\n                            compareButton.classList.remove('active');\r\n                            if (categoryNavKey) {\r\n                                ProductComparisonModelManager.instance.deactivateOnMobileCategory(categoryNavKey);\r\n                            }\r\n                        } else {\r\n                            compareButton.classList.add('active');\r\n                            if (categoryNavKey) {\r\n                                ProductComparisonModelManager.instance.activateOnMobileCategory(categoryNavKey);\r\n                            }\r\n                        }\r\n                    });\r\n                });\r\n\r\n                const categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n                if (categoryNavKey && ProductComparisonModelManager.instance.isActivatedOnMobileCategory(categoryNavKey)) {\r\n                    this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n                    this.compareButtons[this.compareButtons.length-1].classList.add('active');\r\n                }\r\n            });\r\n        }\r\n\r\n        public getTBW_Mlt(): string {\r\n            return this.tbw_mlt;\r\n        }\r\n    }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\n\r\nexport module MPCTileScaleButton {\r\n    import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n    import EventBus = MPCEventBus.EventBus;\r\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n\r\n    export class TileScaleButton implements ITouchPoint {\r\n        private markerElement: HTMLElement;\r\n        private touchPointElement: HTMLElement;\r\n        private slug: string;\r\n        private origin: string;\r\n        private salesArticleVariantKey: string;\r\n        private displayedInCategoryNavKey: string;\r\n        private isMobileShop: boolean;\r\n        private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\r\n        private eventBus: EventBus;\r\n        private deviceDetectionHelper : DeviceDetectionHelper;\r\n\r\n        constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, prerendered: boolean = false) {\r\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n            this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\r\n            this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n            this.eventBus = MPCEventBus.EventBus.instance;\r\n            this.salesArticleVariantKey = salesArticleVariantKey;\r\n            this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n            this.slug = slug;\r\n            this.origin = origin;\r\n\r\n            if (prerendered) {\r\n                this.touchPointElement = element;\r\n\r\n                if (!this.touchPointElement) {\r\n                    return;\r\n                }\r\n\r\n                this.initialize();\r\n            } else {\r\n                this.markerElement = element;\r\n                this.getTouchPoint();\r\n            }\r\n        }\r\n\r\n        update(oldSavKey: string, newSavKey: string): void {\r\n            if (!this.touchPointElement) {\r\n                return;\r\n            }\r\n\r\n            if (!oldSavKey) {\r\n                // backwards compatibility - can be removed after ATS is deployed on PROD\r\n                const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\r\n                    .querySelector('.colors .selected img');\r\n                const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\r\n\r\n                if (thisButtonIsForSavKey != newSavKey) {\r\n                    // this event is received by all touchpoints on the site, \r\n                    // on categorypage, unrelated touchpoints need to ignore this\r\n                    return;\r\n                }\r\n                this.salesArticleVariantKey = newSavKey;\r\n                this.toggle();\r\n            } else {\r\n                // new way\r\n                if (this.salesArticleVariantKey != oldSavKey) {\r\n                    return;\r\n                }\r\n\r\n                this.salesArticleVariantKey = newSavKey;\r\n                this.toggle();\r\n            }\r\n        }\r\n\r\n        private getTouchPoint(): void {\r\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\r\n            const scopeClass = this.markerElement.classList.contains(\"scope-ats\")\r\n                ? \"ats\"\r\n                : \"\";\r\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/ForArticleTile/\";\r\n            params.url += \"?context.SeoSlug=\" + this.slug;\r\n            params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n            params.url += \"&context.ItemOrigin=\" + this.origin;\r\n            params.url += \"&context.ScopeClass=\" + scopeClass;\r\n            if(this.displayedInCategoryNavKey)\r\n                params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n            params.contentType = ContentType.Plain;\r\n            new NlVanillajax(params).getWithPromise()\r\n                .then((response: HtmlResult) => {\r\n                    let container: HTMLElement = document.createElement('div');\r\n                    container.innerHTML = response.Html;\r\n                    this.touchPointElement = container.querySelector(\".touchpoint\");  //there might be text nodes in there, so not childNodes[0]\r\n                    if (!this.touchPointElement) {\r\n                        throw new Error(\"no touchpoint returned from service\");\r\n                    }\r\n                    this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n                    this.initialize();\r\n                })\r\n                .catch(() => {\r\n                    //empty response indicates this article has disabled comparing for some reason\r\n                    if (this.markerElement) {\r\n                        this.markerElement.remove();\r\n                    } else if (this.touchPointElement) {\r\n                        this.touchPointElement.remove();\r\n                    }\r\n                });\r\n        }\r\n\r\n\r\n        private initialize(): void {\r\n            this.toggle();\r\n            this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\r\n            this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\r\n\r\n            this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n                this.updateFlyout();\r\n            }, 1000, true).bind(this));\r\n            this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\r\n                if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n                    this.touchPointElement.classList.remove('active');\r\n                }\r\n            });\r\n            this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\r\n                if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n                    this.touchPointElement.classList.add('active');\r\n                }\r\n            });\r\n\r\n            if (this.isMobileShop) {\r\n                this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\r\n            }\r\n        }\r\n\r\n        private updateVisibility(): void {\r\n            if (this.touchPointElement.classList.contains(\"ats\")) {\r\n                if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\r\n                    this.touchPointElement.parentElement.classList.remove('fas_hidden');\r\n                } else {\r\n                    this.touchPointElement.parentElement.classList.add('fas_hidden');\r\n                }\r\n            } else {\r\n                if (this.touchPointElement.classList.contains(\"visible\")) {\r\n                    this.touchPointElement.classList.remove(\"visible\");\r\n                } else {\r\n                    this.touchPointElement.classList.add(\"visible\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private updateFlyout(): void {\r\n            if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n                this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n            } else {\r\n                this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\r\n            }\r\n        }\r\n\r\n        private toggle(): void {\r\n            if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n                this.touchPointElement.classList.add('active');\r\n            } else {\r\n                this.touchPointElement.classList.remove('active');\r\n            }\r\n        }\r\n    }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\nimport { MPCEventBus } from \"../helpers/event-bus\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\n\nexport module MPCTileScaleButtonEx {\n    import ITouchPoint = MPCITouchPoint.ITouchPoint;\n    import EventBus = MPCEventBus.EventBus;\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n\n    export class TileScaleButtonEx implements ITouchPoint {\n        private markerElement: HTMLElement;\n        private touchPointElement: HTMLElement;\n        private slug: string;\n        private origin: string;\n        private salesArticleVariantKey: string;\n        private isMobileShop: boolean;\n        private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\n        private eventBus: EventBus;\n        private deviceDetectionHelper : DeviceDetectionHelper;\n\n        constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, private tbw_mlt: string) {\n            this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n            this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\n            this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\n            this.eventBus = MPCEventBus.EventBus.instance;\n            this.salesArticleVariantKey = salesArticleVariantKey;            \n            this.slug = slug;\n            this.origin = origin;\n\n            this.markerElement = element;\n            this.getTouchPoint();\n        }\n\n        update(oldSavKey: string, newSavKey: string): void {\n            if (!this.touchPointElement) {\n                return;\n            }\n\n            if (!oldSavKey) {\n                // backwards compatibility - can be removed after ATS is deployed on PROD\n                const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\n                    .querySelector('.colors .selected img');\n                const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\n\n                if (thisButtonIsForSavKey != newSavKey) {\n                    // this event is received by all touchpoints on the site, \n                    // on categorypage, unrelated touchpoints need to ignore this\n                    return;\n                }\n                this.salesArticleVariantKey = newSavKey;\n                this.toggle();\n            } else {\n                // new way\n                if (this.salesArticleVariantKey != oldSavKey) {\n                    return;\n                }\n\n                this.salesArticleVariantKey = newSavKey;\n                this.toggle();\n            }\n        }\n\n        private getTouchPoint(): void {\n            const scopeClass = this.markerElement.classList.contains('scope-ats')\n                ? ' ats'\n                : '';\n\n            const forArticleTile: HTMLElement = document.createElement('div');\n            forArticleTile.className = 'mpc-scope scale-tile-container touchpoint' + scopeClass;\n            forArticleTile.setAttribute(\"title\", this.tbw_mlt);\n            forArticleTile.setAttribute(\"data-savkey\", this.salesArticleVariantKey);\n            forArticleTile.setAttribute(\"data-item-origin\", this.origin);\n            forArticleTile.setAttribute('focusable', '');\n            forArticleTile.setAttribute('order', '0');\n\n            const emptyIcon: HTMLElement = document.createElement('div');\n            emptyIcon.className = 'comparison-empty-icon';\n\n            const icon: HTMLElement = document.createElement('div');\n            icon.className = 'comparison-icon';\n            \n            forArticleTile.appendChild(emptyIcon);\n            forArticleTile.appendChild(icon);\n\n            this.touchPointElement = forArticleTile;\n            \n            if (!this.touchPointElement) {\n                throw new Error(\"no touchpoint returned from service\");\n            }\n\n            this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\n            \n            this.initialize();\n        }\n\n        private initialize(): void {\n            this.toggle();\n            this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\n            this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\n\n            this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\n                this.updateFlyout();\n            }, 1000, true).bind(this));\n\n            this.touchPointElement.addEventListener('keydown', (event: KeyboardEvent) => {\n                if (event.key === ' ') { // space btn\n                    event.preventDefault();\n                    event.stopPropagation();\n\n                    this.updateFlyout();\n                }\n            });\n\n            this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\n                if (salesArticleVariantKey === this.salesArticleVariantKey) {\n                    this.touchPointElement.classList.remove('active');\n                }\n            });\n            this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\n                if (salesArticleVariantKey === this.salesArticleVariantKey) {\n                    this.touchPointElement.classList.add('active');\n                }\n            });\n\n            if (this.isMobileShop) {\n                this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\n            }\n        }\n\n        private updateVisibility(): void {\n            if (this.touchPointElement.classList.contains(\"ats\")) {\n                if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\n                    this.touchPointElement.parentElement.classList.remove('fas_hidden');\n                } else {\n                    this.touchPointElement.parentElement.classList.add('fas_hidden');\n                }\n            } else {\n                if (this.touchPointElement.classList.contains(\"visible\")) {\n                    this.touchPointElement.classList.remove(\"visible\");\n                } else {\n                    this.touchPointElement.classList.add(\"visible\");\n                }\n            }\n        }\n\n        private updateFlyout(): void {\n            if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\n                this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\n            } else {\n                this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\n            }\n        }\n\n        private toggle(): void {\n            if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\n                this.touchPointElement.classList.add('active');\n            } else {\n                this.touchPointElement.classList.remove('active');\n            }\n        }\n    }\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCITouchPointIdentifier } from \"../typings/TouchPointIdentifier\";\r\nimport { MPCTouchPointIdentifier } from \"./TouchPointIdentifier\";\r\nimport { MPCCompareButton } from \"./CompareButton\";\r\nimport { MPCTileScaleButton } from \"./TileScaleButton\";\r\nimport { MPCTileScaleButtonEx } from \"./TileScaleButtonEx\";\r\nimport { MPCMobileToolbarButton } from \"./MobileToolbarButton\";\r\nimport { MPCFlyoutContentController } from '../PCF/flyout-content-controller';\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\nimport axios, { AxiosError, AxiosResponse } from 'axios';\r\n\r\nexport module MPCTouchPointFactory {\r\n    import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n    import TouchPointPayload = MPCITouchPoint.TouchPointPayload;\r\n    import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\r\n    import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\r\n    import TouchPointIdentifier = MPCTouchPointIdentifier.TouchPointIdentifier;\r\n    import CompareButton = MPCCompareButton.CompareButton;\r\n    import TileScaleButton = MPCTileScaleButton.TileScaleButton;\r\n    import TileScaleButtonEx = MPCTileScaleButtonEx.TileScaleButtonEx;\r\n    import MobileToolbarButton = MPCMobileToolbarButton.MobileToolbarButton;\r\n    import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n    export class TouchPointFactory {\r\n        private static _instance: TouchPointFactory;\r\n        private touchPointIdentifier: ITouchPointIdentifier;\r\n        private touchPoints: ITouchPoint[];\r\n        private isMobileView = window.innerWidth <= 1199;       \r\n        private isNewDetailsPage: HTMLElement = document.querySelector('.pdp-details_page_container'); // only for new details page:\r\n        private compareButtonSavKeySelector: string = this.isMobileView ?\r\n            'input[name=SalesarticleVariantKey]' : 'input[name=SalesArticleVariantKey]';\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        private constructor() {\r\n            this.touchPointIdentifier = TouchPointIdentifier.instance;\r\n            this.touchPoints = [];\r\n\r\n            if (window.shell) {\r\n                this.initializeEvents();\r\n\r\n                // we have to init it because of variety of resolution on tablet devices\r\n                MobileToolbarButton.instance;\r\n            }\r\n        }\r\n\r\n        private initializeEvents() {  \r\n            if(this.isNewDetailsPage) {\r\n                this.CreateTouchPointsForNewPDP();\r\n            }\r\n            else {\r\n                window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n                    this.createByMarkersPayload(scope);\r\n                }, \"ManualProductComparison.CreateTouchPoints\");\r\n            }\r\n\r\n            // for legacy category page:\r\n            window.shell.subscribeTo(\"ManualProductComparison.CreateScaleIconTouchPoints\", (tile: HTMLElement) => {\r\n                const salesArticleVariantKey: string =\r\n                    tile.getAttribute('data-selected-colorid');\r\n                this.createByMarkers(salesArticleVariantKey, \"mpc-scale-tile\", tile);\r\n            }, \"ManualProductComparison.CreateScaleIconTouchPoints\");\r\n\r\n            // for new ATS and search page:\r\n            window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPointsBatch\", (placeHoldersData: {savKey: string;\r\n                seoSlug: string; displayedInCategoryNavKey: string;}[]) => {\r\n                this.createByMarkersEx(placeHoldersData, \"mpc-scale-tile\");\r\n            }, \"ManualProductComparison.CreateTouchPointsBatch\");\r\n\r\n            window.shell.subscribeTo(\"ManualProductComparison.CreateCompareButtonTouchPoints\", (form: HTMLElement) => {\r\n                let savKeyElement = form.querySelector(this.compareButtonSavKeySelector);\r\n                if (!savKeyElement) {\r\n                    //TODO on mobile after clicking basket icon, order modal opens, but it contains no compare button... \r\n                    return;\r\n                }\r\n                const salesArticleVariantKey: string = savKeyElement.getAttribute('value');\r\n                this.createByMarkers(salesArticleVariantKey, \"mpc-compare-button\", form);\r\n            }, \"ManualProductComparison.CreateCompareButtonTouchPoints\");\r\n\r\n            window.shell.subscribeTo(\"ManualProductComparison.UpdateTouchPoints\", (payload: { oldSavKey: string, newSavKey: string }) => {\r\n                if (typeof payload == 'string') {\r\n                    // backwards compatibility - can be removed after ATS is deployed on PROD\r\n                    payload = { oldSavKey: null, newSavKey: payload };\r\n                }\r\n                for (const touchPoint of this.touchPoints) {\r\n                    touchPoint.update(payload.oldSavKey, payload.newSavKey);\r\n                }\r\n            }, \"ManualProductComparison.UpdateTouchPoints\");\r\n            \r\n            document.addEventListener(\"DOMContentLoaded\",\r\n                () => {\r\n                    this.initializePrerenderedMobileTouchPoints();\r\n                });\r\n            \r\n            document.addEventListener(\"DOMContentLoaded\",\r\n                () => {\r\n                    this.initializeCompareLinkTouchPoints();\r\n                });\r\n        }\r\n\r\n        // only for new details page:\r\n        private CreateTouchPointsForNewPDP() {\r\n            // Necessary for AAS fragment:\r\n            window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n                this.createByMarkersPayload(scope);\r\n            }, \"ManualProductComparison.CreateTouchPoints\");\r\n\r\n            const newBtnLst: NodeListOf<HTMLElement> = this.isNewDetailsPage.querySelectorAll('.mpc-compare-btn');\r\n            if (!newBtnLst || newBtnLst.length === 0) {\r\n                return;\r\n            }\r\n\r\n            for (let i = 0; i < newBtnLst.length; i++) {\r\n                const newBtn = newBtnLst[i];\r\n                const salesArticleVariantKey: string = newBtn.getAttribute('data-savkey');\r\n                const slug: string = newBtn.getAttribute('data-slug');\r\n                const origin: string = newBtn.getAttribute('data-item-origin');\r\n\r\n                new CompareButton(null, salesArticleVariantKey, slug, origin, '', newBtn);\r\n            }\r\n        }\r\n\r\n        private initializePrerenderedMobileTouchPoints(): void {\r\n            const touchPoints: NodeListOf<HTMLElement> = this.touchPointIdentifier.getTileScaleTouchPoints();\r\n            const touchPointPlaceholders: NodeListOf<HTMLElement> = this.touchPointIdentifier.getMobileTouchPointPlaceholders();\r\n            const savKeyToPlaceholder: {[id:string] : HTMLElement} = {};\r\n            for (const touchPointPlaceholder of Array.prototype.slice.call(touchPointPlaceholders)) {\r\n                savKeyToPlaceholder[touchPointPlaceholder.getAttribute(\"data-savkey\")] = touchPointPlaceholder;\r\n            }\r\n            let parentElement: HTMLElement;\r\n            if (touchPoints.length > 0) { \r\n                parentElement = touchPoints[0].parentElement;\r\n            }\r\n            for (const touchPoint of Array.prototype.slice.call(touchPoints)) {\r\n\r\n                touchPoint.querySelector('.comparison-empty-icon').innerHtml = ScaleEmptyIcon;\r\n                touchPoint.querySelector('.comparison-icon').innerHtml = ScaleIcon2021;\r\n\r\n                const slug: string = touchPoint.dataset.slug;\r\n                const salesArticleVariantKey: string = touchPoint.dataset.savkey;\r\n                const itemOrigin: string = touchPoint.getAttribute(\"data-item-origin\");\r\n                const displayedInCategoryNavKey: string = touchPoint.getAttribute(\"data-displayed-in-category-navkey\");\r\n                if (slug && salesArticleVariantKey) {\r\n                    this.touchPoints.push(new TileScaleButton(touchPoint, salesArticleVariantKey, slug, itemOrigin, displayedInCategoryNavKey, true));\r\n                }\r\n\r\n                //move in DOM (they are batch-rendered below the article list and need to be sorted into their article tile)\r\n                const placeholder = savKeyToPlaceholder[touchPoint.getAttribute(\"data-savkey\")];\r\n                if (placeholder) {\r\n                    placeholder.parentNode.replaceChild(touchPoint, placeholder);\r\n                }\r\n            }\r\n            if (parentElement) {\r\n                const currentCategoryNavKey = parentElement.getAttribute(\"data-category-navkey\");\r\n                MpcSettings.instance.MobileCategoryNavKey = currentCategoryNavKey;\r\n                parentElement.remove();\r\n            }\r\n        }\r\n\r\n        private initializeCompareLinkTouchPoints(): void {\r\n            const flyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n            const compareLinks = this.touchPointIdentifier.getCompareLinks();\r\n            for (let i = 0; i < compareLinks.length; i++) {\r\n                const compareLink = compareLinks[i];\r\n                const htmlIndex = compareLink.href.indexOf(\".html\");\r\n                const url = compareLink.href.substring(0, htmlIndex);\r\n                const splitted = url.split(\"-\").reverse();\r\n                const maNo = parseInt(splitted[2]);\r\n                const colorCode = parseInt(splitted[0]);\r\n                compareLink.addEventListener('click', (event) => {\r\n                    event.preventDefault();\r\n                    event.stopPropagation();\r\n                    flyoutContentController.addProductByCompareLink(maNo, colorCode);\r\n                });\r\n            }\r\n        }\r\n\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        private isAxiosError(error: any): error is AxiosError {\r\n            return typeof error.toJSON !== 'undefined';\r\n        }\r\n\r\n        private createByMarkersEx(articlesContext: {savKey: string; seoSlug: string;\r\n            displayedInCategoryNavKey: string;}[], type?: ServiceCallName): void {\r\n            \r\n            // Call MPC endpoint:\r\n            axios.post(MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/IsBatchComparable/\", \r\n            articlesContext, {\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                }\r\n            })\r\n            .then((response: AxiosResponse) => {\r\n                if (response.status >= 200 && response.status < 300 && response.data && response.data.length > 0) {\r\n                    const validSavKeys = response.data;\r\n\r\n                    // Create TP from valid sav keys array:\r\n                    const markers: HTMLElement[] = this.touchPointIdentifier.getMarkersFromDomEx(type, validSavKeys);\r\n\r\n                    for (const markerElement of markers) {\r\n                        if (markerElement) {\r\n                            this.touchPoints.push(this.createTouchPointEx(markerElement));\r\n                        }\r\n                    }\r\n                }\r\n            })\r\n            .catch((error: Error | AxiosError) => {\r\n                const errorMsg = this.isAxiosError(error)\r\n                    ? error.message\r\n                    : `${error.name}: ${error.message}`;\r\n                const errorStack = this.isAxiosError(error)\r\n                    ? JSON.stringify(error.toJSON())\r\n                    : error.stack;\r\n\r\n                // eslint-disable-next-line no-console\r\n                console.warn(\r\n                    `fetch() failed with \"${errorMsg}\". Full error:\\n${errorStack}`\r\n                );\r\n            });\r\n        }\r\n\r\n        private createByMarkers(salesArticleVariantKey: string, type?: ServiceCallName, scope?: HTMLElement): void {\r\n            const markers: NodeListOf<HTMLElement> = this.touchPointIdentifier.getMarkersFromDom(scope, type);\r\n            for (const markerElement of Array.prototype.slice.call(markers)) {\r\n                this.touchPoints.push(this.createTouchPoint(markerElement, salesArticleVariantKey));\r\n            }\r\n        }\r\n\r\n        // Todo: This will replace the createByMarkers method. Legacy frontends needs to be adjusted first before this refactor step\r\n        private createByMarkersPayload(scope?: HTMLElement): void {\r\n            const markers: NodeListOf<HTMLElement> = this.touchPointIdentifier.getMarkersFromDom(scope, \"ESCID.ESPP.ManualProductComparison\");\r\n            for (const markerElement of Array.prototype.slice.call(markers)) {\r\n                const markerPayloadObject: TouchPointPayload = JSON.parse(markerElement.dataset.payload);\r\n\r\n                if (markerPayloadObject) {}\r\n                    this.touchPoints.push(this.createTouchPointByPayloadObject(markerElement, markerPayloadObject));\r\n            }\r\n        }\r\n\r\n        private createTouchPointEx(marker: HTMLElement): ITouchPoint {\r\n            // const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n            const slug: string = marker.dataset.slug;\r\n            const origin: string = marker.getAttribute(\"data-item-origin\");\r\n            const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n            const salesArticleVariantKey: string = marker.getAttribute(\"data-selected-colorid\");\r\n\r\n            const touchPoint = new TileScaleButtonEx(marker, salesArticleVariantKey, slug, \r\n                origin, displayedInCategoryNavKey, MobileToolbarButton.instance.getTBW_Mlt());\r\n            return touchPoint;\r\n        }\r\n\r\n        private createTouchPoint(marker: HTMLElement, salesArticleVariantKey: string): ITouchPoint {\r\n            const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n            const slug: string = marker.dataset.slug;\r\n            const origin: string = marker.getAttribute(\"data-item-origin\");\r\n            const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n            let touchPoint: ITouchPoint = null;\r\n\r\n            if (type === \"mpc-compare-button\") {\r\n                touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n            } else if (type === \"mpc-scale-tile\") {\r\n                touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n            }\r\n\r\n            return touchPoint;\r\n        }\r\n\r\n        // Todo: This will replace the createTouchPoint method. Legacy frontend needs to be adjusted first before this refactor step\r\n        private createTouchPointByPayloadObject(marker: HTMLElement, dataObject: TouchPointPayload): ITouchPoint {\r\n            const type: ServiceCallName = dataObject.type;\r\n            const salesArticleVariantKey: string = dataObject.savKey;\r\n            const slug: string = dataObject.slug;\r\n            const origin: string = marker.getAttribute(\"data-item-origin\");\r\n            const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n            let touchPoint: ITouchPoint = null;\r\n\r\n            if (type === \"mpc-compare-button\") {\r\n                touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n            } else if (type === \"mpc-scale-tile\") {\r\n                touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n            }\r\n\r\n            return touchPoint;\r\n        }\r\n    }\r\n}\r\n\r\nif(window.shell)\r\n    MPCTouchPointFactory.TouchPointFactory.instance;","import { MPCITouchPointIdentifier} from \"../typings/TouchPointIdentifier\";\n\nexport module MPCTouchPointIdentifier {\n    import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\n    import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\n\n    export class TouchPointIdentifier implements ITouchPointIdentifier {\n        private static _instance: TouchPointIdentifier;\n        private scope: HTMLElement;\n        private compareButtonMarker: string = 'mpc-compare-button';\n        private tileScaleMarker: string = 'mpc-scale-tile';\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        constructor() {\n            this.scope = document.body;\n        }\n\n        // For ATS and search page\n        getMarkersFromDomEx(type: ServiceCallName, savKeys: string[]): HTMLElement[] {\n            let scope = document.querySelector('.fas_article_tile_grid_root');\n\n            if(!scope)\n                scope = this.scope;\n\n            let result: HTMLElement[] = [];\n\n            savKeys.forEach((key) => {\n                result.push(scope.querySelector('[data-service-call=\"' + type + '\"][data-selected-colorid=\"' + key + '\"]'));\n            });\n\n        return result;\n        }\n\n        getMarkersFromDom(scope?: HTMLElement, type?: ServiceCallName): NodeListOf<HTMLElement> {\n            if (!scope) {\n                scope = this.scope;\n            }\n\n            if (type) {\n                return scope.querySelectorAll('[data-service-call=\"' + type + '\"]');\n            } else {\n                return scope.querySelectorAll('[data-service-call=' + this.compareButtonMarker + '], [data-service-call=' + this.tileScaleMarker + ']');\n            }\n        }\n        \n        getTileScaleTouchPoints(scope?: HTMLElement): NodeListOf<HTMLElement> {\n            if (!scope) {\n                scope = this.scope;\n            }\n\n            return scope.querySelectorAll('.mpc-scope.scale-tile-container');\n        }\n\n        getCompareLinks(scope?: HTMLElement): Array<HTMLAnchorElement> {\n            if (!scope) {\n                scope = this.scope;\n            }\n\n            const allLinks = scope.querySelectorAll('area[href], .imagemap-inner-container>a');\n            const compareLinks: Array<HTMLAnchorElement> = [];\n            for (let i = 0; i < allLinks.length; ++i) {\n                const link = <HTMLAnchorElement>allLinks[i];\n                const href = link.href;\n                if (href.indexOf('.html') >= 0  && (href.indexOf('&compare=true') >= 0 || href.indexOf('?compare=true') >= 0)) {\n                    compareLinks.push(link);\n                }\n            }\n            return compareLinks;\n        }\n\n        getMobileTouchPointPlaceholders(): NodeListOf<HTMLElement> {\n            const scope = this.scope;\n\n            return scope.querySelectorAll('.mobile-touchpoint-placeholder');\n        }\n    }   \n}","import { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType } from \"./helpers/vanillajax\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\"\r\n\r\ndeclare const window: Window;\r\n\r\nexport module MPCErrorHandlerModule {\r\n    import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n    export class ErrorHandlerManager {\r\n        private static _instance: ErrorHandlerManager;\r\n        private static _errorCount: number = 0;\r\n        private _settings: MpcSettings;\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        constructor() {\r\n            this.Init();\r\n        }\r\n\r\n        public Init(): void {\r\n            this._settings = MpcSettings.instance;\r\n            window.onerror = (msg, url, line, col, error) => {\r\n                ErrorHandlerManager._errorCount++;\r\n                if (ErrorHandlerManager._errorCount > 10) {\r\n                    return true;\r\n                }\r\n\r\n                const string = msg.toString().toLowerCase();\r\n                const substring = \"script error\";\r\n                if (string.indexOf(substring) === 0) {\r\n                    console.warn(\"cannot handle JS error. probably CORS issue.\");\r\n                    return false;\r\n                }\r\n\r\n                if (typeof (msg) !== \"string\") {\r\n                    let errorEvent: ErrorEvent = <ErrorEvent>(msg);\r\n                    if (errorEvent.error) {\r\n                        msg = errorEvent.error.message + \"\\n\"+ errorEvent.error.stack;\r\n                        line = errorEvent.lineno;\r\n                        col = errorEvent.colno;\r\n                        url = errorEvent.filename;\r\n                    } else {\r\n                        msg = JSON.stringify(msg);\r\n                    }\r\n                }\r\n                //log error to service\r\n                let errStr: string = undefined;\r\n                if(error)\r\n                    errStr = JSON.stringify(error);\r\n                const errorMsg = <ErrorMessage>{\r\n                    message: msg,\r\n                    url: url,\r\n                    line: line,\r\n                    col: col,\r\n                    error: errStr\r\n                };\r\n                this.LogError(errorMsg);\r\n\r\n                // for development, we want to see errors in console \r\n                const suppressDefaultErrorHandlerAkaConsolePrint = !this._settings.isDevelopment;\r\n                \r\n                return suppressDefaultErrorHandlerAkaConsolePrint;\r\n            };\r\n        }\r\n\r\n        public LogError(error: ErrorMessage): Promise<void> {\r\n            // handle only mpc errors:\r\n\r\n            // source off error has to be known, if there is bundle/ file url, skip this logging:\r\n            if (!error.url)\r\n                return;\r\n\r\n            // asset url has to contain mpc scope name\r\n            if(error.url.indexOf('manualproductcomparison') === -1)\r\n                return;\r\n            \r\n            // MPC is made on pure html and ts, we are not responsible for any react or other frameworks:\r\n            if(error.message.indexOf('ReactDOM') > 0)\r\n                return;\r\n            \r\n            // read local storage and stringify it. This will help to solve problems and get better feeling what data was used on exception:\r\n            const mpcLocalStorage = this.collectAllLocalStorageObjects();\r\n            if (mpcLocalStorage && Object.keys(mpcLocalStorage).length > 0) {\r\n                error.mpcLocalStorage = JSON.stringify(mpcLocalStorage);\r\n            }\r\n            else {\r\n                error.mpcLocalStorage = 'local storage was not found';\r\n            }\r\n\r\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\r\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n                'Debug/LogJavascriptError';\r\n            params.data = JSON.stringify(error);\r\n\r\n            return new NlVanillajax(params).postWithPromise<void>()\r\n                .then(() => {\r\n                })\r\n                .catch((reason) => {\r\n                    console.log(\"error could not be logged to service. reason: \"+reason.status+\" \"+reason.statusText);\r\n                });\r\n        }\r\n\r\n        private collectAllLocalStorageObjects(): Record<string, string> {\r\n            const oldPrefix = 'productComparison'; //no ref to LocalStorageAbstraction to avoid circular ref\r\n            const combinedData: Record<string, string> = {};\r\n\r\n            for (let i = 0; i < localStorage.length; i++) {\r\n                const key = localStorage.key(i);\r\n                if (key && key.startsWith(oldPrefix)) {\r\n                    const itemStr = localStorage.getItem(key);\r\n                    if (itemStr) {\r\n                        combinedData[key] = itemStr;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return combinedData;\r\n        }\r\n    }\r\n}\r\n\r\nMPCErrorHandlerModule.ErrorHandlerManager.instance.Init();","export module MPCScopeDetection {\n    export class ScopeDetection {\n        public static hasScopes(comparisonPage: boolean, comparisonFlyout: boolean): boolean {\n            const PcfScope: NodeListOf<HTMLElement> = document.querySelectorAll(\".pcf-scope\");\n            const PcpScope: NodeListOf<HTMLElement> = document.querySelectorAll(\".mpc-scope .grid\");\n\n            return comparisonFlyout === PcfScope.length > 0 && comparisonPage === PcpScope.length > 0;\n        }\n    }\n}","export module MpcSettingsModule {\n    export class MpcSettings {\n        private static _instance: MpcSettings;\n        private static initDone: boolean = false;\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        public init(scope: HTMLElement): void {\n            this._culture = scope.getAttribute(\"data-culture\");\n            this._portal = scope.getAttribute(\"data-portal\");\n            this._portalMandantToken = scope.getAttribute(\"data-portalmandanttoken\");\n            this._maxProducts = parseInt(scope.getAttribute(\"data-maxProducts\"));\n            this._isLoggedIn = scope.getAttribute(\"data-isLoggedIn\") === \"true\";\n            this._isDevelopment = scope.getAttribute(\"data-isDevelopment\") === \"true\";\n            this._apiUrl = scope.getAttribute(\"data-apiUrl\");\n            \n            MpcSettings.initDone = true;\n        }\n\n        private _culture:string;\n        get culture():string {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._culture;\n        }\n\n        private _portalMandantToken: string;\n        get portalMandantToken(): string {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._portalMandantToken;\n        }\n\n        private _apiUrl: string;\n        get apiUrl(): string {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._apiUrl;\n        }\n        \n        private _maxProducts:number;\n        get maxProducts():number {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._maxProducts;\n        }\n\n        private _isLoggedIn: boolean;\n        get isLoggedIn(): boolean {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._isLoggedIn;\n        }\n        \n        private _isDevelopment: boolean;\n        get isDevelopment(): boolean {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._isDevelopment;\n        }\n\n        private _portal:string;\n        get portal():string {\n            if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n            return this._portal;\n        }\n\n        public MobileCategoryNavKey: string;\n\n    }\n}","export module MPCCallLimiter {\r\n    export abstract class CallLimiter {\r\n        static debounce(callback: Function, delay: number, immediate: boolean = false): Function {\r\n            let timer: number;\r\n            return function () {\r\n                const context = this;\r\n                const args: IArguments = arguments;\r\n\r\n                const delayedCall: Function = function () {\r\n                    timer = null;\r\n                    if (!immediate) {\r\n                        callback.apply(context, args);\r\n                    }\r\n                };\r\n\r\n                const instantCall: boolean = immediate && !timer;\r\n                clearTimeout(timer);\r\n                timer = setTimeout(delayedCall, delay);\r\n\r\n                if (instantCall) {\r\n                    callback.apply(context, args);\r\n                }\r\n            };\r\n        }\r\n\r\n        static throttle(callback: Function, interval: number, leadCall: boolean = true, trailCall: boolean = true): Function {\r\n            let blockExecution = leadCall;\r\n            let resetTimer: Timer;\r\n\r\n            return function () {\r\n                const context = this;\r\n                const args: IArguments = arguments;\r\n\r\n                if (leadCall && !resetTimer) {\r\n                    callback.apply(context, args);\r\n                    blockExecution = false;\r\n\r\n                    if (!trailCall) {\r\n                        resetTimer = setTimeout(function () {\r\n                            resetTimer = null;\r\n                        }, interval);\r\n                    }\r\n                }\r\n\r\n                if (!blockExecution && trailCall) {\r\n                    blockExecution = true;\r\n\r\n                    setTimeout(function () {\r\n                        callback.apply(context, args);\r\n                        blockExecution = false;\r\n                    }, interval);\r\n\r\n                    clearTimeout(resetTimer);\r\n                    resetTimer = setTimeout(function () {\r\n                        resetTimer = null;\r\n                    }, interval + 250);\r\n                }\r\n            };\r\n        }\r\n    }\r\n\r\n    type Timer = ReturnType<typeof setTimeout>;\r\n}\r\n","import { ProductComparisonModel } from \"../../../Models/Product.generated\";\n\nexport module MPCComparePageButtonUrlUpdater {\n    export class ComparePageButtonUrlUpdater {\n        private static _instance: ComparePageButtonUrlUpdater;\n        private scope: HTMLElement;\n        private comparisonPageBaseUri: string;\n\n        public init(scope: HTMLElement): void {\n            this.scope = scope;\n            this.comparisonPageBaseUri = scope.getAttribute('data-comparisonpage-baseurl');\n        }\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        private _comparePageUrl:string = \"\";\n        get ComparePageUrl():string {\n            return this._comparePageUrl;\n        }\n\n        public onUpdatedModel(model : ProductComparisonModel): void {\n            let result: string = \"\";\n\n            if(model && model.activeNavigationTab) {\n                const activeNavigationTab = model.activeNavigationTab;\n\n                let comparisonPageUri: string = '?category=' + encodeURIComponent(activeNavigationTab);\n\n                for (const storageProduct of model.products) {\n                    if (storageProduct.categoryName === activeNavigationTab) {\n                        comparisonPageUri = comparisonPageUri + '&savKeys=' + storageProduct.articleId.salesArticleVariantKey;\n                    }\n                }\n\n                result = comparisonPageUri;\n            }\n\n            if(!this.scope || this.scope === null) {\n                // get root mpc place holder:\n                this.scope = document.querySelector('.pcf-scope');\n                this.comparisonPageBaseUri = this.scope.getAttribute('data-comparisonpage-baseurl');\n            }\n\n            this._comparePageUrl = this.comparisonPageBaseUri+result;\n\n            if (this.scope) {\n                const links = this.scope.querySelectorAll(\".comparison-page-link\");\n\n                for (let link of <HTMLElement[]><any>links) {\n                    link.setAttribute('href', this._comparePageUrl);\n                }\n            }\n        }\n    }\n}","export module MPCDeviceDetectionHelper {\r\n    export class DeviceDetectionHelper {\r\n        private static _instance: DeviceDetectionHelper;\r\n        private isTabletHandHeldDeviceEnvironment: boolean;\r\n        private isMobileShopEnvironment: boolean;\r\n        private isMicrosoftBrowserEnvironment: boolean;\r\n        private sniffJson: HTMLElement;\r\n\r\n        constructor() {\r\n            this.init();\r\n        }\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        private init(): void {\r\n            this.isTabletHandHeldDeviceEnvironment =  \r\n                document.documentElement.className.indexOf('tablet') >= 0 || document.documentElement.className.indexOf('handheld') >= 0;\r\n\r\n            this.isMobileShopEnvironment =  \r\n                document.documentElement.className.indexOf('mobileshop') >= 0;\r\n\r\n            this.isMicrosoftBrowserEnvironment =\r\n                document.documentElement.classList.contains(\"isMsie\") || document.documentElement.classList.contains(\"isEdge\");\r\n\r\n            this.sniffJson = document.getElementById(\"sniff\");\r\n            if (!this.sniffJson)\r\n                return;\r\n\r\n            const sniffJsonResult = JSON.parse(this.sniffJson.innerHTML);\r\n            let resultingClasses: string = '';\r\n            if (sniffJsonResult.isTablet) {\r\n                document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n                resultingClasses += ' tablet';\r\n            }\r\n            if (sniffJsonResult.isPhone) \r\n                resultingClasses = ' phone';\r\n            if (sniffJsonResult.isHandheld) \r\n                resultingClasses += ' handheld';\r\n            if (sniffJsonResult.isAndroid) \r\n                resultingClasses += ' android';\r\n            if (sniffJsonResult.isIOS) \r\n                resultingClasses += ' ios';\r\n            if (!resultingClasses)\r\n                return;\r\n\r\n            const htmlClasses: string = document.documentElement.className;\r\n            document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n\r\n            if (sniffJsonResult.isMsie)\r\n                document.documentElement.classList.add('isMsie');\r\n            if (sniffJsonResult.isEdge)\r\n                document.documentElement.classList.add('isEdge');\r\n        }\r\n\r\n        public isTabletHandHeldDevice(): boolean {\r\n            return this.isTabletHandHeldDeviceEnvironment;\r\n        }\r\n\r\n        public isMobileShop(): boolean {\r\n            return this.isMobileShopEnvironment;\r\n        }\r\n\r\n        public isMicrosoftBrowser(): boolean {\r\n            return this.isMicrosoftBrowserEnvironment;\r\n        }\r\n\r\n        // removed because of ESPP-4706\r\n        // public adaptLegacySniff(): void {\r\n        //     const deviceDetector = new DeviceDetector();\r\n        //     const device: DeviceDetector.DeviceDetectorResult = \r\n        //         deviceDetector.parse(window.navigator.userAgent);\r\n\r\n        //         let resultingClasses: string = '';\r\n        //         let sniffResult: string = '{';\r\n\r\n        //         if (device.device.type === 'desktop')\r\n        //             sniffResult += '\"isDesktop\": true';\r\n        //         else \r\n        //             sniffResult += '\"isDesktop\": false';\r\n\r\n        //         if (device.device.type === 'tablet') {\r\n        //             document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n        //             resultingClasses = 'tablet';\r\n        //             sniffResult += ', \"isTablet\": true';\r\n        //         }\r\n        //         else \r\n        //             sniffResult += ', \"isTablet\": false';\r\n\r\n        //         if (device.device.model === 'iPad')\r\n        //             sniffResult += ', \"isIPad\": true';\r\n        //         else \r\n        //             sniffResult += ', \"isIPad\": false';\r\n                \r\n        //         sniffResult += '}';\r\n\r\n        //         if (resultingClasses) {\r\n        //             const htmlClasses: string = document.documentElement.className;\r\n        //             document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n        //         }\r\n\r\n        //         this.sniffJson.innerHTML = sniffResult;\r\n        // }\r\n    }\r\n}","import { MPCIEventBus } from \"../typings/iEventBus\";\r\n\r\nexport module MPCEventBus {\r\n    import IEventBus = MPCIEventBus.IEventBus;\r\n    import EventName = MPCIEventBus.EventName;\r\n    import CallbackLists = MPCIEventBus.CallbackLists;\r\n    import ICallback = MPCIEventBus.ICallback;\r\n    import ISubscription = MPCIEventBus.ISubscription;\r\n    import ISubscriptionId = MPCIEventBus.ISubscriptionId;\r\n\r\n    export class EventBus implements IEventBus {\r\n        private static _instance: EventBus;\r\n        private callbackLists: CallbackLists;\r\n\r\n        private constructor() {\r\n            this.callbackLists = [];\r\n        }\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        subscribe(eventName: EventName | EventName[], callback: ICallback): ISubscriptionId[] {\r\n            if (this.isArray(eventName)) {\r\n                const subscriptionsIds: ISubscriptionId[] = [];\r\n\r\n                for (const message of eventName) {\r\n                    subscriptionsIds.push(this.createSubscription(message, callback));\r\n                }\r\n\r\n                return subscriptionsIds;\r\n            } else {\r\n                return [this.createSubscription(eventName, callback)];\r\n            }\r\n        }\r\n\r\n        subscribeMultiple(subscriptions: ISubscription[]): ISubscriptionId[] {\r\n            const subscriptionIds: ISubscriptionId[] = [];\r\n\r\n            if (!subscriptions) {\r\n                return subscriptionIds;\r\n            }\r\n\r\n            for (const subscription of subscriptions) {\r\n                const subscriptionId: ISubscriptionId = this.addSubscription(subscription);\r\n\r\n                subscriptionIds.push(subscriptionId);\r\n            }\r\n            return subscriptionIds;\r\n        }\r\n\r\n        unsubscribe(subscriptionId: ISubscriptionId | ISubscriptionId[]): void {\r\n            if (this.isArray(subscriptionId)) {\r\n                this.unSubscribeMultiple(subscriptionId);\r\n            } else {\r\n                this.removeSubscription(subscriptionId);\r\n            }\r\n        }\r\n\r\n        publish(eventName: EventName, payload?: any): void {\r\n            if (!this.callbackLists[<any>eventName]) {\r\n                return;\r\n            }\r\n\r\n            // to prevent to also iterate over subscriptions, which are created while iterating\r\n            const callbacksClone: ICallback[] = this.callbackLists[<any>eventName].slice(0);\r\n            for (const callback of callbacksClone) {\r\n                if (callback) {\r\n                    callback(payload);\r\n                }\r\n            }\r\n        }\r\n\r\n        private createSubscription(eventName: EventName, callback: ICallback): ISubscriptionId {\r\n            return this.addSubscription({\r\n                eventName: eventName,\r\n                callback: callback\r\n            });\r\n        }\r\n\r\n        private addSubscription(subscription: ISubscription): ISubscriptionId {\r\n            if (!this.callbackLists[<any>subscription.eventName]) {\r\n                this.callbackLists[<any>subscription.eventName] = [];\r\n            }\r\n\r\n            const subscriptionId: ISubscriptionId = {\r\n                eventName: subscription.eventName,\r\n                id: (this.callbackLists[<any>subscription.eventName].push(subscription.callback)) - 1\r\n            };\r\n\r\n            return subscriptionId;\r\n        }\r\n\r\n        private unSubscribeMultiple(subscriptionIds: ISubscriptionId[]): void {\r\n            for (const subscriptionId of subscriptionIds) {\r\n                this.removeSubscription(subscriptionId);\r\n            }\r\n        }\r\n\r\n        private removeSubscription(subscriptionId: ISubscriptionId): void {\r\n            const subscription: ICallback = this.callbackLists[<any>subscriptionId.eventName][subscriptionId.id];\r\n            if (subscription) {\r\n                this.callbackLists[<any>subscriptionId.eventName][subscriptionId.id] = undefined;\r\n            }\r\n        }\r\n\r\n        private isArray(element: any): element is any[] {\r\n            return Array.isArray(element);\r\n        }\r\n    }\r\n}","export module MPCElementsHelper {\n    export class HtmlElementsHelper {\n        public static appendChildAtIndex(child: HTMLElement, index: number, parent: HTMLElement): void {\n            if(index >= parent.children.length) {\n                parent.appendChild(child);\n            }\n            else {\n                parent.insertBefore(child, parent.children[index]);\n            }\n        }\n    }\n}","import {MPCElementsHelper} from \"../helpers/htmlElementsHelper\";\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\nimport { MPCIAbstractContent } from \"../typings/iAbstractContent\";\nimport { MPCNotificationService } from \"../PCF/notification-service\";\nimport { NavigationTab } from \"../../../Models/Product.generated\";\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\nimport { MPCLocalStorageService } from \"../local-storage-service\";\n\nexport module MPCNavigationService {\n    import INavigationService = MPCINavigationService.INavigationService;\n    import HtmlElementsHelper = MPCElementsHelper.HtmlElementsHelper;\n    import IAbstractContent = MPCIAbstractContent.IAbstractContent;\n    import NotificationService = MPCNotificationService.NotificationService;\n    import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\n    import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\n\n    //extend the service interface by some properties that are only used in TS\n    interface NavigationTabTs extends NavigationTab {\n        domNode: HTMLElement;\n        savKeys: string[];\n    }\n\n    export class NavigationService implements INavigationService {\n        private static _instance: NavigationService;\n        private navigationTabs: HTMLElement;\n        private selectCategoryButton: HTMLElement;\n        private navigationTabsArray: Array<NavigationTabTs>;\n        private activeNavigationTab: NavigationTabTs;\n        private parentElement: HTMLElement;\n        private navigationTabKeyName: string;\n        private abstractContent: IAbstractContent;\n        private notificationService: NotificationService;\n        private deviceDetectionHelper: DeviceDetectionHelper;\n        private productComparisonModelManager: ProductComparisonModelManager;\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        init(parentElement: HTMLElement, navigationTabKeyName: string, abstractContent: IAbstractContent): void {\n\n            if (parentElement) {\n                this.deviceDetectionHelper = DeviceDetectionHelper.instance;\n                this.notificationService = NotificationService.instance;\n                this.parentElement = parentElement;\n                this.selectCategoryButton = this.parentElement.querySelector('.select-category-button');\n                this.navigationTabs = this.parentElement.querySelector('.navigation-tabs');\n                this.navigationTabsArray = new Array<NavigationTabTs>();\n                this.navigationTabKeyName = navigationTabKeyName;\n                this.abstractContent = abstractContent;\n                this.registerButtonEvent();\n            }\n        }\n\n        private registerButtonEvent(): void {\n            if (this.selectCategoryButton)\n                this.selectCategoryButton.addEventListener('click', () => {\n                    this.notificationService.notifyEmptyList();\n                });\n        }\n\n        private switchNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\n            if (this.activeNavigationTab) {\n                this.activeNavigationTab.domNode.classList.remove('active-tab');\n\n                const newActiveNavigationTabName: string = newActiveNavigationTab.name;\n                const oldNavigationTabName: string = this.activeNavigationTab.name;\n\n                if (this.deviceDetectionHelper.isMobileShop()) {\n                    // clear locked column info:\n                    this.productComparisonModelManager = ProductComparisonModelManager.instance;\n                    this.productComparisonModelManager.clearLockedColumnIndex();\n                    this.productComparisonModelManager.clearCarouselScrollIndex();\n                }\n\n                if (this.abstractContent) {\n                    this.abstractContent.updateContainerListVisibility(newActiveNavigationTabName, oldNavigationTabName);\n                }\n            }\n\n            this.activeNavigationTab = newActiveNavigationTab;\n            newActiveNavigationTab.domNode.classList.add('active-tab');\n        }\n\n        private scrollToNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\n            const buttonLeftEdgePosition = newActiveNavigationTab.domNode.getBoundingClientRect().left;\n            const buttonRightEdgePosition = buttonLeftEdgePosition + newActiveNavigationTab.domNode.offsetWidth;\n            const rightMargin = 10;\n\n            if (buttonRightEdgePosition > window.innerWidth) {\n                this.navigationTabs.scrollLeft = buttonRightEdgePosition + rightMargin - window.innerWidth;\n            }\n        }\n\n        public createOrUpdateNavigationTab(categoryName: string, counterNumber: number, navigationOrder: number,\n            salesArticleVariantKey: string, createEmptyNavTab: boolean = false): void {\n            let isNew: boolean = true;\n            \n            // look for existing tab:\n            for(const navigationTab of this.navigationTabsArray) {\n                const currentNavigationTabName = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\n                if(currentNavigationTabName === categoryName) {\n                    if (navigationTab.savKeys.indexOf(salesArticleVariantKey) >= 0) {\n                        return; //sav already added (happens when ajax reloads)\n                    }\n                    if (counterNumber > 0) {\n                        navigationTab.savKeys.push(salesArticleVariantKey);\n                        if(!this.abstractContent)//that URL is only used from PCP\n                            this.appendSavKeyToNavTabUrl(navigationTab, salesArticleVariantKey);\n                    } else if (counterNumber < 0) {\n                        navigationTab.savKeys = navigationTab.savKeys.slice(navigationTab.savKeys.indexOf(salesArticleVariantKey), 1);\n                        //no removal from url nessesary because that URL is only used from PCP, where articles are only added \n                        //(when loading the page, remove triggers a page reload)\n                    }\n                    this.updateCounter(navigationTab, counterNumber);\n\n                    isNew = false;\n                    break;\n                }\n            }\n\n            if (isNew) {\n                const newNavigationTab: NavigationTabTs = this.createNavigationTab(categoryName, salesArticleVariantKey,\n                    navigationOrder, createEmptyNavTab);\n                this.updateCounter(newNavigationTab, counterNumber);\n                let indexToInsert = 0;\n                for (let navigationTab of this.navigationTabsArray) {\n                    if (navigationOrder < navigationTab.navigationOrder) {\n                        break;\n                    }\n                    indexToInsert++;\n                }\n\n                this.navigationTabsArray.splice(indexToInsert, 0, newNavigationTab);\n                \n                // tab navigation:\n                newNavigationTab.domNode.setAttribute('focusable', '');\n\n                HtmlElementsHelper.appendChildAtIndex(newNavigationTab.domNode, indexToInsert, this.navigationTabs);\n                newNavigationTab.domNode.addEventListener('click', () => {\n                    this.switchNavigationTab(newNavigationTab);\n                });\n\n                if (window.shell.tabNav !== undefined)\n                    window.shell.tabNav.onActivated('.navigation-tab .has-focus', \n                        () => {  this.switchNavigationTab(newNavigationTab); });\n            }\n        }\n\n        public updateSelectCategoryButtonVisibility(): void {\n            if (!this.selectCategoryButton)\n                return;\n\n            if (!this.isAnyProductCounted())\n                this.selectCategoryButton.classList.remove(\"hidden\");\n        }\n\n        private isAnyProductCounted(): boolean {\n            let productFound = false;\n            this.navigationTabsArray.forEach((tab: NavigationTabTs) => {\n                if (this.getCounterNumber(tab)) {\n                    productFound = true;\n                    return;\n                }\n            });\n\n            return productFound;\n        }\n\n        private updateCounter(navigationTab: NavigationTabTs, counterNumber: number): void {\n            const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n            let counter: number = Number(productsCounter.textContent.trim());\n            \n            counter += counterNumber;\n            productsCounter.innerText = counter.toString();\n        }\n\n        private getCounterNumber(navigationTab: NavigationTabTs): number {\n            const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n            return Number(productsCounter.innerText);\n        }\n        \n        private appendSavKeyToNavTabUrl(navigationTab: NavigationTabTs, salesArticleVariantKey: string): void {\n            let comparisonPageUri: string = navigationTab.domNode.getAttribute('href');\n            comparisonPageUri = comparisonPageUri + '&savKeys=' + salesArticleVariantKey;\n            navigationTab.domNode.setAttribute('href', comparisonPageUri);\n        }\n\n        private createNavigationTab(categoryName: string, salesArticleVariantKey: string, order: number,\n            createEmptyNavTab: boolean): NavigationTabTs {\n            let newNavigationTab: NavigationTabTs = {} as NavigationTabTs;\n            newNavigationTab.navigationOrder = order;\n            newNavigationTab.name = categoryName;\n            newNavigationTab.savKeys = [salesArticleVariantKey];\n            let newNavigationTabHtml: HTMLElement;\n\n            if (salesArticleVariantKey || createEmptyNavTab) {\n                // create navigation ab from comparison page:\n                newNavigationTabHtml = document.createElement('a');\n\n                // comparisonPageUri is used in PCP page, flyout does not need it:\n                let comparisonPageUri: string;\n                if (!this.abstractContent) {\n                    comparisonPageUri = '?category=' + encodeURIComponent(categoryName);\n                    if (salesArticleVariantKey) {\n                        comparisonPageUri += '&savKeys=' + salesArticleVariantKey;\n                    }\n                } else {\n                    comparisonPageUri = 'javascript:';\n                }\n\n                newNavigationTabHtml.setAttribute('href', comparisonPageUri);\n            }\n            else {\n                // create navigation tab for flyout:\n                newNavigationTabHtml = document.createElement('div');\n            }\n            \n            const newCategoryName: HTMLElement = document.createElement('div');\n            const newArticlesCounter: HTMLElement = document.createElement('div');\n\n            newNavigationTabHtml.className = 'navigation-tab';\n            newNavigationTabHtml.setAttribute(this.navigationTabKeyName, categoryName);\n            newCategoryName.className = 'category-name';\n            newCategoryName.innerText = categoryName;\n            newArticlesCounter.className = 'products-counter';\n            \n            newNavigationTabHtml.appendChild(newCategoryName);\n            newNavigationTabHtml.appendChild(newArticlesCounter);\n\n            newNavigationTabHtml.addEventListener('keydown', (event: any) => {\n                // prevent page jump down on Space btn., click\n                if (event.code === 'Space')\n                    event.preventDefault();\n\n                if(!window.shell.tabNav)\n                    return;\n        \n                if (event.code === 'ArrowRight' && event.target.nextElementSibling) {\n                    window.shell.tabNav.focus(event.target.nextElementSibling);\n                }\n        \n                if (event.code === 'ArrowLeft' && event.target.previousElementSibling) {\n                    window.shell.tabNav.focus(event.target.previousElementSibling);\n                }\n            });\n\n            newNavigationTab.domNode = newNavigationTabHtml;\n            return newNavigationTab;\n        }\n\n        public removeEmptyNavigationTabs(): void {\n            if(this.navigationTabsArray) {\n                let removableNavigationTabs: Array<NavigationTabTs> = new Array<NavigationTabTs>();\n\n                for (const navigationTab of this.navigationTabsArray) {\n                    const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\n                    const counter: number = Number(productsCounter.innerText);\n\n                    if (counter == 0) {\n                        removableNavigationTabs.push(navigationTab);\n                        \n                        // remove highlight from last navigation tab:\n                        // temporary disabled by customer: ESPP-1523\n                        /* if (this.navigationTabsArray.length == 1) {\n                            this.navigationTabsArray[0].classList.remove('active-tab');\n                        } */\n                    }\n                }\n\n                for (const tmpTab of removableNavigationTabs) {\n                    this.navigationTabs.removeChild(tmpTab.domNode);\n                    this.navigationTabsArray.splice(this.navigationTabsArray.indexOf(tmpTab), 1);\n                }\n            }\n        }\n\n        public markActiveNavigationTab(categoryName: string): boolean {\n            let newTabActivated: boolean;\n            for (const navigationTab of this.navigationTabsArray) {\n                let navigationTabName: string = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\n\n                if (navigationTabName === categoryName) {\n                    this.switchNavigationTab(navigationTab);\n                    this.scrollToNavigationTab(navigationTab);\n                    newTabActivated = true;\n                    break;\n                }\n            }\n\n            return newTabActivated;\n        }\n\n        public markAnyNavigationTabActive(): string {\n            // after category was cleared, active tab is not selected.\n            // Need to define last one o first one navigation tab from navigation service container.\n            let newActiveTabCatName: string;\n\n            if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\n                const newActiveTab: NavigationTabTs =\n                    this.navigationTabsArray[this.navigationTabsArray.length - 1];\n\n                newActiveTabCatName = newActiveTab.name;\n                this.switchNavigationTab(newActiveTab);\n                this.scrollToNavigationTab(newActiveTab);\n            }\n\n            return newActiveTabCatName;\n        }\n\n        public getFirstNavigationTab(): HTMLElement {\n            if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\n                const firstTab: NavigationTabTs = this.navigationTabsArray[0];\n\n                return firstTab.domNode;\n            }\n\n            return;\n        }\n    }\n}","//IE polyfills\nimport 'eligrey-classlist-js-polyfill';\nimport 'element-remove';\nif (typeof NodeList.prototype.forEach !== \"function\" && typeof Array.prototype.forEach === \"function\")\n    NodeList.prototype.forEach = ((Array.prototype.forEach) as any);","export module MPCScrollLock {\n    export class ScrollLock\n    {\n        private static _instance: ScrollLock;\n        private bodyScrollPosition: number = 0;\n\n        static get instance() {\n            return this._instance || (this._instance = new this());\n        }\n\n        public lock(): void {\n            const webContainer = document.querySelector('.container');\n            const mobileContainer = document.querySelector('.page-container');\n            this.bodyScrollPosition = window.pageYOffset;\n    \n            if (webContainer || mobileContainer)\n                document.body.setAttribute(\n                    'style',\n                    'overflow: hidden !important; position: fixed !important; top: -' +\n                        this.bodyScrollPosition +\n                        'px;'\n                );\n        }\n    \n        public unlock(): void {\n            const webContainer = document.querySelector('.container');\n            const mobileContainer = document.querySelector('.page-container');\n    \n            if (webContainer || mobileContainer) {\n                document.body.removeAttribute('style');\n                window.scrollTo(0, this.bodyScrollPosition);\n            }\n        }\n    }\n}","export interface INlVanillajaxParams {\n    query?: string;\n    data?: any;\n    url: string;\n    contentType: ContentType;\n}\n\nexport enum ContentType {\n    JSON,\n    Plain\n}\n\nexport interface HtmlResult {\n    Html: string;\n}\n\nexport class NlVanillajax {\n    headers: any[];\n    private params: INlVanillajaxParams;\n    private req: XMLHttpRequest;\n\n    constructor(params: INlVanillajaxParams) {\n        this.headers = [\n            { \"name\": \"Accept\", \"value\": \"text/html,application/json\" },\n            { \"name\": \"Content-Type\", \"value\": \"application/json\" }\n        ];\n        this.params = params;\n        this.params.query = params.query || \"\";\n        this.params.data = params.data || null;\n        this.params.contentType = params.contentType || ContentType.JSON;\n        this.req = this.xhr(window);\n    }\n\n    post(callback: Function): NlVanillajax {\n        this.open(this.req, \"POST\", this.params.url + (this.params.query.length ? \"?\" + this.params.query : \"\"));\n        this.setHeaders(this.req, this.headers);\n        this.onReadyStateChange(this.req, callback);\n        this.send(this.req, this.params.data);\n\n        return this;\n    }\n\n    postWithPromise<T>(): Promise<T> {\n        let self = this;\n        return new Promise(function (resolve, reject) {\n            self.open(self.req, \"POST\", self.params.url + (self.params.query.length ? \"?\" + self.params.query : \"\"));\n            self.setHeaders(self.req, self.headers);\n            self.req.onload = function () {\n                if (this.status >= 200 && this.status < 300) {\n                    let result = self.getResult<T>(self.req);\n                    if (result)\n                        resolve(result);\n                    else\n                        reject({\n                            status: this.status,\n                            statusText: \"response not interpretable\"\n                        });\n                } else {\n                    reject({\n                        status: this.status,\n                        statusText: self.req.statusText\n                    });\n                }\n            };\n            self.req.onerror = function () {\n                reject({\n                    status: this.status,\n                    statusText: self.req.statusText\n                });\n            };\n            self.send(self.req, self.params.data);\n        });\n    }\n\n    getWithPromise(): Promise<HtmlResult> {\n        let self = this;\n        return new Promise(function (resolve, reject) {\n            self.open(self.req, \"GET\", self.params.url);\n            self.setHeaders(self.req, self.headers);\n            //self.req.withCredentials = true;\n            self.req.onload = function () {\n                if (this.status >= 200 && this.status < 300) {\n                    let result = self.getHtmlResult(self.req);\n                    if(result)\n                        resolve(result);\n                    else\n                        reject({\n                            status: this.status,\n                            statusText: \"response not interpretable\"\n                        });\n                } else {\n                    reject({\n                        status: this.status,\n                        statusText: self.req.statusText\n                    });\n                }\n            };\n            self.req.onerror = function () {\n                reject({\n                    status: this.status,\n                    statusText: self.req.statusText\n                });\n            };\n            self.sendGet(self.req);\n        });\n    }\n\n    private xhr(win: any): XMLHttpRequest {\n        return new win.XMLHttpRequest();\n    }\n\n    private open(req: XMLHttpRequest, method: string, url: string): any {\n        req.open(method, url);\n\n        return req;\n    }\n\n    private setHeaders(req: XMLHttpRequest, headers: any[]): XMLHttpRequest {\n        headers.forEach(header => req.setRequestHeader(header.name, header.value));\n\n        return req;\n    }\n\n    private onReadyStateChange(req: XMLHttpRequest, callback: Function): XMLHttpRequest {\n        req.onreadystatechange = () => {\n\n            if (req.readyState === XMLHttpRequest.DONE) {\n                let result = this.getResult(req);\n\n                callback(result, req.status);\n            }\n        }\n\n        return req;\n    }\n\n    private getHtmlResult(req: XMLHttpRequest): HtmlResult {\n        let json: HtmlResult;\n\n        if (req.responseText) {\n            json = { \"Html\": req.responseText };\n        } else {\n            json = null;\n        }\n\n        return json;\n    }\n\n    private getResult<T>(req: XMLHttpRequest): T {\n        let json: T;\n        try {\n            json = JSON.parse(req.responseText);\n        } catch (e) {\n            json = null;\n        }\n\n        return json;\n    }\n\n    private send(req: XMLHttpRequest, data: any): XMLHttpRequest {\n        req.send(data);\n\n        return req;\n    }\n\n    private sendGet(req: XMLHttpRequest): XMLHttpRequest {\n        req.send();\n\n        return req;\n    }\n}","import { MPCNotificationService } from \"./PCF/notification-service\";\r\nimport { ProductComparisonModel, Product, NavigationTab } from \"../../Models/Product.generated\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\";\r\nimport { NlVanillajax, INlVanillajaxParams } from \"./helpers/vanillajax\";\r\nimport { MPCComparePageButtonUrlUpdater } from \"./helpers/comparePageButtonUrlUpdater\";\r\nimport { MPCAddElementContext } from \"./typings/addElementContext\";\r\nimport { MPCErrorHandlerModule } from \"./errorhandler\";\r\nimport { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\n\r\nexport module MPCLocalStorageService {\r\n    import AddElementContext = MPCAddElementContext.AddElementContext;\r\n    import NotificationService = MPCNotificationService.NotificationService;\r\n    import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\r\n    import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\r\n    import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n    export enum AddResult {\r\n        Added,\r\n        Replaced,\r\n        RejectedCapacity,\r\n        RejectedDuplicate\r\n    }\r\n\r\n    export class ProductComparisonModelManager {\r\n        private static _instance: ProductComparisonModelManager;\r\n        private notificationService: NotificationService;\r\n        private localStorageAbstraction: LocalStorageAbstraction;\r\n        private localStorageCache: ProductComparisonModel;\r\n        private runningServiceCall: Promise<ProductComparisonModel>;\r\n        private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\r\n        private readonly DuplicateNotFound: number = -1;\r\n        private readonly DuplicateExact: number = -2;\r\n\r\n        static get instance() {\r\n            return this._instance || (this._instance = new this());\r\n        }\r\n\r\n        constructor() {\r\n            this.init();\r\n        }\r\n\r\n        private init(): void {\r\n            this.notificationService = NotificationService.instance;\r\n            this.localStorageAbstraction = LocalStorageAbstraction.instance;\r\n            this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n            this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\r\n            // here we load the model (from localStorage and with server-sync if deemed necessary) \r\n            // for later usage by all the components\r\n            this.getModel();\r\n        }\r\n\r\n        public getModel(): Promise<ProductComparisonModel> {\r\n            if (this.runningServiceCall) {\r\n                // this service call is a singleton, avoid useless parallel calls \r\n                return this.runningServiceCall;\r\n            }\r\n            this.runningServiceCall = new Promise((resolve, reject) => {\r\n                try {\r\n                    this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n                    if (this.localStorageCache && this.localStorageCache.products.length > 0 \r\n                        && !this.localStorageCache.activeNavigationTab) {\r\n                        this.localStorageCache.activeNavigationTab = this.localStorageCache.products[0].categoryName;\r\n                    }\r\n                    if (this.localStorageCache && typeof this.localStorageCache.mobileEnabledCategories != \"object\") {\r\n                        this.localStorageCache.mobileEnabledCategories = [];\r\n                    }\r\n                    this.validateLocalStorage();\r\n                } catch (err) {\r\n                    ErrorHandlerManager.instance.LogError(<ErrorMessage>{\r\n                        message: \"resetting mpc localStorage because: \" +\r\n                            err +\r\n                            \", localStorage: \" +\r\n                            JSON.stringify(this.localStorageCache)\r\n                    }); \r\n                    this.localStorageCache = undefined;\r\n                }\r\n\r\n                const isNewlyLoggedOut = !MpcSettings.instance.isLoggedIn && this.localStorageCache && !!this.localStorageCache.isLoggedIn;\r\n                if (!this.localStorageCache || ProductComparisonModelManager.isTimedOut(this.localStorageCache) \r\n                    || isNewlyLoggedOut) {\r\n                    this.createNewLocalStorage();\r\n                    resolve(this.localStorageCache);\r\n                    return;\r\n                }\r\n                if (MpcSettings.instance.isLoggedIn && !this.localStorageCache.isLoggedIn) {\r\n                    this.localStorageCache.isLoggedInNewly = true;\r\n                }\r\n                this.localStorageCache.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n                const needsValidation = this.needsValidation();\r\n                if (!needsValidation) {\r\n                    if (this.localStorageCache.pageLanguage !== MpcSettings.instance.culture) { // if for logical readability :)\r\n                        this.localStorageCache.pageLanguage = MpcSettings.instance.culture;\r\n                    }\r\n                    \r\n                    this.onUpdatedModel(true);\r\n                    \r\n                    resolve(this.localStorageCache);\r\n                    return;\r\n                }\r\n\r\n                this.sync()\r\n                    .then((model)=>resolve(model))\r\n                    .catch((error)=>reject(error));\r\n            });\r\n            this.runningServiceCall.then((model) => {\r\n                this.runningServiceCall = null;\r\n            })\r\n            return this.runningServiceCall;\r\n        }\r\n\r\n        private sync(): Promise<ProductComparisonModel> {\r\n            const printPageContent = this.localStorageCache.printPageContent;\r\n            this.localStorageCache.printPageContent = null;\r\n\r\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\r\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n                'Products/Sync';\r\n            params.data = JSON.stringify(this.localStorageCache);\r\n\r\n            const countBefore = this.localStorageCache.products.length;\r\n\r\n            return new NlVanillajax(params).postWithPromise<ProductComparisonModel>()\r\n                .then((model) => {\r\n                    if (!model || !model.products) {\r\n                        this.localStorageCache.printPageContent = printPageContent;\r\n                        return Promise.reject(\"service returned no useful result\");\r\n                        //throw new Error(\"service returned no useful result\");\r\n                    }\r\n                    // false will not be send over the wire, but we don't want undefined values\r\n                    model.clearStoredEmptyNavigationTabs = !!model.clearStoredEmptyNavigationTabs;\r\n                    model.hasClientSideChange = false;\r\n                    this.localStorageCache = model;\r\n                    this.localStorageCache.printPageContent = printPageContent;\r\n                    this.onUpdatedModel(true); //skipSaving=true, because 'validate' saves internally\r\n                    const countAfter = model.products.length;\r\n                    if (countBefore === 0 && countAfter > 0) {\r\n                        this.setMobileHeaderMarkerOn();\r\n                    } else if (countBefore > 0 && countAfter === 0) {\r\n                        this.setMobileHeaderMarkerOff();\r\n                    }\r\n                    return this.localStorageCache;\r\n                })\r\n                .catch((err) => {\r\n                    this.localStorageCache.printPageContent = printPageContent;\r\n                    return Promise.reject(err);\r\n                });\r\n        }\r\n\r\n        private validateLocalStorage(): void {\r\n            //there were some problems with old/invalid localStorage contents, so we detect and reset them\r\n            if (this.localStorageCache) {\r\n                if (!Array.isArray(this.localStorageCache.products))\r\n                    throw \"localStorage is corrupted - products is no array\";\r\n                if (!this.localStorageCache.lastUpdateTime)\r\n                    throw \"localStorage is corrupted - lastUpdateTime is not set\";\r\n                if (typeof this.localStorageCache.lastUpdateTime !== \"number\")\r\n                    throw \"localStorage is corrupted - lastUpdateTime is no number\";\r\n                if (this.localStorageCache.products.length > 0) {\r\n                    if (!this.localStorageCache.activeNavigationTab)\r\n                        throw \"localStorage is corrupted - activeNavigationTab is not set\";\r\n                    if (typeof this.localStorageCache.activeNavigationTab !== \"string\")\r\n                        throw \"localStorage is corrupted - activeNavigationTab is no string\";\r\n                }\r\n                if (!this.localStorageCache.pageLanguage)\r\n                    throw \"localStorage is corrupted - pageLanguage is not set\";\r\n                if (typeof this.localStorageCache.pageLanguage !== \"string\")\r\n                    throw \"localStorage is corrupted - pageLanguage is no string\";\r\n                if (typeof this.localStorageCache.clearStoredEmptyNavigationTabs !== \"boolean\")\r\n                    throw \"localStorage is corrupted - clearStoredEmptyNavigationTabs is no boolean\";\r\n                if (!Array.isArray(this.localStorageCache.emptyNavigationTabs))\r\n                    throw \"localStorage is corrupted - emptyNavigationTabs is no array\";\r\n                if (this.localStorageCache.products.length > 0) {\r\n                    if (!this.localStorageCache.products[0].articleId.masterArticleNo) {\r\n                        throw \"localStorage is corrupted - products[0].articleId.masterArticleNo is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].articleId.salesArticleVariantKey) {\r\n                        throw \"localStorage is corrupted - products[0].articleId.salesArticleVariantKey is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].articleId.seoDescription) {\r\n                        throw \"localStorage is corrupted - products[0].articleId.seoDescription is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].articleId.seoSlug) {\r\n                        throw \"localStorage is corrupted - products[0].articleId.seoSlug is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].categoryName) {\r\n                        throw \"localStorage is corrupted - products[0].categoryName is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].categoryUrl) {\r\n                        throw \"localStorage is corrupted - products[0].categoryUrl is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].detailsPageUrl) {\r\n                        throw \"localStorage is corrupted - products[0].detailsPageUrl is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].mainImage) {\r\n                        throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].originNavigationKeyPath) {\r\n                        throw \"localStorage is corrupted - products[0].originNavigationKeyPath is not set\";\r\n                    }\r\n                    if (typeof this.localStorageCache.products[0].navigationOrder !== \"number\") {\r\n                        throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n                    }\r\n                    if (!this.localStorageCache.products[0].title) {\r\n                        throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        public setActiveNavigationTab(activeNavigationTab: string): void {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n            if (this.localStorageCache.activeNavigationTab !== activeNavigationTab) {\r\n                this.localStorageCache.activeNavigationTab = activeNavigationTab;\r\n                this.onUpdatedModel(true); //don't save, who cares\r\n            }\r\n        }\r\n        \r\n        public activateOnMobileCategory(categoryNavKey: string): void {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n\r\n            this.localStorageCache.mobileEnabledCategories.push(categoryNavKey);\r\n            this.onUpdatedModel(true);//dont save, who cares\r\n        }\r\n\r\n        public isActivatedOnMobileCategory(categoryNavKey: string): boolean {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n\r\n            return this.localStorageCache.mobileEnabledCategories &&\r\n                   this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey) >= 0;\r\n        }\r\n\r\n        public deactivateOnMobileCategory(categoryNavKey: string): void {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n\r\n            const idx = this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey);\r\n            this.localStorageCache.mobileEnabledCategories.splice(idx, idx >= 0 ? 1 : 0);\r\n            this.onUpdatedModel(true);//dont save, who cares\r\n        }\r\n\r\n        public addProduct(product: Product): AddResult {\r\n            if (this.localStorageCache) {\r\n                this.setActiveNavigationTab(product.categoryName);\r\n\r\n                const duplicateCheckResult = this.checkDuplicateProductPerCategory(\r\n                    product.articleId.salesArticleVariantKey,\r\n                    product.categoryName,\r\n                    product.articleId.masterArticleNo\r\n                );\r\n                if (duplicateCheckResult === this.DuplicateNotFound && this.isAlreadyAtLimit(product.categoryName)) {\r\n                    this.notificationService.notifyMaximumProductsCountReached();\r\n                    return AddResult.RejectedCapacity;\r\n                }\r\n                \r\n                if (duplicateCheckResult === this.DuplicateNotFound) {\r\n                    this.appendProductToList(product, false);\r\n                    return AddResult.Added;\r\n                }\r\n                else {\r\n                    if (duplicateCheckResult !== this.DuplicateExact) {\r\n                        this.localStorageCache.products[duplicateCheckResult] = product;\r\n                        this.localStorageCache.hasClientSideChange = true;\r\n                        this.onUpdatedModel(false);\r\n                    }\r\n\r\n                    // just show new product notification, because product is already added:\r\n                    this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n                    if (duplicateCheckResult !== this.DuplicateExact) {\r\n                        return AddResult.Replaced;\r\n                    } else {\r\n                        return AddResult.RejectedDuplicate;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                this.createNewLocalStorage();\r\n\r\n                this.appendProductToList(product, false);\r\n\r\n                return AddResult.Added;\r\n            }\r\n        }\r\n\r\n        private onUpdatedModel(skipSaving: boolean): Promise<ProductComparisonModel> {\r\n            return new Promise((resolve, reject) => {\r\n                const afterSave = (model: ProductComparisonModel) => {\r\n                    this.comparePageButtonUrlUpdater.onUpdatedModel(model);\r\n                    this.localStorageAbstraction.writeLocalStorage(model);\r\n                }\r\n\r\n                if (!skipSaving && this.localStorageCache.isLoggedIn) {\r\n                    this.sync()\r\n                        .then((syncedModel) => {\r\n                            afterSave(syncedModel);\r\n                            resolve(syncedModel);\r\n                        })\r\n                        .catch((error) => {\r\n                            reject(error);\r\n                        });\r\n                } else {\r\n                    afterSave(this.localStorageCache);\r\n                }\r\n            });\r\n        }\r\n\r\n        public removeAllProductsOfCategory(categoryName: string): Promise<ProductComparisonModel> {\r\n            return new Promise((resolve, reject) => {\r\n                let articleRemoved: boolean = false;\r\n                const productsAfter: Product[] = [];\r\n                for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n                    const tmpProduct: Product = this.localStorageCache.products[i];\r\n                    if (tmpProduct.categoryName !== categoryName) {\r\n                        productsAfter.push(tmpProduct);\r\n                    } else {\r\n                        articleRemoved = true;\r\n                    }\r\n                }\r\n                if (productsAfter.length == 0) {\r\n                    //unmarks when removing the last\r\n                    this.setMobileHeaderMarkerOff();\r\n                }\r\n\r\n                this.localStorageCache.products = productsAfter;\r\n                if (this.localStorageCache.products.length > 0) {\r\n                    this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n                } else {\r\n                    this.setActiveNavigationTab(null);\r\n                }\r\n\r\n                if (articleRemoved) {\r\n                    this.localStorageCache.hasClientSideChange = true;\r\n                    this.onUpdatedModel(false);\r\n                }\r\n            });\r\n        }\r\n        \r\n        private setMobileHeaderMarkerOn(): void {\r\n            if (window.shell)\r\n                window.shell.publishTo('ESMKT.MegaMenu.MarkItem', \"mpc\");\r\n        }\r\n\r\n        private setMobileHeaderMarkerOff(): void {\r\n            if (window.shell)\r\n                window.shell.publishTo('ESMKT.MegaMenu.UnmarkItem', \"mpc\");\r\n        }\r\n\r\n        public removeProduct(categoryName: string, salesArticleVariantKey: string): Product {\r\n            let articleRemoved: Product = null;\r\n\r\n            for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n                const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n                if (tmpProduct.articleId.salesArticleVariantKey === salesArticleVariantKey\r\n                    && tmpProduct.categoryName === categoryName) {\r\n                    this.localStorageCache.products.splice(i, 1);\r\n                    //unmarks when removing the last\r\n                    if (this.localStorageCache.products.length === 0) {\r\n                        this.setMobileHeaderMarkerOff();\r\n                    }\r\n                    articleRemoved = tmpProduct;\r\n\r\n                    break;\r\n                }\r\n            }\r\n            if (!this.localStorageCache.products.some(p => p.categoryName === categoryName)) {\r\n                if (this.localStorageCache.products.length > 0) {\r\n                    this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n                } else {\r\n                    this.setActiveNavigationTab(null);\r\n                }\r\n            }\r\n\r\n            if (articleRemoved) {\r\n                this.localStorageCache.hasClientSideChange = true;\r\n                this.onUpdatedModel(false);\r\n            }\r\n\r\n            return articleRemoved;\r\n        }\r\n        \r\n        public addProductBySavKey(salesArticleVariantKey: string, seoSlug: string, origin: string, originNavKeyPathOverride: string = undefined): Promise<Product> {\r\n            const context: AddElementContext = new class implements AddElementContext {\r\n                salesArticleVariantKey: string;\r\n                originSeoSlug: string;\r\n                origin: string;\r\n            };\r\n\r\n            context.salesArticleVariantKey = salesArticleVariantKey;\r\n            context.originSeoSlug = seoSlug;\r\n            context.origin = origin;\r\n\r\n            // Call controller method, via ajax, and get image and text info from MPC\r\n            let params: INlVanillajaxParams = <INlVanillajaxParams>{};\r\n            params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\r\n            params.data = JSON.stringify(context);\r\n\r\n            let nlVanillajax = new NlVanillajax(params);\r\n            let postWithPromise = nlVanillajax.postWithPromise<Product>();\r\n\r\n            postWithPromise.then((productDataFromService: Product) => {\r\n                    if (productDataFromService) {\r\n                        if (originNavKeyPathOverride) {\r\n                            productDataFromService.originNavigationKeyPath = originNavKeyPathOverride;\r\n                        }\r\n                        this.appendProductToList(productDataFromService, true);\r\n                    }\r\n                })\r\n                .catch((err) => {\r\n                    ErrorHandlerManager.instance.LogError(<ErrorMessage>{\r\n                        message: \"error getting product info because: \" +\r\n                            err +\r\n                            \", salesArticleVariantKey: \" +\r\n                            salesArticleVariantKey\r\n                    }); \r\n                });\r\n\r\n            return postWithPromise;\r\n        }\r\n\r\n        private checkDuplicateProductPerCategory(salesArticleVariantKey: string, categoryName: string, masterArticleNo: number): number {\r\n            for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n                const product: Product = this.localStorageCache.products[i];\r\n\r\n                // avoid duplicate products\r\n                if (product.articleId.masterArticleNo === masterArticleNo\r\n                    && product.categoryName === categoryName) {\r\n                    if (product.articleId.salesArticleVariantKey === salesArticleVariantKey) {\r\n                        return this.DuplicateExact;\r\n                    } else {\r\n                        return i; //same MaNo but different SavKey -> this product will be replaced by the new variant\r\n                    }\r\n                }\r\n            }\r\n\r\n            return this.DuplicateNotFound;\r\n        }\r\n\r\n        private isAlreadyAtLimit(categoryName: string): boolean {\r\n            let productsAmount: number = 0;\r\n            let result: boolean = false;\r\n\r\n            for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n                const product: Product = this.localStorageCache.products[i];\r\n\r\n                // avoid more then 4 products per category\r\n                if (product.categoryName === categoryName) {\r\n                    productsAmount++;\r\n\r\n                    if (productsAmount === MpcSettings.instance.maxProducts) {\r\n                        result = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        \r\n        private createNewLocalStorage(): void {\r\n            const localStorageModel = {} as ProductComparisonModel;\r\n            localStorageModel.products = new Array<Product>();\r\n            localStorageModel.emptyNavigationTabs = new Array<NavigationTab>();\r\n            localStorageModel.clearStoredEmptyNavigationTabs = false;\r\n            localStorageModel.activeNavigationTab = null;\r\n            localStorageModel.pageLanguage = MpcSettings.instance.culture;\r\n            localStorageModel.hasClientSideChange = false;\r\n            localStorageModel.lastUpdateTime = new Date().getTime(); // we define an empty model to be synced\r\n            localStorageModel.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n            localStorageModel.mobileEnabledCategories = [];\r\n            localStorageModel.mobileLockedColumnIndex = null;\r\n            localStorageModel.mobileCarouselScrollIndex = null;\r\n            localStorageModel.usedNavTabForCarouselOrLockedColumn = null;\r\n            localStorageModel.printPageContent = null;\r\n            this.localStorageCache = localStorageModel;\r\n            this.onUpdatedModel(false);\r\n        }\r\n\r\n        private needsValidation(): boolean {\r\n            if (this.localStorageCache.isLoggedIn || MpcSettings.instance.isLoggedIn) return true;\r\n            const noProducts = this.localStorageCache.products.length === 0;\r\n            if (noProducts) return false;\r\n            const languageWasSwitched = this.localStorageCache.pageLanguage !== MpcSettings.instance.culture;\r\n            if (languageWasSwitched) return true;\r\n            const expiration5MinutesAfterLastUpdate = new Date(this.localStorageCache.lastUpdateTime+(1000*60*5));\r\n            const olderThan5Minutes = new Date().getTime() > expiration5MinutesAfterLastUpdate.getTime();\r\n            return olderThan5Minutes;\r\n        }\r\n\r\n        private static isTimedOut(model: ProductComparisonModel): boolean {\r\n            const expirationDate = new Date(model.lastUpdateTime + (1000 * 60 * 60 * 24 * 30));\r\n            return new Date().getTime() > expirationDate.getTime();\r\n        }\r\n\r\n        private appendProductToList(product: Product, avoidNotification: boolean): void {\r\n            this.localStorageCache.products.push(product);\r\n            this.localStorageCache.hasClientSideChange = true;\r\n            this.onUpdatedModel(false);\r\n\r\n            if(!avoidNotification)\r\n                this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n            // it should only mark when adding the first article\r\n            if (this.localStorageCache.products.length === 1) {\r\n                this.setMobileHeaderMarkerOn();\r\n            }\r\n        }\r\n        \r\n        public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\r\n            let productExists: boolean = false;\r\n\r\n            if (window.localStorage) {\r\n\r\n                if (this.localStorageCache) {\r\n                    for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n                        const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n                        if (tmpProduct.articleId.salesArticleVariantKey == salesArticleVariantKey) {\r\n                            productExists = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return productExists;\r\n        }\r\n\r\n        public storeEmptyNavigationTab(categoryName: string, navigationOrder: number): void {\r\n            if(!this.localStorageCache.emptyNavigationTabs) {\r\n                this.localStorageCache.emptyNavigationTabs = new Array<NavigationTab>();\r\n            }\r\n\r\n            let emptyNavigationTab: NavigationTab = {} as NavigationTab;\r\n            emptyNavigationTab.name = categoryName;\r\n            emptyNavigationTab.navigationOrder = navigationOrder;\r\n\r\n            this.localStorageCache.emptyNavigationTabs.push(emptyNavigationTab);\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public removeStoredEmptyNavigationTabs(): void {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n\r\n            this.localStorageCache.emptyNavigationTabs = new Array<NavigationTab>();\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public setClearStoredEmptyNavigationTabs(clearStoredEmptyNavigationTabs: boolean): void {\r\n            if(!this.localStorageCache)\r\n                this.getModel();\r\n\r\n            this.localStorageCache.clearStoredEmptyNavigationTabs = clearStoredEmptyNavigationTabs;\r\n            this.onUpdatedModel(true); //don't save, who cares\r\n        }\r\n\r\n        public getCarouselScrollIndex(): number {\r\n            if (!this.localStorageCache) {\r\n                this.getModel();\r\n            }\r\n\r\n            const currentCatName: string = this.getCurrentCategoryName();\r\n            if (!this.localStorageCache.usedNavTabForCarouselOrLockedColumn || currentCatName != this.localStorageCache.usedNavTabForCarouselOrLockedColumn) {\r\n                this.clearLockedColumnIndex();\r\n                this.clearCarouselScrollIndex();\r\n            }\r\n\r\n            return this.localStorageCache.mobileCarouselScrollIndex;\r\n        }\r\n\r\n        public clearCarouselScrollIndex(): void {\r\n            this.localStorageCache.mobileCarouselScrollIndex = null;\r\n            this.localStorageCache.usedNavTabForCarouselOrLockedColumn = null;\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public storeCarouselScrollIndex(value: number): void {\r\n            this.localStorageCache.mobileCarouselScrollIndex = value;\r\n            this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public getLockedColumnIndex(): number {\r\n            if (!this.localStorageCache) {\r\n                this.getModel();\r\n            }\r\n\r\n            return this.localStorageCache.mobileLockedColumnIndex;\r\n        }\r\n\r\n        public clearLockedColumnIndex(): void {\r\n            this.localStorageCache.mobileLockedColumnIndex = null;\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public storeLockedColumnIndex(value: number): void {\r\n            this.localStorageCache.mobileLockedColumnIndex = value;\r\n            this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        private getCurrentCategoryName(): string {\r\n            const urlParams: URLSearchParams = new URLSearchParams(location.search);\r\n            return urlParams.get('category');\r\n        }\r\n\r\n        public storePrintPageContent(content: HTMLElement): void {\r\n            this.localStorageCache.printPageContent = content.outerHTML;\r\n            this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n        }\r\n\r\n        public getPrintPageContentCached(): string {\r\n            //there was a race condition with a Sync call, but we dont need to wait for server sync really\r\n            const modelDirectlyFromLocalStorage = this.localStorageAbstraction.readLocalStorage();\r\n            if (!modelDirectlyFromLocalStorage) return null;\r\n            return modelDirectlyFromLocalStorage.printPageContent;\r\n        }\r\n    }\r\n\r\n    export class LocalStorageAbstraction {\r\n        private static _instance: LocalStorageAbstraction;\r\n        public unsupported: boolean = true;\r\n        \r\n        private static mpcLocalStorageKeyOld: string = 'productComparison';\r\n        public static mpcLocalStorageKeyNew: string;\r\n\r\n        static get instance() {\r\n            //TODO after migration period is over (i suggest 01.01.2026)\r\n            // clean this up and just:\r\n            // return this._instance || (this._instance = new this());\r\n            return this._instance || LocalStorageAbstraction.getNewInstanceAndMigrate();\r\n        }\r\n\r\n        private static getNewInstanceAndMigrate(): LocalStorageAbstraction {\r\n            LocalStorageAbstraction.mpcLocalStorageKeyNew = LocalStorageAbstraction.mpcLocalStorageKeyOld+\"_\"+MpcSettings.instance.portal;\r\n            LocalStorageAbstraction.migrate();\r\n            this._instance = new this();\r\n            return this._instance;\r\n        }\r\n\r\n        constructor() {\r\n            if (!window.localStorage) {\r\n                //ErrorHandlerManager.instance.LogError(<ErrorMessage>{ message: \"localStorage not supported\" });\r\n                //TODO user notification\r\n            } else {\r\n                this.unsupported = false;\r\n            }\r\n        }\r\n\r\n        public writeLocalStorage(localStorage: ProductComparisonModel): void {\r\n            if (this.unsupported) return;\r\n            const tmpLocalStorageObject: string = JSON.stringify(localStorage);\r\n            window.localStorage.setItem(LocalStorageAbstraction.mpcLocalStorageKeyNew, tmpLocalStorageObject);\r\n        }\r\n\r\n        public readLocalStorage(): ProductComparisonModel {\r\n            if (this.unsupported) return null;\r\n            const mpcLocalStorageJson = window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyNew);\r\n            if (mpcLocalStorageJson) {\r\n                return JSON.parse(mpcLocalStorageJson);\r\n            }\r\n            return null;\r\n        }\r\n\r\n        private static migrate(){\r\n            if(window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyOld)){\r\n                const oldKeyData = window.localStorage.getItem(LocalStorageAbstraction.mpcLocalStorageKeyOld);\r\n                window.localStorage.setItem(LocalStorageAbstraction.mpcLocalStorageKeyNew, oldKeyData);\r\n                window.localStorage.removeItem(LocalStorageAbstraction.mpcLocalStorageKeyOld);\r\n            }\r\n        }\r\n    }\r\n}","// Axios v1.7.7 Copyright (c) 2024 Matt Zabriskie and contributors\n'use strict';\n\nfunction bind(fn, thisArg) {\n  return function wrap() {\n    return fn.apply(thisArg, arguments);\n  };\n}\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n    const str = toString.call(thing);\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n  type = type.toLowerCase();\n  return (thing) => kindOf(thing) === type\n};\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  let result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n  if (kindOf(val) !== 'object') {\n    return false;\n  }\n\n  const prototype = getPrototypeOf(val);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n  let kind;\n  return thing && (\n    (typeof FormData === 'function' && thing instanceof FormData) || (\n      isFunction(thing.append) && (\n        (kind = kindOf(thing)) === 'formdata' ||\n        // detect form-data instance\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n      )\n    )\n  )\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n  str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  let i;\n  let l;\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n    const len = keys.length;\n    let key;\n\n    for (i = 0; i < len; i++) {\n      key = keys[i];\n      fn.call(null, obj[key], key, obj);\n    }\n  }\n}\n\nfunction findKey(obj, key) {\n  key = key.toLowerCase();\n  const keys = Object.keys(obj);\n  let i = keys.length;\n  let _key;\n  while (i-- > 0) {\n    _key = keys[i];\n    if (key === _key.toLowerCase()) {\n      return _key;\n    }\n  }\n  return null;\n}\n\nconst _global = (() => {\n  /*eslint no-undef:0*/\n  if (typeof globalThis !== \"undefined\") return globalThis;\n  return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  const {caseless} = isContextDefined(this) && this || {};\n  const result = {};\n  const assignValue = (val, key) => {\n    const targetKey = caseless && findKey(result, key) || key;\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n      result[targetKey] = merge(result[targetKey], val);\n    } else if (isPlainObject(val)) {\n      result[targetKey] = merge({}, val);\n    } else if (isArray(val)) {\n      result[targetKey] = val.slice();\n    } else {\n      result[targetKey] = val;\n    }\n  };\n\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    arguments[i] && forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n  forEach(b, (val, key) => {\n    if (thisArg && isFunction(val)) {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  }, {allOwnKeys});\n  return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n  constructor.prototype.constructor = constructor;\n  Object.defineProperty(constructor, 'super', {\n    value: superConstructor.prototype\n  });\n  props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n  let props;\n  let i;\n  let prop;\n  const merged = {};\n\n  destObj = destObj || {};\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  if (sourceObj == null) return destObj;\n\n  do {\n    props = Object.getOwnPropertyNames(sourceObj);\n    i = props.length;\n    while (i-- > 0) {\n      prop = props[i];\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n        destObj[prop] = sourceObj[prop];\n        merged[prop] = true;\n      }\n    }\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n  return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n  str = String(str);\n  if (position === undefined || position > str.length) {\n    position = str.length;\n  }\n  position -= searchString.length;\n  const lastIndex = str.indexOf(searchString, position);\n  return lastIndex !== -1 && lastIndex === position;\n};\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n  if (!thing) return null;\n  if (isArray(thing)) return thing;\n  let i = thing.length;\n  if (!isNumber(i)) return null;\n  const arr = new Array(i);\n  while (i-- > 0) {\n    arr[i] = thing[i];\n  }\n  return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n  // eslint-disable-next-line func-names\n  return thing => {\n    return TypedArray && thing instanceof TypedArray;\n  };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n  const generator = obj && obj[Symbol.iterator];\n\n  const iterator = generator.call(obj);\n\n  let result;\n\n  while ((result = iterator.next()) && !result.done) {\n    const pair = result.value;\n    fn.call(obj, pair[0], pair[1]);\n  }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n  let matches;\n  const arr = [];\n\n  while ((matches = regExp.exec(str)) !== null) {\n    arr.push(matches);\n  }\n\n  return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n  return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n    function replacer(m, p1, p2) {\n      return p1.toUpperCase() + p2;\n    }\n  );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\n  const reducedDescriptors = {};\n\n  forEach(descriptors, (descriptor, name) => {\n    let ret;\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\n      reducedDescriptors[name] = ret || descriptor;\n    }\n  });\n\n  Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n  reduceDescriptors(obj, (descriptor, name) => {\n    // skip restricted props in strict mode\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n      return false;\n    }\n\n    const value = obj[name];\n\n    if (!isFunction(value)) return;\n\n    descriptor.enumerable = false;\n\n    if ('writable' in descriptor) {\n      descriptor.writable = false;\n      return;\n    }\n\n    if (!descriptor.set) {\n      descriptor.set = () => {\n        throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n      };\n    }\n  });\n};\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n  const obj = {};\n\n  const define = (arr) => {\n    arr.forEach(value => {\n      obj[value] = true;\n    });\n  };\n\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n  return obj;\n};\n\nconst noop = () => {};\n\nconst toFiniteNumber = (value, defaultValue) => {\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n};\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n  DIGIT,\n  ALPHA,\n  ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n  let str = '';\n  const {length} = alphabet;\n  while (size--) {\n    str += alphabet[Math.random() * length|0];\n  }\n\n  return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n  return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n  const stack = new Array(10);\n\n  const visit = (source, i) => {\n\n    if (isObject(source)) {\n      if (stack.indexOf(source) >= 0) {\n        return;\n      }\n\n      if(!('toJSON' in source)) {\n        stack[i] = source;\n        const target = isArray(source) ? [] : {};\n\n        forEach(source, (value, key) => {\n          const reducedValue = visit(value, i + 1);\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\n        });\n\n        stack[i] = undefined;\n\n        return target;\n      }\n    }\n\n    return source;\n  };\n\n  return visit(obj, 0);\n};\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n  if (setImmediateSupported) {\n    return setImmediate;\n  }\n\n  return postMessageSupported ? ((token, callbacks) => {\n    _global.addEventListener(\"message\", ({source, data}) => {\n      if (source === _global && data === token) {\n        callbacks.length && callbacks.shift()();\n      }\n    }, false);\n\n    return (cb) => {\n      callbacks.push(cb);\n      _global.postMessage(token, \"*\");\n    }\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n  typeof setImmediate === 'function',\n  isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nvar utils$1 = {\n  isArray,\n  isArrayBuffer,\n  isBuffer,\n  isFormData,\n  isArrayBufferView,\n  isString,\n  isNumber,\n  isBoolean,\n  isObject,\n  isPlainObject,\n  isReadableStream,\n  isRequest,\n  isResponse,\n  isHeaders,\n  isUndefined,\n  isDate,\n  isFile,\n  isBlob,\n  isRegExp,\n  isFunction,\n  isStream,\n  isURLSearchParams,\n  isTypedArray,\n  isFileList,\n  forEach,\n  merge,\n  extend,\n  trim,\n  stripBOM,\n  inherits,\n  toFlatObject,\n  kindOf,\n  kindOfTest,\n  endsWith,\n  toArray,\n  forEachEntry,\n  matchAll,\n  isHTMLForm,\n  hasOwnProperty,\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n  reduceDescriptors,\n  freezeMethods,\n  toObjectSet,\n  toCamelCase,\n  noop,\n  toFiniteNumber,\n  findKey,\n  global: _global,\n  isContextDefined,\n  ALPHABET,\n  generateString,\n  isSpecCompliantForm,\n  toJSONObject,\n  isAsyncFn,\n  isThenable,\n  setImmediate: _setImmediate,\n  asap\n};\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n  Error.call(this);\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    this.stack = (new Error()).stack;\n  }\n\n  this.message = message;\n  this.name = 'AxiosError';\n  code && (this.code = code);\n  config && (this.config = config);\n  request && (this.request = request);\n  if (response) {\n    this.response = response;\n    this.status = response.status ? response.status : null;\n  }\n}\n\nutils$1.inherits(AxiosError, Error, {\n  toJSON: function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: utils$1.toJSONObject(this.config),\n      code: this.code,\n      status: this.status\n    };\n  }\n});\n\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n\n[\n  'ERR_BAD_OPTION_VALUE',\n  'ERR_BAD_OPTION',\n  'ECONNABORTED',\n  'ETIMEDOUT',\n  'ERR_NETWORK',\n  'ERR_FR_TOO_MANY_REDIRECTS',\n  'ERR_DEPRECATED',\n  'ERR_BAD_RESPONSE',\n  'ERR_BAD_REQUEST',\n  'ERR_CANCELED',\n  'ERR_NOT_SUPPORT',\n  'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n  descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n  const axiosError = Object.create(prototype$1);\n\n  utils$1.toFlatObject(error, axiosError, function filter(obj) {\n    return obj !== Error.prototype;\n  }, prop => {\n    return prop !== 'isAxiosError';\n  });\n\n  AxiosError.call(axiosError, error.message, code, config, request, response);\n\n  axiosError.cause = error;\n\n  axiosError.name = error.name;\n\n  customProps && Object.assign(axiosError, customProps);\n\n  return axiosError;\n};\n\n// eslint-disable-next-line strict\nvar httpAdapter = null;\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n  return utils$1.isPlainObject(thing) || utils$1.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n  return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n  if (!path) return key;\n  return path.concat(key).map(function each(token, i) {\n    // eslint-disable-next-line no-param-reassign\n    token = removeBrackets(token);\n    return !dots && i ? '[' + token + ']' : token;\n  }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n  return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {\n  return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!utils$1.isObject(obj)) {\n    throw new TypeError('target must be an object');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = utils$1.toFlatObject(options, {\n    metaTokens: true,\n    dots: false,\n    indexes: false\n  }, false, function defined(option, source) {\n    // eslint-disable-next-line no-eq-null,eqeqeq\n    return !utils$1.isUndefined(source[option]);\n  });\n\n  const metaTokens = options.metaTokens;\n  // eslint-disable-next-line no-use-before-define\n  const visitor = options.visitor || defaultVisitor;\n  const dots = options.dots;\n  const indexes = options.indexes;\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n  const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);\n\n  if (!utils$1.isFunction(visitor)) {\n    throw new TypeError('visitor must be a function');\n  }\n\n  function convertValue(value) {\n    if (value === null) return '';\n\n    if (utils$1.isDate(value)) {\n      return value.toISOString();\n    }\n\n    if (!useBlob && utils$1.isBlob(value)) {\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n    }\n\n    if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Default visitor.\n   *\n   * @param {*} value\n   * @param {String|Number} key\n   * @param {Array<String|Number>} path\n   * @this {FormData}\n   *\n   * @returns {boolean} return true to visit the each prop of the value recursively\n   */\n  function defaultVisitor(value, key, path) {\n    let arr = value;\n\n    if (value && !path && typeof value === 'object') {\n      if (utils$1.endsWith(key, '{}')) {\n        // eslint-disable-next-line no-param-reassign\n        key = metaTokens ? key : key.slice(0, -2);\n        // eslint-disable-next-line no-param-reassign\n        value = JSON.stringify(value);\n      } else if (\n        (utils$1.isArray(value) && isFlatArray(value)) ||\n        ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))\n        )) {\n        // eslint-disable-next-line no-param-reassign\n        key = removeBrackets(key);\n\n        arr.forEach(function each(el, index) {\n          !(utils$1.isUndefined(el) || el === null) && formData.append(\n            // eslint-disable-next-line no-nested-ternary\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n            convertValue(el)\n          );\n        });\n        return false;\n      }\n    }\n\n    if (isVisitable(value)) {\n      return true;\n    }\n\n    formData.append(renderKey(path, key, dots), convertValue(value));\n\n    return false;\n  }\n\n  const stack = [];\n\n  const exposedHelpers = Object.assign(predicates, {\n    defaultVisitor,\n    convertValue,\n    isVisitable\n  });\n\n  function build(value, path) {\n    if (utils$1.isUndefined(value)) return;\n\n    if (stack.indexOf(value) !== -1) {\n      throw Error('Circular reference detected in ' + path.join('.'));\n    }\n\n    stack.push(value);\n\n    utils$1.forEach(value, function each(el, key) {\n      const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n        formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers\n      );\n\n      if (result === true) {\n        build(el, path ? path.concat(key) : [key]);\n      }\n    });\n\n    stack.pop();\n  }\n\n  if (!utils$1.isObject(obj)) {\n    throw new TypeError('data must be an object');\n  }\n\n  build(obj);\n\n  return formData;\n}\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode$1(str) {\n  const charMap = {\n    '!': '%21',\n    \"'\": '%27',\n    '(': '%28',\n    ')': '%29',\n    '~': '%7E',\n    '%20': '+',\n    '%00': '\\x00'\n  };\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n    return charMap[match];\n  });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n  this._pairs = [];\n\n  params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n  this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n  const _encode = encoder ? function(value) {\n    return encoder.call(this, value, encode$1);\n  } : encode$1;\n\n  return this._pairs.map(function each(pair) {\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\n  }, '').join('&');\n};\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n  \n  const _encode = options && options.encode || encode;\n\n  const serializeFn = options && options.serialize;\n\n  let serializedParams;\n\n  if (serializeFn) {\n    serializedParams = serializeFn(params, options);\n  } else {\n    serializedParams = utils$1.isURLSearchParams(params) ?\n      params.toString() :\n      new AxiosURLSearchParams(params, options).toString(_encode);\n  }\n\n  if (serializedParams) {\n    const hashmarkIndex = url.indexOf(\"#\");\n\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n}\n\nclass InterceptorManager {\n  constructor() {\n    this.handlers = [];\n  }\n\n  /**\n   * Add a new interceptor to the stack\n   *\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\n   *\n   * @return {Number} An ID used to remove interceptor later\n   */\n  use(fulfilled, rejected, options) {\n    this.handlers.push({\n      fulfilled,\n      rejected,\n      synchronous: options ? options.synchronous : false,\n      runWhen: options ? options.runWhen : null\n    });\n    return this.handlers.length - 1;\n  }\n\n  /**\n   * Remove an interceptor from the stack\n   *\n   * @param {Number} id The ID that was returned by `use`\n   *\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n   */\n  eject(id) {\n    if (this.handlers[id]) {\n      this.handlers[id] = null;\n    }\n  }\n\n  /**\n   * Clear all interceptors from the stack\n   *\n   * @returns {void}\n   */\n  clear() {\n    if (this.handlers) {\n      this.handlers = [];\n    }\n  }\n\n  /**\n   * Iterate over all the registered interceptors\n   *\n   * This method is particularly useful for skipping over any\n   * interceptors that may have become `null` calling `eject`.\n   *\n   * @param {Function} fn The function to call for each interceptor\n   *\n   * @returns {void}\n   */\n  forEach(fn) {\n    utils$1.forEach(this.handlers, function forEachHandler(h) {\n      if (h !== null) {\n        fn(h);\n      }\n    });\n  }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n  silentJSONParsing: true,\n  forcedJSONParsing: true,\n  clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\nvar platform$1 = {\n  isBrowser: true,\n  classes: {\n    URLSearchParams: URLSearchParams$1,\n    FormData: FormData$1,\n    Blob: Blob$1\n  },\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\nconst hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n  (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n  return (\n    typeof WorkerGlobalScope !== 'undefined' &&\n    // eslint-disable-next-line no-undef\n    self instanceof WorkerGlobalScope &&\n    typeof self.importScripts === 'function'\n  );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nvar utils = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  hasBrowserEnv: hasBrowserEnv,\n  hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n  hasStandardBrowserEnv: hasStandardBrowserEnv,\n  navigator: _navigator,\n  origin: origin\n});\n\nvar platform = {\n  ...utils,\n  ...platform$1\n};\n\nfunction toURLEncodedForm(data, options) {\n  return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n    visitor: function(value, key, path, helpers) {\n      if (platform.isNode && utils$1.isBuffer(value)) {\n        this.append(key, value.toString('base64'));\n        return false;\n      }\n\n      return helpers.defaultVisitor.apply(this, arguments);\n    }\n  }, options));\n}\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n  // foo[x][y][z]\n  // foo.x.y.z\n  // foo-x-y-z\n  // foo x y z\n  return utils$1.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n    return match[0] === '[]' ? '' : match[1] || match[0];\n  });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n  const obj = {};\n  const keys = Object.keys(arr);\n  let i;\n  const len = keys.length;\n  let key;\n  for (i = 0; i < len; i++) {\n    key = keys[i];\n    obj[key] = arr[key];\n  }\n  return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n  function buildPath(path, value, target, index) {\n    let name = path[index++];\n\n    if (name === '__proto__') return true;\n\n    const isNumericKey = Number.isFinite(+name);\n    const isLast = index >= path.length;\n    name = !name && utils$1.isArray(target) ? target.length : name;\n\n    if (isLast) {\n      if (utils$1.hasOwnProp(target, name)) {\n        target[name] = [target[name], value];\n      } else {\n        target[name] = value;\n      }\n\n      return !isNumericKey;\n    }\n\n    if (!target[name] || !utils$1.isObject(target[name])) {\n      target[name] = [];\n    }\n\n    const result = buildPath(path, value, target[name], index);\n\n    if (result && utils$1.isArray(target[name])) {\n      target[name] = arrayToObject(target[name]);\n    }\n\n    return !isNumericKey;\n  }\n\n  if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n    const obj = {};\n\n    utils$1.forEachEntry(formData, (name, value) => {\n      buildPath(parsePropPath(name), value, obj, 0);\n    });\n\n    return obj;\n  }\n\n  return null;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils$1.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils$1.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n  transitional: transitionalDefaults,\n\n  adapter: ['xhr', 'http', 'fetch'],\n\n  transformRequest: [function transformRequest(data, headers) {\n    const contentType = headers.getContentType() || '';\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\n    const isObjectPayload = utils$1.isObject(data);\n\n    if (isObjectPayload && utils$1.isHTMLForm(data)) {\n      data = new FormData(data);\n    }\n\n    const isFormData = utils$1.isFormData(data);\n\n    if (isFormData) {\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n    }\n\n    if (utils$1.isArrayBuffer(data) ||\n      utils$1.isBuffer(data) ||\n      utils$1.isStream(data) ||\n      utils$1.isFile(data) ||\n      utils$1.isBlob(data) ||\n      utils$1.isReadableStream(data)\n    ) {\n      return data;\n    }\n    if (utils$1.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils$1.isURLSearchParams(data)) {\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n      return data.toString();\n    }\n\n    let isFileList;\n\n    if (isObjectPayload) {\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n        return toURLEncodedForm(data, this.formSerializer).toString();\n      }\n\n      if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n        const _FormData = this.env && this.env.FormData;\n\n        return toFormData(\n          isFileList ? {'files[]': data} : data,\n          _FormData && new _FormData(),\n          this.formSerializer\n        );\n      }\n    }\n\n    if (isObjectPayload || hasJSONContentType ) {\n      headers.setContentType('application/json', false);\n      return stringifySafely(data);\n    }\n\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    const transitional = this.transitional || defaults.transitional;\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    const JSONRequested = this.responseType === 'json';\n\n    if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {\n      return data;\n    }\n\n    if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  env: {\n    FormData: platform.classes.FormData,\n    Blob: platform.classes.Blob\n  },\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      'Accept': 'application/json, text/plain, */*',\n      'Content-Type': undefined\n    }\n  }\n};\n\nutils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n  defaults.headers[method] = {};\n});\n\nvar defaults$1 = defaults;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.toObjectSet([\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nvar parseHeaders = rawHeaders => {\n  const parsed = {};\n  let key;\n  let val;\n  let i;\n\n  rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n    i = line.indexOf(':');\n    key = line.substring(0, i).trim().toLowerCase();\n    val = line.substring(i + 1).trim();\n\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n      return;\n    }\n\n    if (key === 'set-cookie') {\n      if (parsed[key]) {\n        parsed[key].push(val);\n      } else {\n        parsed[key] = [val];\n      }\n    } else {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  });\n\n  return parsed;\n};\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n  return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n  if (value === false || value == null) {\n    return value;\n  }\n\n  return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n  const tokens = Object.create(null);\n  const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n  let match;\n\n  while ((match = tokensRE.exec(str))) {\n    tokens[match[1]] = match[2];\n  }\n\n  return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n  if (utils$1.isFunction(filter)) {\n    return filter.call(this, value, header);\n  }\n\n  if (isHeaderNameFilter) {\n    value = header;\n  }\n\n  if (!utils$1.isString(value)) return;\n\n  if (utils$1.isString(filter)) {\n    return value.indexOf(filter) !== -1;\n  }\n\n  if (utils$1.isRegExp(filter)) {\n    return filter.test(value);\n  }\n}\n\nfunction formatHeader(header) {\n  return header.trim()\n    .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n      return char.toUpperCase() + str;\n    });\n}\n\nfunction buildAccessors(obj, header) {\n  const accessorName = utils$1.toCamelCase(' ' + header);\n\n  ['get', 'set', 'has'].forEach(methodName => {\n    Object.defineProperty(obj, methodName + accessorName, {\n      value: function(arg1, arg2, arg3) {\n        return this[methodName].call(this, header, arg1, arg2, arg3);\n      },\n      configurable: true\n    });\n  });\n}\n\nclass AxiosHeaders {\n  constructor(headers) {\n    headers && this.set(headers);\n  }\n\n  set(header, valueOrRewrite, rewrite) {\n    const self = this;\n\n    function setHeader(_value, _header, _rewrite) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!lHeader) {\n        throw new Error('header name must be a non-empty string');\n      }\n\n      const key = utils$1.findKey(self, lHeader);\n\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n        self[key || _header] = normalizeValue(_value);\n      }\n    }\n\n    const setHeaders = (headers, _rewrite) =>\n      utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n    if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n      setHeaders(header, valueOrRewrite);\n    } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n      setHeaders(parseHeaders(header), valueOrRewrite);\n    } else if (utils$1.isHeaders(header)) {\n      for (const [key, value] of header.entries()) {\n        setHeader(value, key, rewrite);\n      }\n    } else {\n      header != null && setHeader(valueOrRewrite, header, rewrite);\n    }\n\n    return this;\n  }\n\n  get(header, parser) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils$1.findKey(this, header);\n\n      if (key) {\n        const value = this[key];\n\n        if (!parser) {\n          return value;\n        }\n\n        if (parser === true) {\n          return parseTokens(value);\n        }\n\n        if (utils$1.isFunction(parser)) {\n          return parser.call(this, value, key);\n        }\n\n        if (utils$1.isRegExp(parser)) {\n          return parser.exec(value);\n        }\n\n        throw new TypeError('parser must be boolean|regexp|function');\n      }\n    }\n  }\n\n  has(header, matcher) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils$1.findKey(this, header);\n\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n    }\n\n    return false;\n  }\n\n  delete(header, matcher) {\n    const self = this;\n    let deleted = false;\n\n    function deleteHeader(_header) {\n      _header = normalizeHeader(_header);\n\n      if (_header) {\n        const key = utils$1.findKey(self, _header);\n\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n          delete self[key];\n\n          deleted = true;\n        }\n      }\n    }\n\n    if (utils$1.isArray(header)) {\n      header.forEach(deleteHeader);\n    } else {\n      deleteHeader(header);\n    }\n\n    return deleted;\n  }\n\n  clear(matcher) {\n    const keys = Object.keys(this);\n    let i = keys.length;\n    let deleted = false;\n\n    while (i--) {\n      const key = keys[i];\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n        delete this[key];\n        deleted = true;\n      }\n    }\n\n    return deleted;\n  }\n\n  normalize(format) {\n    const self = this;\n    const headers = {};\n\n    utils$1.forEach(this, (value, header) => {\n      const key = utils$1.findKey(headers, header);\n\n      if (key) {\n        self[key] = normalizeValue(value);\n        delete self[header];\n        return;\n      }\n\n      const normalized = format ? formatHeader(header) : String(header).trim();\n\n      if (normalized !== header) {\n        delete self[header];\n      }\n\n      self[normalized] = normalizeValue(value);\n\n      headers[normalized] = true;\n    });\n\n    return this;\n  }\n\n  concat(...targets) {\n    return this.constructor.concat(this, ...targets);\n  }\n\n  toJSON(asStrings) {\n    const obj = Object.create(null);\n\n    utils$1.forEach(this, (value, header) => {\n      value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value);\n    });\n\n    return obj;\n  }\n\n  [Symbol.iterator]() {\n    return Object.entries(this.toJSON())[Symbol.iterator]();\n  }\n\n  toString() {\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'AxiosHeaders';\n  }\n\n  static from(thing) {\n    return thing instanceof this ? thing : new this(thing);\n  }\n\n  static concat(first, ...targets) {\n    const computed = new this(first);\n\n    targets.forEach((target) => computed.set(target));\n\n    return computed;\n  }\n\n  static accessor(header) {\n    const internals = this[$internals] = (this[$internals] = {\n      accessors: {}\n    });\n\n    const accessors = internals.accessors;\n    const prototype = this.prototype;\n\n    function defineAccessor(_header) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!accessors[lHeader]) {\n        buildAccessors(prototype, _header);\n        accessors[lHeader] = true;\n      }\n    }\n\n    utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n    return this;\n  }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n  return {\n    get: () => value,\n    set(headerValue) {\n      this[mapped] = headerValue;\n    }\n  }\n});\n\nutils$1.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n  const config = this || defaults$1;\n  const context = response || config;\n  const headers = AxiosHeaders$1.from(context.headers);\n  let data = context.data;\n\n  utils$1.forEach(fns, function transform(fn) {\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n  });\n\n  headers.normalize();\n\n  return data;\n}\n\nfunction isCancel(value) {\n  return !!(value && value.__CANCEL__);\n}\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n  this.name = 'CanceledError';\n}\n\nutils$1.inherits(CanceledError, AxiosError, {\n  __CANCEL__: true\n});\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(new AxiosError(\n      'Request failed with status code ' + response.status,\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n      response.config,\n      response.request,\n      response\n    ));\n  }\n}\n\nfunction parseProtocol(url) {\n  const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n  return match && match[1] || '';\n}\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n  samplesCount = samplesCount || 10;\n  const bytes = new Array(samplesCount);\n  const timestamps = new Array(samplesCount);\n  let head = 0;\n  let tail = 0;\n  let firstSampleTS;\n\n  min = min !== undefined ? min : 1000;\n\n  return function push(chunkLength) {\n    const now = Date.now();\n\n    const startedAt = timestamps[tail];\n\n    if (!firstSampleTS) {\n      firstSampleTS = now;\n    }\n\n    bytes[head] = chunkLength;\n    timestamps[head] = now;\n\n    let i = tail;\n    let bytesCount = 0;\n\n    while (i !== head) {\n      bytesCount += bytes[i++];\n      i = i % samplesCount;\n    }\n\n    head = (head + 1) % samplesCount;\n\n    if (head === tail) {\n      tail = (tail + 1) % samplesCount;\n    }\n\n    if (now - firstSampleTS < min) {\n      return;\n    }\n\n    const passed = startedAt && now - startedAt;\n\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n  };\n}\n\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n  let timestamp = 0;\n  let threshold = 1000 / freq;\n  let lastArgs;\n  let timer;\n\n  const invoke = (args, now = Date.now()) => {\n    timestamp = now;\n    lastArgs = null;\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n    fn.apply(null, args);\n  };\n\n  const throttled = (...args) => {\n    const now = Date.now();\n    const passed = now - timestamp;\n    if ( passed >= threshold) {\n      invoke(args, now);\n    } else {\n      lastArgs = args;\n      if (!timer) {\n        timer = setTimeout(() => {\n          timer = null;\n          invoke(lastArgs);\n        }, threshold - passed);\n      }\n    }\n  };\n\n  const flush = () => lastArgs && invoke(lastArgs);\n\n  return [throttled, flush];\n}\n\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n  let bytesNotified = 0;\n  const _speedometer = speedometer(50, 250);\n\n  return throttle(e => {\n    const loaded = e.loaded;\n    const total = e.lengthComputable ? e.total : undefined;\n    const progressBytes = loaded - bytesNotified;\n    const rate = _speedometer(progressBytes);\n    const inRange = loaded <= total;\n\n    bytesNotified = loaded;\n\n    const data = {\n      loaded,\n      total,\n      progress: total ? (loaded / total) : undefined,\n      bytes: progressBytes,\n      rate: rate ? rate : undefined,\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n      event: e,\n      lengthComputable: total != null,\n      [isDownloadStream ? 'download' : 'upload']: true\n    };\n\n    listener(data);\n  }, freq);\n};\n\nconst progressEventDecorator = (total, throttled) => {\n  const lengthComputable = total != null;\n\n  return [(loaded) => throttled[0]({\n    lengthComputable,\n    total,\n    loaded\n  }), throttled[1]];\n};\n\nconst asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));\n\nvar isURLSameOrigin = platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n  (function standardBrowserEnv() {\n    const msie = platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent);\n    const urlParsingNode = document.createElement('a');\n    let originURL;\n\n    /**\n    * Parse a URL to discover its components\n    *\n    * @param {String} url The URL to be parsed\n    * @returns {Object}\n    */\n    function resolveURL(url) {\n      let href = url;\n\n      if (msie) {\n        // IE needs attribute set twice to normalize properties\n        urlParsingNode.setAttribute('href', href);\n        href = urlParsingNode.href;\n      }\n\n      urlParsingNode.setAttribute('href', href);\n\n      // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n      return {\n        href: urlParsingNode.href,\n        protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n        host: urlParsingNode.host,\n        search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n        hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n        hostname: urlParsingNode.hostname,\n        port: urlParsingNode.port,\n        pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n          urlParsingNode.pathname :\n          '/' + urlParsingNode.pathname\n      };\n    }\n\n    originURL = resolveURL(window.location.href);\n\n    /**\n    * Determine if a URL shares the same origin as the current location\n    *\n    * @param {String} requestURL The URL to test\n    * @returns {boolean} True if URL shares the same origin, otherwise false\n    */\n    return function isURLSameOrigin(requestURL) {\n      const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n      return (parsed.protocol === originURL.protocol &&\n          parsed.host === originURL.host);\n    };\n  })() :\n\n  // Non standard browser envs (web workers, react-native) lack needed support.\n  (function nonStandardBrowserEnv() {\n    return function isURLSameOrigin() {\n      return true;\n    };\n  })();\n\nvar cookies = platform.hasStandardBrowserEnv ?\n\n  // Standard browser envs support document.cookie\n  {\n    write(name, value, expires, path, domain, secure) {\n      const cookie = [name + '=' + encodeURIComponent(value)];\n\n      utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n      utils$1.isString(path) && cookie.push('path=' + path);\n\n      utils$1.isString(domain) && cookie.push('domain=' + domain);\n\n      secure === true && cookie.push('secure');\n\n      document.cookie = cookie.join('; ');\n    },\n\n    read(name) {\n      const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n      return (match ? decodeURIComponent(match[3]) : null);\n    },\n\n    remove(name) {\n      this.write(name, '', Date.now() - 86400000);\n    }\n  }\n\n  :\n\n  // Non-standard browser env (web workers, react-native) lack needed support.\n  {\n    write() {},\n    read() {\n      return null;\n    },\n    remove() {}\n  };\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n}\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n  if (baseURL && !isAbsoluteURL(requestedURL)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n}\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  const config = {};\n\n  function getMergedValue(target, source, caseless) {\n    if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n      return utils$1.merge.call({caseless}, target, source);\n    } else if (utils$1.isPlainObject(source)) {\n      return utils$1.merge({}, source);\n    } else if (utils$1.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(a, b, caseless) {\n    if (!utils$1.isUndefined(b)) {\n      return getMergedValue(a, b, caseless);\n    } else if (!utils$1.isUndefined(a)) {\n      return getMergedValue(undefined, a, caseless);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(a, b) {\n    if (!utils$1.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(a, b) {\n    if (!utils$1.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    } else if (!utils$1.isUndefined(a)) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(a, b, prop) {\n    if (prop in config2) {\n      return getMergedValue(a, b);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  const mergeMap = {\n    url: valueFromConfig2,\n    method: valueFromConfig2,\n    data: valueFromConfig2,\n    baseURL: defaultToConfig2,\n    transformRequest: defaultToConfig2,\n    transformResponse: defaultToConfig2,\n    paramsSerializer: defaultToConfig2,\n    timeout: defaultToConfig2,\n    timeoutMessage: defaultToConfig2,\n    withCredentials: defaultToConfig2,\n    withXSRFToken: defaultToConfig2,\n    adapter: defaultToConfig2,\n    responseType: defaultToConfig2,\n    xsrfCookieName: defaultToConfig2,\n    xsrfHeaderName: defaultToConfig2,\n    onUploadProgress: defaultToConfig2,\n    onDownloadProgress: defaultToConfig2,\n    decompress: defaultToConfig2,\n    maxContentLength: defaultToConfig2,\n    maxBodyLength: defaultToConfig2,\n    beforeRedirect: defaultToConfig2,\n    transport: defaultToConfig2,\n    httpAgent: defaultToConfig2,\n    httpsAgent: defaultToConfig2,\n    cancelToken: defaultToConfig2,\n    socketPath: defaultToConfig2,\n    responseEncoding: defaultToConfig2,\n    validateStatus: mergeDirectKeys,\n    headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n  };\n\n  utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n    const merge = mergeMap[prop] || mergeDeepProperties;\n    const configValue = merge(config1[prop], config2[prop], prop);\n    (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n}\n\nvar resolveConfig = (config) => {\n  const newConfig = mergeConfig({}, config);\n\n  let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n  newConfig.headers = headers = AxiosHeaders$1.from(headers);\n\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n  // HTTP basic authentication\n  if (auth) {\n    headers.set('Authorization', 'Basic ' +\n      btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n    );\n  }\n\n  let contentType;\n\n  if (utils$1.isFormData(data)) {\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n      headers.setContentType(undefined); // Let the browser set it\n    } else if ((contentType = headers.getContentType()) !== false) {\n      // fix semicolon duplication issue for ReactNative FormData implementation\n      const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n      headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n    }\n  }\n\n  // Add xsrf header\n  // This is only done if running in a standard browser environment.\n  // Specifically not if we're in a web worker, or react-native.\n\n  if (platform.hasStandardBrowserEnv) {\n    withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n      // Add xsrf header\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n      if (xsrfValue) {\n        headers.set(xsrfHeaderName, xsrfValue);\n      }\n    }\n  }\n\n  return newConfig;\n};\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    const _config = resolveConfig(config);\n    let requestData = _config.data;\n    const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\n    let onCanceled;\n    let uploadThrottled, downloadThrottled;\n    let flushUpload, flushDownload;\n\n    function done() {\n      flushUpload && flushUpload(); // flush events\n      flushDownload && flushDownload(); // flush events\n\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n      _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n    }\n\n    let request = new XMLHttpRequest();\n\n    request.open(_config.method.toUpperCase(), _config.url, true);\n\n    // Set the request timeout in MS\n    request.timeout = _config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      const responseHeaders = AxiosHeaders$1.from(\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n      );\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n        request.responseText : request.response;\n      const response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config,\n        request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n      const transitional = _config.transitional || transitionalDefaults;\n      if (_config.timeoutErrorMessage) {\n        timeoutErrorMessage = _config.timeoutErrorMessage;\n      }\n      reject(new AxiosError(\n        timeoutErrorMessage,\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n        config,\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Remove Content-Type if data is undefined\n    requestData === undefined && requestHeaders.setContentType(null);\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n        request.setRequestHeader(key, val);\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils$1.isUndefined(_config.withCredentials)) {\n      request.withCredentials = !!_config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = _config.responseType;\n    }\n\n    // Handle progress if needed\n    if (onDownloadProgress) {\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n      request.addEventListener('progress', downloadThrottled);\n    }\n\n    // Not all browsers support upload events\n    if (onUploadProgress && request.upload) {\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n      request.upload.addEventListener('progress', uploadThrottled);\n\n      request.upload.addEventListener('loadend', flushUpload);\n    }\n\n    if (_config.cancelToken || _config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = cancel => {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n        request.abort();\n        request = null;\n      };\n\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n      if (_config.signal) {\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n      }\n    }\n\n    const protocol = parseProtocol(_config.url);\n\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n      return;\n    }\n\n\n    // Send the request\n    request.send(requestData || null);\n  });\n};\n\nconst composeSignals = (signals, timeout) => {\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n  if (timeout || length) {\n    let controller = new AbortController();\n\n    let aborted;\n\n    const onabort = function (reason) {\n      if (!aborted) {\n        aborted = true;\n        unsubscribe();\n        const err = reason instanceof Error ? reason : this.reason;\n        controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n      }\n    };\n\n    let timer = timeout && setTimeout(() => {\n      timer = null;\n      onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));\n    }, timeout);\n\n    const unsubscribe = () => {\n      if (signals) {\n        timer && clearTimeout(timer);\n        timer = null;\n        signals.forEach(signal => {\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n        });\n        signals = null;\n      }\n    };\n\n    signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n    const {signal} = controller;\n\n    signal.unsubscribe = () => utils$1.asap(unsubscribe);\n\n    return signal;\n  }\n};\n\nvar composeSignals$1 = composeSignals;\n\nconst streamChunk = function* (chunk, chunkSize) {\n  let len = chunk.byteLength;\n\n  if (!chunkSize || len < chunkSize) {\n    yield chunk;\n    return;\n  }\n\n  let pos = 0;\n  let end;\n\n  while (pos < len) {\n    end = pos + chunkSize;\n    yield chunk.slice(pos, end);\n    pos = end;\n  }\n};\n\nconst readBytes = async function* (iterable, chunkSize) {\n  for await (const chunk of readStream(iterable)) {\n    yield* streamChunk(chunk, chunkSize);\n  }\n};\n\nconst readStream = async function* (stream) {\n  if (stream[Symbol.asyncIterator]) {\n    yield* stream;\n    return;\n  }\n\n  const reader = stream.getReader();\n  try {\n    for (;;) {\n      const {done, value} = await reader.read();\n      if (done) {\n        break;\n      }\n      yield value;\n    }\n  } finally {\n    await reader.cancel();\n  }\n};\n\nconst trackStream = (stream, chunkSize, onProgress, onFinish) => {\n  const iterator = readBytes(stream, chunkSize);\n\n  let bytes = 0;\n  let done;\n  let _onFinish = (e) => {\n    if (!done) {\n      done = true;\n      onFinish && onFinish(e);\n    }\n  };\n\n  return new ReadableStream({\n    async pull(controller) {\n      try {\n        const {done, value} = await iterator.next();\n\n        if (done) {\n         _onFinish();\n          controller.close();\n          return;\n        }\n\n        let len = value.byteLength;\n        if (onProgress) {\n          let loadedBytes = bytes += len;\n          onProgress(loadedBytes);\n        }\n        controller.enqueue(new Uint8Array(value));\n      } catch (err) {\n        _onFinish(err);\n        throw err;\n      }\n    },\n    cancel(reason) {\n      _onFinish(reason);\n      return iterator.return();\n    }\n  }, {\n    highWaterMark: 2\n  })\n};\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n    ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n    async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n  try {\n    return !!fn(...args);\n  } catch (e) {\n    return false\n  }\n};\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n  let duplexAccessed = false;\n\n  const hasContentType = new Request(platform.origin, {\n    body: new ReadableStream(),\n    method: 'POST',\n    get duplex() {\n      duplexAccessed = true;\n      return 'half';\n    },\n  }).headers.has('Content-Type');\n\n  return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n  test(() => utils$1.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n  stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n  ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n    !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res) => res[type]() :\n      (_, config) => {\n        throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n      });\n  });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n  if (body == null) {\n    return 0;\n  }\n\n  if(utils$1.isBlob(body)) {\n    return body.size;\n  }\n\n  if(utils$1.isSpecCompliantForm(body)) {\n    const _request = new Request(platform.origin, {\n      method: 'POST',\n      body,\n    });\n    return (await _request.arrayBuffer()).byteLength;\n  }\n\n  if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n    return body.byteLength;\n  }\n\n  if(utils$1.isURLSearchParams(body)) {\n    body = body + '';\n  }\n\n  if(utils$1.isString(body)) {\n    return (await encodeText(body)).byteLength;\n  }\n};\n\nconst resolveBodyLength = async (headers, body) => {\n  const length = utils$1.toFiniteNumber(headers.getContentLength());\n\n  return length == null ? getBodyLength(body) : length;\n};\n\nvar fetchAdapter = isFetchSupported && (async (config) => {\n  let {\n    url,\n    method,\n    data,\n    signal,\n    cancelToken,\n    timeout,\n    onDownloadProgress,\n    onUploadProgress,\n    responseType,\n    headers,\n    withCredentials = 'same-origin',\n    fetchOptions\n  } = resolveConfig(config);\n\n  responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n  let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n  let request;\n\n  const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n      composedSignal.unsubscribe();\n  });\n\n  let requestContentLength;\n\n  try {\n    if (\n      onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n      (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n    ) {\n      let _request = new Request(url, {\n        method: 'POST',\n        body: data,\n        duplex: \"half\"\n      });\n\n      let contentTypeHeader;\n\n      if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n        headers.setContentType(contentTypeHeader);\n      }\n\n      if (_request.body) {\n        const [onProgress, flush] = progressEventDecorator(\n          requestContentLength,\n          progressEventReducer(asyncDecorator(onUploadProgress))\n        );\n\n        data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n      }\n    }\n\n    if (!utils$1.isString(withCredentials)) {\n      withCredentials = withCredentials ? 'include' : 'omit';\n    }\n\n    // Cloudflare Workers throws when credentials are defined\n    // see https://github.com/cloudflare/workerd/issues/902\n    const isCredentialsSupported = \"credentials\" in Request.prototype;\n    request = new Request(url, {\n      ...fetchOptions,\n      signal: composedSignal,\n      method: method.toUpperCase(),\n      headers: headers.normalize().toJSON(),\n      body: data,\n      duplex: \"half\",\n      credentials: isCredentialsSupported ? withCredentials : undefined\n    });\n\n    let response = await fetch(request);\n\n    const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n    if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n      const options = {};\n\n      ['status', 'statusText', 'headers'].forEach(prop => {\n        options[prop] = response[prop];\n      });\n\n      const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));\n\n      const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n        responseContentLength,\n        progressEventReducer(asyncDecorator(onDownloadProgress), true)\n      ) || [];\n\n      response = new Response(\n        trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n          flush && flush();\n          unsubscribe && unsubscribe();\n        }),\n        options\n      );\n    }\n\n    responseType = responseType || 'text';\n\n    let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);\n\n    !isStreamResponse && unsubscribe && unsubscribe();\n\n    return await new Promise((resolve, reject) => {\n      settle(resolve, reject, {\n        data: responseData,\n        headers: AxiosHeaders$1.from(response.headers),\n        status: response.status,\n        statusText: response.statusText,\n        config,\n        request\n      });\n    })\n  } catch (err) {\n    unsubscribe && unsubscribe();\n\n    if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n      throw Object.assign(\n        new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n        {\n          cause: err.cause || err\n        }\n      )\n    }\n\n    throw AxiosError.from(err, err && err.code, config, request);\n  }\n});\n\nconst knownAdapters = {\n  http: httpAdapter,\n  xhr: xhrAdapter,\n  fetch: fetchAdapter\n};\n\nutils$1.forEach(knownAdapters, (fn, value) => {\n  if (fn) {\n    try {\n      Object.defineProperty(fn, 'name', {value});\n    } catch (e) {\n      // eslint-disable-next-line no-empty\n    }\n    Object.defineProperty(fn, 'adapterName', {value});\n  }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;\n\nvar adapters = {\n  getAdapter: (adapters) => {\n    adapters = utils$1.isArray(adapters) ? adapters : [adapters];\n\n    const {length} = adapters;\n    let nameOrAdapter;\n    let adapter;\n\n    const rejectedReasons = {};\n\n    for (let i = 0; i < length; i++) {\n      nameOrAdapter = adapters[i];\n      let id;\n\n      adapter = nameOrAdapter;\n\n      if (!isResolvedHandle(nameOrAdapter)) {\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n        if (adapter === undefined) {\n          throw new AxiosError(`Unknown adapter '${id}'`);\n        }\n      }\n\n      if (adapter) {\n        break;\n      }\n\n      rejectedReasons[id || '#' + i] = adapter;\n    }\n\n    if (!adapter) {\n\n      const reasons = Object.entries(rejectedReasons)\n        .map(([id, state]) => `adapter ${id} ` +\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\n        );\n\n      let s = length ?\n        (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n        'as no adapter specified';\n\n      throw new AxiosError(\n        `There is no suitable adapter to dispatch the request ` + s,\n        'ERR_NOT_SUPPORT'\n      );\n    }\n\n    return adapter;\n  },\n  adapters: knownAdapters\n};\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new CanceledError(null, config);\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  config.headers = AxiosHeaders$1.from(config.headers);\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.transformRequest\n  );\n\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\n  }\n\n  const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      config.transformResponse,\n      response\n    );\n\n    response.headers = AxiosHeaders$1.from(response.headers);\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          config.transformResponse,\n          reason.response\n        );\n        reason.response.headers = AxiosHeaders$1.from(reason.response.headers);\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n}\n\nconst VERSION = \"1.7.7\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n  validators$1[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators$1.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return (value, opt, opts) => {\n    if (validator === false) {\n      throw new AxiosError(\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n        AxiosError.ERR_DEPRECATED\n      );\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n  }\n  const keys = Object.keys(options);\n  let i = keys.length;\n  while (i-- > 0) {\n    const opt = keys[i];\n    const validator = schema[opt];\n    if (validator) {\n      const value = options[opt];\n      const result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n    }\n  }\n}\n\nvar validator = {\n  assertOptions,\n  validators: validators$1\n};\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n  constructor(instanceConfig) {\n    this.defaults = instanceConfig;\n    this.interceptors = {\n      request: new InterceptorManager$1(),\n      response: new InterceptorManager$1()\n    };\n  }\n\n  /**\n   * Dispatch a request\n   *\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n   * @param {?Object} config\n   *\n   * @returns {Promise} The Promise to be fulfilled\n   */\n  async request(configOrUrl, config) {\n    try {\n      return await this._request(configOrUrl, config);\n    } catch (err) {\n      if (err instanceof Error) {\n        let dummy;\n\n        Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n        // slice off the Error: ... line\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n        try {\n          if (!err.stack) {\n            err.stack = stack;\n            // match without the 2 top stack lines\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n            err.stack += '\\n' + stack;\n          }\n        } catch (e) {\n          // ignore the case where \"stack\" is an un-writable property\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  _request(configOrUrl, config) {\n    /*eslint no-param-reassign:0*/\n    // Allow for axios('example/url'[, config]) a la fetch API\n    if (typeof configOrUrl === 'string') {\n      config = config || {};\n      config.url = configOrUrl;\n    } else {\n      config = configOrUrl || {};\n    }\n\n    config = mergeConfig(this.defaults, config);\n\n    const {transitional, paramsSerializer, headers} = config;\n\n    if (transitional !== undefined) {\n      validator.assertOptions(transitional, {\n        silentJSONParsing: validators.transitional(validators.boolean),\n        forcedJSONParsing: validators.transitional(validators.boolean),\n        clarifyTimeoutError: validators.transitional(validators.boolean)\n      }, false);\n    }\n\n    if (paramsSerializer != null) {\n      if (utils$1.isFunction(paramsSerializer)) {\n        config.paramsSerializer = {\n          serialize: paramsSerializer\n        };\n      } else {\n        validator.assertOptions(paramsSerializer, {\n          encode: validators.function,\n          serialize: validators.function\n        }, true);\n      }\n    }\n\n    // Set config.method\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n    // Flatten headers\n    let contextHeaders = headers && utils$1.merge(\n      headers.common,\n      headers[config.method]\n    );\n\n    headers && utils$1.forEach(\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n      (method) => {\n        delete headers[method];\n      }\n    );\n\n    config.headers = AxiosHeaders$1.concat(contextHeaders, headers);\n\n    // filter out skipped interceptors\n    const requestInterceptorChain = [];\n    let synchronousRequestInterceptors = true;\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n        return;\n      }\n\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    const responseInterceptorChain = [];\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    let promise;\n    let i = 0;\n    let len;\n\n    if (!synchronousRequestInterceptors) {\n      const chain = [dispatchRequest.bind(this), undefined];\n      chain.unshift.apply(chain, requestInterceptorChain);\n      chain.push.apply(chain, responseInterceptorChain);\n      len = chain.length;\n\n      promise = Promise.resolve(config);\n\n      while (i < len) {\n        promise = promise.then(chain[i++], chain[i++]);\n      }\n\n      return promise;\n    }\n\n    len = requestInterceptorChain.length;\n\n    let newConfig = config;\n\n    i = 0;\n\n    while (i < len) {\n      const onFulfilled = requestInterceptorChain[i++];\n      const onRejected = requestInterceptorChain[i++];\n      try {\n        newConfig = onFulfilled(newConfig);\n      } catch (error) {\n        onRejected.call(this, error);\n        break;\n      }\n    }\n\n    try {\n      promise = dispatchRequest.call(this, newConfig);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n\n    i = 0;\n    len = responseInterceptorChain.length;\n\n    while (i < len) {\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n    }\n\n    return promise;\n  }\n\n  getUri(config) {\n    config = mergeConfig(this.defaults, config);\n    const fullPath = buildFullPath(config.baseURL, config.url);\n    return buildURL(fullPath, config.params, config.paramsSerializer);\n  }\n}\n\n// Provide aliases for supported request methods\nutils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method,\n      url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n\n  function generateHTTPMethod(isForm) {\n    return function httpMethod(url, data, config) {\n      return this.request(mergeConfig(config || {}, {\n        method,\n        headers: isForm ? {\n          'Content-Type': 'multipart/form-data'\n        } : {},\n        url,\n        data\n      }));\n    };\n  }\n\n  Axios.prototype[method] = generateHTTPMethod();\n\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n  constructor(executor) {\n    if (typeof executor !== 'function') {\n      throw new TypeError('executor must be a function.');\n    }\n\n    let resolvePromise;\n\n    this.promise = new Promise(function promiseExecutor(resolve) {\n      resolvePromise = resolve;\n    });\n\n    const token = this;\n\n    // eslint-disable-next-line func-names\n    this.promise.then(cancel => {\n      if (!token._listeners) return;\n\n      let i = token._listeners.length;\n\n      while (i-- > 0) {\n        token._listeners[i](cancel);\n      }\n      token._listeners = null;\n    });\n\n    // eslint-disable-next-line func-names\n    this.promise.then = onfulfilled => {\n      let _resolve;\n      // eslint-disable-next-line func-names\n      const promise = new Promise(resolve => {\n        token.subscribe(resolve);\n        _resolve = resolve;\n      }).then(onfulfilled);\n\n      promise.cancel = function reject() {\n        token.unsubscribe(_resolve);\n      };\n\n      return promise;\n    };\n\n    executor(function cancel(message, config, request) {\n      if (token.reason) {\n        // Cancellation has already been requested\n        return;\n      }\n\n      token.reason = new CanceledError(message, config, request);\n      resolvePromise(token.reason);\n    });\n  }\n\n  /**\n   * Throws a `CanceledError` if cancellation has been requested.\n   */\n  throwIfRequested() {\n    if (this.reason) {\n      throw this.reason;\n    }\n  }\n\n  /**\n   * Subscribe to the cancel signal\n   */\n\n  subscribe(listener) {\n    if (this.reason) {\n      listener(this.reason);\n      return;\n    }\n\n    if (this._listeners) {\n      this._listeners.push(listener);\n    } else {\n      this._listeners = [listener];\n    }\n  }\n\n  /**\n   * Unsubscribe from the cancel signal\n   */\n\n  unsubscribe(listener) {\n    if (!this._listeners) {\n      return;\n    }\n    const index = this._listeners.indexOf(listener);\n    if (index !== -1) {\n      this._listeners.splice(index, 1);\n    }\n  }\n\n  toAbortSignal() {\n    const controller = new AbortController();\n\n    const abort = (err) => {\n      controller.abort(err);\n    };\n\n    this.subscribe(abort);\n\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n    return controller.signal;\n  }\n\n  /**\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\n   * cancels the `CancelToken`.\n   */\n  static source() {\n    let cancel;\n    const token = new CancelToken(function executor(c) {\n      cancel = c;\n    });\n    return {\n      token,\n      cancel\n    };\n  }\n}\n\nvar CancelToken$1 = CancelToken;\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n}\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n  return utils$1.isObject(payload) && (payload.isAxiosError === true);\n}\n\nconst HttpStatusCode = {\n  Continue: 100,\n  SwitchingProtocols: 101,\n  Processing: 102,\n  EarlyHints: 103,\n  Ok: 200,\n  Created: 201,\n  Accepted: 202,\n  NonAuthoritativeInformation: 203,\n  NoContent: 204,\n  ResetContent: 205,\n  PartialContent: 206,\n  MultiStatus: 207,\n  AlreadyReported: 208,\n  ImUsed: 226,\n  MultipleChoices: 300,\n  MovedPermanently: 301,\n  Found: 302,\n  SeeOther: 303,\n  NotModified: 304,\n  UseProxy: 305,\n  Unused: 306,\n  TemporaryRedirect: 307,\n  PermanentRedirect: 308,\n  BadRequest: 400,\n  Unauthorized: 401,\n  PaymentRequired: 402,\n  Forbidden: 403,\n  NotFound: 404,\n  MethodNotAllowed: 405,\n  NotAcceptable: 406,\n  ProxyAuthenticationRequired: 407,\n  RequestTimeout: 408,\n  Conflict: 409,\n  Gone: 410,\n  LengthRequired: 411,\n  PreconditionFailed: 412,\n  PayloadTooLarge: 413,\n  UriTooLong: 414,\n  UnsupportedMediaType: 415,\n  RangeNotSatisfiable: 416,\n  ExpectationFailed: 417,\n  ImATeapot: 418,\n  MisdirectedRequest: 421,\n  UnprocessableEntity: 422,\n  Locked: 423,\n  FailedDependency: 424,\n  TooEarly: 425,\n  UpgradeRequired: 426,\n  PreconditionRequired: 428,\n  TooManyRequests: 429,\n  RequestHeaderFieldsTooLarge: 431,\n  UnavailableForLegalReasons: 451,\n  InternalServerError: 500,\n  NotImplemented: 501,\n  BadGateway: 502,\n  ServiceUnavailable: 503,\n  GatewayTimeout: 504,\n  HttpVersionNotSupported: 505,\n  VariantAlsoNegotiates: 506,\n  InsufficientStorage: 507,\n  LoopDetected: 508,\n  NotExtended: 510,\n  NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n  HttpStatusCode[value] = key;\n});\n\nvar HttpStatusCode$1 = HttpStatusCode;\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  const context = new Axios$1(defaultConfig);\n  const instance = bind(Axios$1.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n  // Copy context to instance\n  utils$1.extend(instance, context, null, {allOwnKeys: true});\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults$1);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\nmodule.exports = axios;\n//# sourceMappingURL=axios.cjs.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","//product comparison flyout -\n// this bundle will be included on category and detail pages \n// to support the flyout and the 'add' buttons with the scale symbol\n\nimport './typescript/errorhandler';\nimport './typescript/helpers/polyfills';\n// PCF scss\nimport './styles/mpc-shared-basics.scss';\nimport './styles/flyout-icon.scss';\nimport './styles/flyout-icon.mobile.scss';\nimport './styles/flyout-content.scss';\nimport './styles/flyout-header.scss';\nimport './styles/flyout-footer.scss';\nimport './styles/containers-separation-line.scss';\nimport './styles/flyout-title.scss';\nimport './styles/flyout-title.mobile.scss';\nimport './styles/flyout-title.fragment.scss';\nimport './styles/flyout-notifications.scss';\nimport './styles/flyout-notifications.mobile.scss';\nimport './styles/flyout-new-product-notification.scss';\nimport './styles/flyout-new-product-notification.mobile.scss';\nimport './styles/flyout-empty-list-notification.scss';\nimport './styles/flyout-empty-list-notification.mobile.scss';\nimport './styles/flyout-max-products-count-notification.scss';\nimport './styles/flyout-max-products-count-notification.mobile.scss';\nimport './styles/flyout-compare-list-btn.scss';\nimport './styles/flyout-compare-list-btn.mobile.scss';\n\n//TP scss\nimport './styles/touch-point-toolbar.scss';\nimport './styles/touch-point-article-tile.scss';\nimport './styles/touch-point-article-tile.mobile.scss';\nimport './styles/touch-point-details-page.scss';\nimport './styles/touch-point-details-page.mobile.scss';\n\n// TP ts\nimport './typescript/TP/TouchPointFactory';\n\n// PCF ts\nimport './typescript/PCF/flyout-controller';\n"],"names":["Element","prototype","CharacterData","DocumentType","filter","Boolean","forEach","item","hasOwnProperty","Object","defineProperty","configurable","enumerable","writable","value","this","parentNode","removeChild","self","document","createElement","createElementNS","view","classListProp","protoProp","elemCtrProto","objCtr","strTrim","String","trim","replace","arrIndexOf","Array","indexOf","i","len","length","DOMEx","type","message","name","code","DOMException","checkTokenAndGetIndex","classList","token","test","call","ClassList","elem","trimmedClasses","getAttribute","classes","split","push","_updateClassName","setAttribute","toString","classListProto","classListGetter","Error","contains","add","tokens","arguments","l","updated","remove","index","splice","toggle","force","result","method","replacement_token","join","classListPropDesc","get","ex","undefined","number","__defineGetter__","testElement","createMethod","original","DOMTokenList","_toggle","slice","apply","exports","timeout_1","module","Timeout","__spreadArrays","s","il","r","k","a","j","jl","MetadataRecord","callback","key","ms","params","paused","startTime","Date","getTime","timeSpentWaiting","clear","erase","clearTimeout","keyId","keyCall","metadata","originalMs","set","args","_i","setTimeout","executedTime","executed","create","exists","elapsed","metaDataRecord","Math","max","lastExecuted","meta","pending","remaining","reset","restart","pause","resume","remainingTime","instantiate","linkToExisting","random","newCallback","newMs","newParams","MPCFlyoutContentController","ArrowUpIcon","ArrowRightIcon","NotificationService","MPCNotificationService","FlyoutContent","MPCFlyoutContent","NavigationService","MPCNavigationService","DeviceDetectionHelper","MPCDeviceDetectionHelper","ComparePageButtonUrlUpdater","MPCComparePageButtonUrlUpdater","ProductComparisonModelManager","MPCLocalStorageService","ScopeDetection","MPCScopeDetection","MpcSettings","MpcSettingsModule","flyoutContentScope","querySelector","init","handleFicClick","bind","_instance","disabledFromFocus","flyoutIconContainer","instance","loadFlyoutIcons","deviceDetectionHelper","notificationService","flyoutContentController","isMobileShop","comparePageButtonUrlUpdater","productComparisonModelManager","checkCurrentLocalStorage","flyoutContentContainer","flyoutHeader","flyoutContentObject","navigationService","closeFlyoutBtn","registerEventHandlers","closeArrow","compareButtonIcon","innerHTML","addEventListener","handleCloseClickFromFlyoutFragment","window","shell","subscribeTo","cleanUpEmptyContent","toggleAttribute","hideFlyoutContent","handleFlyoutIconClick","publishTo","refresh","model","activeNavigationTab","setActiveNavigationTab","updateContainerListVisibility","markAnyNavigationTabActive","addProduct","salesArticleVariantKey","seoSlug","origin","then","product","categoryName","addProductByCompareLink","maNo","colorCode","addProductByMasterArticleNo","removeProductTP","updateProductsCounter","counterNumber","productsCounter","counter","Number","textContent","innerText","removeEmptyContainerList","removeEmptyNavigationTabs","isFlyoutContentEmpty","announceNavigationTabCleanUpOutsidePcp","productComparisonModel","emptyNavigationTabs","hasScopes","setClearStoredEmptyNavigationTabs","getModel","products","checkIsProductAlreadyAdded","FlyoutContentController","ErrorHandlerManager","RecycleBinIcon","PlusIcon","MPCErrorHandlerModule","flyout","iFlyoutContentController","eventBus","MPCEventBus","EventBus","flyoutContent","emptyProductSlotTitle","clearFlyoutCategoryBtnTitle","listContainersArray","clearCategoryProducts","listContainer","listItems","querySelectorAll","listItem","removeProduct","getListContainerCategoryName","removeAllProductsOfCategory","newProduct","addProductToFlyoutContent","markActiveNavigationTab","savKey","context","originSeoSlug","url","apiUrl","data","JSON","stringify","postWithPromise","NlVanillajax","productDataFromService","handleProductInfoToAdd","catch","err","masterArticleNo","LogError","productAdded","AddResult","Added","publish","articleId","Replaced","changeProductVariantInFlyoutContent","RejectedCapacity","onlyDom","tabNav","focusNext","categoryUrl","itemsContainer","productRemoved","tabOrder","appendChild","createEmptyListItem","createOrUpdateNavigationTab","getContainerListItems","detailsPageUrl","mainImage","altTag","currentListContainer","listContainerNotExists","createListItem","newListContainer","createListContainer","oldListContainer","style","display","navigationOrder","newClearListBtn","newItemsContainer","btnId","className","id","maxProducts","onActivated","focus","newListItem","newProductImageHolder","newRemoveProductButton","newProductDescription","plusIcon","newProductImageSlot","itemOriginDetailsPageUrl","title","event","stopPropagation","preventDefault","emptyListItem","nextEmpty","nextElementSibling","insertBefore","removableContainers","selectFirstTab","tmpContainer","activeCategoryTabName","selectedCategoryName","newTabActivated","MPCFlyoutController","ScaleIcon2021","StickyFlyOutNotificationService","MPCStickyFlyOutNotificationService","scope","pcfScopeRendered","prepareMobile","stickyFlyOutNotificationService","getCurrentProductsAmount","body","showPcfScope","hidePcfScope","scaleIcon","compareButtonIcons","renderWithoutAnimation","FlyoutController","ScrollLock","SmartTimeout","MPCScrollLock","scrollLock","flyoutContainer","notification","closeBtns","openFlyoutBtns","navigationBtn","comparisonListButton","goToFlyoutComparisonList","closeNotification","maxProductsCountNotification","newProductNotification","emptyListNotification","closeAnyActiveNotification","notifyNewProductAdded","showNotification","replaceNotificationContent","notifyMaximumProductsCountReached","notifyEmptyList","initializeNavigationButtonOnEmptyNotificationOnce","eventFunction","showMobileHeaderMenu","removeEventListener","headrapi","toggleMenu","productInfoContainer","closeExistingNotification","existingNotification","renderFlyoutContainerOverlay","updateNotificationContent","triggerAppShellPublish","deferNotification","existingNotificationTimeout","showInner","renderOverlay","ontouchmove","lock","unlock","tabletHeaderHeightCalculated","isTabletHandHeldDevice","flyoutNewProductNotification","handleFlyOutNotificationOnScroll","pageYOffset","handleFlyOutOnScroll","MPCCompareButton","ScaleIcon","marker","slug","displayedInCategoryNavKey","parentContainer","markerElement","initializeNew","getTouchPoint","response","updateSaveKeyFromOutsideTheScope","orderModule","articleInfo","update","oldSavKey","newSavKey","SeoSlug","subPath","contentType","ContentType","Plain","getWithPromise","container","Html","touchPointElement","removePreviousButton","replaceChild","initialize","previousButton","parentElement","MPCCallLimiter","CallLimiter","debounce","CompareButton","MPCMobileToolbarButton","toolbarButtons","compareButtons","children","tbw_mlt","toolbarButton","closest","categoryNavKey","MobileCategoryNavKey","compareButton","deactivateOnMobileCategory","activateOnMobileCategory","isActivatedOnMobileCategory","getTBW_Mlt","MobileToolbarButton","MPCTileScaleButton","ScaleEmptyIcon","element","prerendered","selectedVariantElement","scopeClass","updateFlyout","subscribe","updateVisibility","TileScaleButton","MPCTileScaleButtonEx","forArticleTile","emptyIcon","icon","TileScaleButtonEx","MPCTouchPointFactory","TouchPointIdentifier","MPCTouchPointIdentifier","isMobileView","innerWidth","isNewDetailsPage","compareButtonSavKeySelector","touchPointIdentifier","touchPoints","initializeEvents","CreateTouchPointsForNewPDP","createByMarkersPayload","tile","createByMarkers","placeHoldersData","createByMarkersEx","form","savKeyElement","payload","initializePrerenderedMobileTouchPoints","initializeCompareLinkTouchPoints","newBtnLst","newBtn","getTileScaleTouchPoints","touchPointPlaceholders","getMobileTouchPointPlaceholders","savKeyToPlaceholder","touchPointPlaceholder","touchPoint","innerHtml","dataset","savkey","itemOrigin","placeholder","currentCategoryNavKey","compareLinks","getCompareLinks","compareLink","htmlIndex","href","splitted","substring","reverse","parseInt","isAxiosError","error","toJSON","articlesContext","post","headers","status","validSavKeys","getMarkersFromDomEx","createTouchPointEx","errorMsg","errorStack","stack","console","warn","markers","getMarkersFromDom","createTouchPoint","markerPayloadObject","parse","createTouchPointByPayloadObject","serviceCall","dataObject","TouchPointFactory","compareButtonMarker","tileScaleMarker","savKeys","allLinks","link","Init","_settings","onerror","msg","line","col","_errorCount","toLowerCase","errorEvent","lineno","colno","filename","errStr","isDevelopment","mpcLocalStorage","collectAllLocalStorageObjects","keys","reason","log","statusText","combinedData","localStorage","startsWith","itemStr","getItem","comparisonPage","comparisonFlyout","PcfScope","PcpScope","_culture","_portal","_portalMandantToken","_maxProducts","_isLoggedIn","_isDevelopment","_apiUrl","initDone","delay","immediate","timer","instantCall","throttle","interval","leadCall","trailCall","resetTimer","blockExecution","_comparePageUrl","comparisonPageBaseUri","onUpdatedModel","comparisonPageUri","encodeURIComponent","storageProduct","isTabletHandHeldDeviceEnvironment","documentElement","isMobileShopEnvironment","isMicrosoftBrowserEnvironment","sniffJson","getElementById","sniffJsonResult","resultingClasses","isTablet","cap","isPhone","isHandheld","isAndroid","isIOS","htmlClasses","isMsie","isEdge","isMicrosoftBrowser","callbackLists","eventName","isArray","subscriptionsIds","createSubscription","subscribeMultiple","subscriptions","subscriptionIds","subscription","subscriptionId","addSubscription","unsubscribe","unSubscribeMultiple","removeSubscription","MPCElementsHelper","appendChildAtIndex","child","parent","HtmlElementsHelper","navigationTabKeyName","abstractContent","selectCategoryButton","navigationTabs","navigationTabsArray","registerButtonEvent","switchNavigationTab","newActiveNavigationTab","domNode","newActiveNavigationTabName","oldNavigationTabName","clearLockedColumnIndex","clearCarouselScrollIndex","scrollToNavigationTab","buttonRightEdgePosition","getBoundingClientRect","left","offsetWidth","scrollLeft","createEmptyNavTab","isNew","navigationTab","appendSavKeyToNavTabUrl","updateCounter","createNavigationTab","indexToInsert","updateSelectCategoryButtonVisibility","isAnyProductCounted","productFound","tab","getCounterNumber","order","newNavigationTabHtml","newNavigationTab","newCategoryName","newArticlesCounter","target","previousElementSibling","removableNavigationTabs","tmpTab","newActiveTabCatName","newActiveTab","getFirstNavigationTab","NodeList","bodyScrollPosition","webContainer","mobileContainer","removeAttribute","scrollTo","query","req","xhr","open","setHeaders","onReadyStateChange","send","Promise","resolve","reject","onload","getResult","getHtmlResult","sendGet","win","XMLHttpRequest","header","setRequestHeader","onreadystatechange","readyState","DONE","responseText","json","e","DuplicateNotFound","DuplicateExact","localStorageAbstraction","LocalStorageAbstraction","localStorageCache","readLocalStorage","runningServiceCall","mobileEnabledCategories","validateLocalStorage","isNewlyLoggedOut","isLoggedIn","isTimedOut","createNewLocalStorage","isLoggedInNewly","needsValidation","sync","pageLanguage","culture","printPageContent","countBefore","clearStoredEmptyNavigationTabs","hasClientSideChange","countAfter","setMobileHeaderMarkerOn","setMobileHeaderMarkerOff","lastUpdateTime","seoDescription","originNavigationKeyPath","idx","duplicateCheckResult","checkDuplicateProductPerCategory","isAlreadyAtLimit","appendProductToList","RejectedDuplicate","skipSaving","afterSave","writeLocalStorage","syncedModel","articleRemoved","productsAfter","tmpProduct","some","p","addProductBySavKey","originNavKeyPathOverride","productsAmount","localStorageModel","mobileLockedColumnIndex","mobileCarouselScrollIndex","usedNavTabForCarouselOrLockedColumn","expiration5MinutesAfterLastUpdate","expirationDate","avoidNotification","productExists","storeEmptyNavigationTab","emptyNavigationTab","removeStoredEmptyNavigationTabs","getCarouselScrollIndex","currentCatName","getCurrentCategoryName","storeCarouselScrollIndex","getLockedColumnIndex","storeLockedColumnIndex","URLSearchParams","location","search","storePrintPageContent","content","outerHTML","getPrintPageContentCached","modelDirectlyFromLocalStorage","unsupported","getNewInstanceAndMigrate","mpcLocalStorageKeyNew","mpcLocalStorageKeyOld","portal","migrate","tmpLocalStorageObject","setItem","mpcLocalStorageJson","oldKeyData","removeItem","fn","thisArg","getPrototypeOf","kindOf","cache","thing","str","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","map","obj","allOwnKeys","getOwnPropertyNames","findKey","_key","_global","globalThis","g","isContextDefined","isTypedArray","TypedArray","Uint8Array","isHTMLForm","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","callbacks","source","shift","cb","asap","queueMicrotask","process","nextTick","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","b","stripBOM","charCodeAt","inherits","superConstructor","props","assign","toFlatObject","sourceObj","destObj","propFilter","merged","endsWith","searchString","position","lastIndex","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","isFinite","global","generateString","size","alphabet","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","AxiosError","config","request","captureStackTrace","description","fileName","lineNumber","columnNumber","prototype$1","isVisitable","removeBrackets","renderKey","path","dots","concat","from","customProps","axiosError","cause","predicates","toFormData","formData","options","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","isFlatArray","el","exposedHelpers","build","pop","encode$1","charMap","match","AxiosURLSearchParams","_pairs","encode","buildURL","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","protocols","hasBrowserEnv","_navigator","navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","freeze","__proto__","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","rawHeaders","parsed","parseHeaders","tokensRE","parseTokens","has","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","first","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","mapped","headerValue","AxiosHeaders$1","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","floor","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","now","startedAt","bytesCount","passed","round","speedometer","lastArgs","timestamp","threshold","invoke","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","msie","userAgent","urlParsingNode","originURL","resolveURL","protocol","host","hash","hostname","port","pathname","charAt","requestURL","cookies","write","expires","domain","secure","cookie","toGMTString","read","RegExp","decodeURIComponent","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","resolveConfig","newConfig","auth","btoa","username","password","unescape","xsrfValue","xhrAdapter","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","signal","onloadend","responseHeaders","getAllResponseHeaders","responseURL","onabort","ECONNABORTED","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","upload","cancel","abort","aborted","parseProtocol","composeSignals$1","signals","controller","AbortController","streamChunk","chunk","chunkSize","byteLength","end","pos","trackStream","stream","onProgress","onFinish","async","iterable","asyncIterator","reader","getReader","readStream","readBytes","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","fetch","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","duplex","supportsResponseStream","resolvers","res","_","ERR_NOT_SUPPORT","knownAdapters","http","fetchOptions","composedSignal","toAbortSignal","requestContentLength","getContentLength","_request","getBodyLength","resolveBodyLength","contentTypeHeader","flush","isCredentialsSupported","credentials","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","validators$1","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","validators","Axios","instanceConfig","interceptors","configOrUrl","dummy","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$1","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","c","CancelToken$1","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$1","axios","createInstance","defaultConfig","VERSION","Cancel","all","promises","spread","formToJSON","getAdapter","default","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","Function"],"sourceRoot":""}