/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./src/js/HKCheckCompletion.js":
/*!*************************************!*\
!*** ./src/js/HKCheckCompletion.js ***!
\*************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _hk_database_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hk-database.js */ \"./src/js/hk-database.js\");\n/* harmony import */ var _img_health_mask_png__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../img/health-mask.png */ \"./src/img/health-mask.png\");\n/* harmony import */ var _img_health_mask_steel_png__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../img/health-mask-steel.png */ \"./src/img/health-mask-steel.png\");\n/* harmony import */ var _img_soul_orb_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../img/soul-orb.png */ \"./src/img/soul-orb.png\");\n/* harmony import */ var _img_notch_png__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../img/notch.png */ \"./src/img/notch.png\");\n/* harmony import */ var _img_notch_filled_png__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../img/notch-filled.png */ \"./src/img/notch-filled.png\");\n/* harmony import */ var _img_notch_overcharmed_png__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../img/notch-overcharmed.png */ \"./src/img/notch-overcharmed.png\");\n/* harmony import */ var _img_geo_png__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../img/geo.png */ \"./src/img/geo.png\");\n/* harmony import */ var _img_geo_shade_png__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../img/geo-shade.png */ \"./src/img/geo-shade.png\");\n/* eslint-disable no-prototype-builtins */\n// ---------------- Load main Hollow Knight database file ----------------- //\n // ---------------- Load image files (necessary for Webpack) ----------------- //\n\n\n\n\n\n\n\n\n // ---------------- Constants ----------------- //\n// const DATA_UNKNOWN = \"Data unknown\";\n\nvar SYMBOL_FALSE = \"\"; // \"❌ \"\n\nvar SYMBOL_TRUE = \"\"; // \"✅ \"\n// const SYMBOL_INFO = \"\"; // \"ℹ \"\n\nvar SYMBOL_EMPTY = \"\";\nvar FLEUR_DIVIDE = \"
\"].join(\"\\n\");\nvar divStartCenter = [\"
\"].join(\"\\n\");\nvar divEnd = [\"
\"].join(\"\\n\");\nvar pSpan = \"
\";\nvar benchHKCCBegin, benchHKCCEnd; // ---------------- Functions ----------------- //\n\n/**\r\n * Main Function. Checks Hollow Knight game completion by analyzing the save file\r\n * @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON)\r\n */\n\nfunction HKCheckCompletion(jsonObject) {\n // start benchmark\n benchHKCCBegin = new Date();\n var HKPlayerData;\n var HKWorldItems;\n var HKSceneData;\n\n if (jsonObject.hasOwnProperty(\"playerData\")) {\n HKPlayerData = jsonObject.playerData;\n } else return false;\n\n if (jsonObject.hasOwnProperty(\"sceneData\")) {\n HKSceneData = jsonObject.sceneData;\n\n if (jsonObject.sceneData.hasOwnProperty(\"persistentBoolItems\")) {\n HKWorldItems = jsonObject.sceneData.persistentBoolItems;\n } else return false;\n } else return false; // Pre-Cleaning and filling initial data (h2, id) needed for FillHTML()\n\n\n PrefillHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID); // Prevents adding current percent data after each function call (each click of Analyze button)\n\n ResetCompletion(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID); // Shallow Clone const objects (used for destructive functions)\n\n var HK_HINTS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.HINTS);\n var HK_BOSSES_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.BOSSES);\n var HK_BOSSES_WORLD_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.BOSSES_WORLD);\n var HK_CHARMS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.CHARMS);\n var HK_COLOSSEUM_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.COLOSSEUM);\n var HK_DREAMERS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DREAMERS);\n var HK_DREAMNAIL_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DREAMNAIL);\n var HK_EQUIPMENT_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.EQUIPMENT);\n var HK_MASKSHARDS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.MASKSHARDS);\n var HK_MASKSHARDS_WORLD_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.MASKSHARDS_WORLD);\n var HK_NAILARTS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILARTS);\n var HK_VESSELFRAGMENTS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.VESSELFRAGMENTS);\n var HK_VESSELFRAGMENTS_WORLD_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.VESSELFRAGMENTS_WORLD);\n var HK_WARRIORDREAMS_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.WARRIORDREAMS);\n var HK_GRIMMTROUPE_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GRIMMTROUPE);\n var HK_LIFEBLOOD_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.LIFEBLOOD);\n var HK_GODMASTER_temp = Object.assign({}, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER); // Shallow Clone const arrays (used for destructive functions)\n\n var HK_GODMASTER_DOORS_temp = Array.from(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER_DOORS);\n var HK_NAILUPGRADES_temp = Array.from(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILUPGRADES); // Deep Clone const spells multi-layer object (used for destructive functions)\n\n var HK_SPELLS_temp = JSON.parse(JSON.stringify(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.SPELLS)); // ================================================================================== //\n // ---------------- Time Played ----------------- //\n\n CheckPlayTime(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.playTime); // ---------------- Game Completion Status ----------------- //\n\n CheckCompletionPercent(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.completionPercentage); // ---------------- Fleur Divide ----------------- //\n\n AppendHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, FLEUR_DIVIDE); // ---------------- Health Masks ----------------- //\n\n CheckHealthMasks(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.maxHealthBase, HKPlayerData.permadeathMode); // ---------------- Soul Orbs ----------------- //\n\n CheckSoulOrbs(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.maxMP + HKPlayerData.MPReserveMax); // ---------------- Charm Notches (Slots) ----------------- //\n\n CheckNotches(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.charmSlots, HKPlayerData.charmSlotsFilled); // ---------------- Geo Amount ----------------- //\n\n CheckGeo(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.intro, HKPlayerData.geo, HKPlayerData.geoPool); // ---------------- Bosses (Base Game) --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.bosses, HK_BOSSES_temp, HKPlayerData); // ---------------- Gruz Mother and Mawlek (World Map) --------------------- //\n\n if (HKWorldItems) CheckWorldDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.bosses, \"Battle Scene\", HK_BOSSES_WORLD_temp, HKWorldItems); // ---------------- Charms --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.charms, HK_CHARMS_temp, HKPlayerData); // ---------------- Colosseum of Fools --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.colosseum, HK_COLOSSEUM_temp, HKPlayerData); // ---------------- Dreamers --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.dreamers, HK_DREAMERS_temp, HKPlayerData); // ---------------- Dream Nail and Essence --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.dreamNail, HK_DREAMNAIL_temp, HKPlayerData); // ---------------- Equipment --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.equipment, HK_EQUIPMENT_temp, HKPlayerData); // ---------------- Nail Upgrades --------------------- //\n\n for (var i = 0, length = HK_NAILUPGRADES_temp.length; i < length; i++) {\n HKPlayerData.nailSmithUpgrades >= i ? CurrentDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.nailUpgrades) : CurrentDataFalse();\n FillHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.nailUpgrades, HK_NAILUPGRADES_temp[i][0], HK_NAILUPGRADES_temp[i][1]);\n }\n\n if (_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.nailUpgrades.percent) _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.nailUpgrades.percent--; // subject one for the Old Nail\n // ---------------- Mask Shards --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.maskShards, HK_MASKSHARDS_temp, HKPlayerData); // ---------------- Mask Shards (World Map) --------------------- //\n\n CheckWorldDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.maskShards, \"Heart Piece\", HK_MASKSHARDS_WORLD_temp, HKWorldItems); // ---------------- Nail Arts --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.nailArts, HK_NAILARTS_temp, HKPlayerData); // ---------------- Spells --------------------- //\n\n CheckSpellLevel(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.spells, HK_SPELLS_temp, HKPlayerData); // ---------------- Vessel Fragments --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.vesselFragments, HK_VESSELFRAGMENTS_temp, HKPlayerData); // ---------------- Vessel Fragments (World Map) --------------------- //\n\n CheckWorldDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.vesselFragments, \"Vessel Fragment\", HK_VESSELFRAGMENTS_WORLD_temp, HKWorldItems); // ---------------- Warrior Dreams --------------------- //\n\n CheckWarriorDreams(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.warriorDreams, HK_WARRIORDREAMS_temp, HKPlayerData); // ---------------- Grimm Troupe Content Pack --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.grimmTroupe, HK_GRIMMTROUPE_temp, HKPlayerData);\n HKPlayerData.grimmChildLevel >= 4 ? CurrentDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.grimmTroupe) : CurrentDataFalse();\n FillHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.grimmTroupe, \"Nightmare King Grimm / Banishment\", \"Dirtmouth or Howling Cliffs\"); // ---------------- Lifeblood Content Pack --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.lifeblood, HK_LIFEBLOOD_temp, HKPlayerData); // ---------------- Godmaster Content Pack --------------------- //\n\n CheckIfDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.godmaster, HK_GODMASTER_temp, HKPlayerData);\n\n for (var _i = 1; _i <= 4; _i++) {\n HKPlayerData[\"bossDoorStateTier\" + _i].completed === true ? CurrentDataTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.godmaster) : CurrentDataFalse();\n FillHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.godmaster, HK_GODMASTER_DOORS_temp[_i - 1][0], HK_GODMASTER_DOORS_temp[_i - 1][1]);\n } // ---------------- Fleur Divide ----------------- //\n\n\n AppendHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.godmaster, FLEUR_DIVIDE); // ------------------------- Essential Things ----------------------------- //\n\n CheckAdditionalThings(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.essential, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.ESSENTIAL, HKPlayerData, HKWorldItems); // ---------------- Fleur Divide ----------------- //\n\n AppendHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.essential, FLEUR_DIVIDE); // ------------------------- Achievements ----------------------------- //\n\n CheckAdditionalThings(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.achievements, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.ACHIEVEMENTS, HKPlayerData, HKWorldItems); // ---------------- Fleur Divide ----------------- //\n\n AppendHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.achievements, FLEUR_DIVIDE); // ------------------------- Game Statistics ----------------------------- //\n\n CheckAdditionalThings(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.statistics, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.STATISTICS, HKPlayerData, HKWorldItems, HKSceneData); // ------------------------- Hints ----------------------------- //\n\n CheckHintsTrue(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.hints, HK_HINTS_temp, HKPlayerData, HKWorldItems); // ------------------------- Fill completion ----------------------------- //\n\n CompletionHTML(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID, HKPlayerData.completionPercentage); // Prevents wrong checkbox behaviour (must run after everything is finished)\n\n CheckboxHintsToggle();\n CheckboxSpoilersToggle(); // finish and show benchmark\n\n benchHKCCEnd = new Date();\n console.info(\"HKCheckCompletion() time (ms) =\", benchHKCCEnd - benchHKCCBegin);\n return true;\n}\n/**\r\n * Cleans \"generated\" and fills all HTML elements of ids from a given list. Creates only div with id, and h2 with title inside it.\r\n * @param {object} jsObj Object with HTML data to fill\r\n */\n\n\nfunction PrefillHTML(jsObj) {\n // Clean \"generated\" div\n document.getElementById(\"generated\").innerHTML = \"\";\n var id = \"\";\n var h2 = \"\";\n var h2id = \"\";\n var mp = \"\"; // max Percent\n\n var cl = \"\"; // class\n\n for (var i in jsObj) {\n id = jsObj[i].id;\n h2 = jsObj[i].h2;\n h2id = \"h2-\" + jsObj[i].id;\n mp = \"
\".concat(i === \"intro\" ? 0 : jsObj[i].maxPercent, \"%
\");\n if (!jsObj[i].hasOwnProperty(\"maxPercent\")) mp = \"\";\n document.getElementById(\"generated\").innerHTML += \"
\" + \"
\"; // document.getElementById(id).innerHTML += \"
\" + h2 + mp + \"
\";\n\n document.getElementById(id).innerHTML += \"
\").concat(h2).concat(mp, \"
\");\n }\n}\n/**\r\n * Replaces the h2 titles with a current percent/max percent values as read from the save file\r\n * @param {object} jsObj Object with HTML data to fill\r\n */\n\n\nfunction CompletionHTML(jsObj, hkGameCompletion) {\n var h2 = \"\";\n var h2id = \"\";\n var cl = \"\";\n var clGreen = \"box-green\";\n var clRed = \"box-red\";\n var cp = 0; // current Percent\n\n var mp = 0; // max Percent\n\n var fillText = \"\";\n\n for (var i in jsObj) {\n h2 = jsObj[i].h2;\n h2id = \"h2-\" + jsObj[i].id;\n jsObj[i].hasOwnProperty(\"percent\") ? cp = jsObj[i].percent : cp = 0;\n if (i === \"intro\") cp = hkGameCompletion; // Don't use percent-box for Essentials, Achievements, Statistics\n\n if (!jsObj[i].hasOwnProperty(\"maxPercent\")) {\n fillText = \"\";\n } // otherwise use percent-box with values cp/mp%\n else {\n mp = jsObj[i].maxPercent;\n\n if (i === \"maskShards\") {\n var perc = jsObj[i].percent;\n perc % 4 ? cp = Math.floor(perc / 4) : cp = perc / 4;\n } else if (i === \"vesselFragments\") {\n var _perc = jsObj[i].percent;\n _perc % 3 ? cp = Math.floor(_perc / 3) : cp = _perc / 3;\n } // switches the box to red when a section (h2) is 0\n\n\n if (cp === 0) {\n cl = \" \".concat(clRed);\n } // switches the box to green when a section (h2) is completed\n else if (cp === mp) {\n cl = \" \".concat(clGreen);\n } // default is blue (partially completed and starting value)\n else cl = \"\"; // needed for Game Status to show percentage properly (adds a slash for all boxes except the Game Status one)\n\n\n if (jsObj[i].hasOwnProperty(\"percent\")) cp += \"/\";\n fillText = \"
\").concat(i === \"intro\" ? cp : cp + jsObj[i].maxPercent, \"%
\");\n }\n\n document.getElementById(h2id).innerHTML = h2 + fillText;\n }\n}\n/**\r\n * Generates and appends a new entry inside the HTML of a given ID\r\n * @param {object} divId object containing div ID and h2 title of the HTML element\r\n * @param {string} textPrefix Main name of the entry\r\n * @param {string} textSuffix Optional suffix after the main name (spoilers: locations, costs etc.)\r\n */\n\n\nfunction FillHTML(divId) {\n var textPrefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"Unknown Completion Element: \";\n var textSuffix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"Unknown Description Element\";\n var icon = completionSymbol;\n var b = [\"
\", \"\"];\n if (!textPrefix.length) b = [\"\", \"\"];\n var span = [\"
\", \"\"];\n var spoilerSpan = [\"
\", \"\"];\n\n if (divId === _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID.hints) {\n span[0] = \"
\";\n icon = \"\";\n }\n\n var dash = \"\";\n if (textSuffix.length && textPrefix.length) dash = \"— \";\n document.getElementById(divId.id).innerHTML += divStart + icon + b[0] + textPrefix + b[1] + span[0] + pSpan + spoilerSpan[0] + dash + textSuffix + spoilerSpan[1] + span[1] + divEnd;\n}\n/**\r\n * Adds HTML string to an element with a given ID.\r\n * @param {object} divId object containing div ID of the HTML element to append to\r\n * @param {string} content HTML contents to append\r\n */\n\n\nfunction AppendHTML(divId, content) {\n document.getElementById(divId.id).innerHTML += \"\\n\" + content;\n}\n/**\r\n * Switches global variable to a \"completed\" symbol. Adds +1 or +2 to percent property.\r\n */\n\n\nfunction CurrentDataTrue() {\n var divId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n completionSymbol = SYMBOL_TRUE;\n\n if (divId) {\n divId.percent++;\n if (divId.id === \"hk-equipment\") divId.percent++; // double % for equipment\n }\n}\n/**\r\n * Switches global variable to a \"not completed\" symbol\r\n */\n\n\nfunction CurrentDataFalse() {\n completionSymbol = SYMBOL_FALSE;\n}\n/**\r\n * Switches global variable to an \"information\" symbol\r\n */\n\n/* function CurrentDataInfo() {\r\n completionSymbol = SYMBOL_INFO;\r\n} */\n\n/**\r\n * Switches global variable to no symbol (span with left padding)\r\n */\n\n\nfunction CurrentDataBlank() {\n completionSymbol = SYMBOL_EMPTY;\n}\n/**\r\n * Fills HTML with the playTime value of the save file\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} playTime Number of total gameplay time in seconds\r\n */\n\n\nfunction CheckPlayTime(divId, playTime) {\n var icon = \"\";\n var seconds = Math.floor(playTime);\n var minutes = Math.floor(seconds / 60 % 60);\n var hours = Math.floor(seconds / 3600);\n var sec = Math.floor(seconds % 60);\n if (sec < 10) sec = \"0\" + sec;\n if (minutes < 10) minutes = \"0\" + minutes;\n var textFill = \"Time Played:\" + pSpan + \"\" + hours + \" h \" + minutes + \" min \" + sec + \" sec\";\n document.getElementById(divId.id).innerHTML += divStart + icon + textFill + divEnd;\n}\n/**\r\n * Searches for completionPercentage in playerData and fills HTML with the value of the save file\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} completionPercentage Number of completion percentage\r\n */\n\n\nfunction CheckCompletionPercent(divId, completionPercentage) {\n completionPercentage >= 112 ? CurrentDataTrue() : CurrentDataFalse();\n var textFill = \"Game Completion:\" + pSpan + \"\" + completionPercentage + \" %\" + pSpan + \"(out of \" + divId.maxPercent + \" %)\";\n document.getElementById(divId.id).innerHTML += divStart + completionSymbol + textFill + divEnd;\n}\n/**\r\n * Fills HTML with appropriate number of health mask images\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} masks Number of max health masks from the save (baseline without charms and lifeblood)\r\n * @param {number} permadeathMode Value of permadeathMode property. 0 = Normal, 1 = Steel Soul, 2 = Steel Soul broken save\r\n */\n\n\nfunction CheckHealthMasks(divId) {\n var masks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n var permadeathMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var icon = SYMBOL_EMPTY;\n var textFill = \"Health:\";\n var maskImages = \"\";\n var maskNormal = \"
\");\n var maskSteel = \"
\");\n var maskImg = \"\";\n permadeathMode > 0 ? maskImg = maskSteel : maskImg = maskNormal;\n\n for (var i = 0; i < masks; i++) {\n maskImages += maskImg;\n }\n\n document.getElementById(divId.id).innerHTML += divStartCenter + icon + textFill + maskImages + divEnd;\n}\n/**\r\n * Fills HTML with appropriate number of soul orbs images\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} totalSoul Number of max Soul reserve from the save. 99 = full Soul Orb\r\n */\n\n\nfunction CheckSoulOrbs(divId, totalSoul) {\n var icon = SYMBOL_EMPTY;\n var textFill = \"Soul:\";\n var soulImages = \"\";\n var soulNormal = \"
\");\n var soulImg = soulNormal;\n\n for (var i = 0, total = totalSoul / 33; i < total; i++) {\n soulImages += soulImg;\n }\n\n document.getElementById(divId.id).innerHTML += divStartCenter + icon + textFill + soulImages + divEnd;\n}\n/**\r\n * Fills HTML with the Geo value of the save file\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} geoValue Number of total Geo value\r\n */\n\n\nfunction CheckGeo(divId) {\n var geoValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var geoPoolValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var icon = SYMBOL_EMPTY;\n var textFill = \"Geo:
\").concat(geoValue, \"\"); // Show Shade Geo value and image only if Shade has at least 1 Geo on it\n\n if (geoPoolValue > 0) textFill += \"\\n \".concat(pSpan, \"+
\").concat(geoPoolValue, \"\"); // Show also total Geo (Geo + Shade Geo) if player has at least 1 geo alongside the shade geo\n\n if (geoValue > 0 && geoPoolValue > 0) textFill += \"\".concat(pSpan, \"=\").concat(pSpan, \"\").concat(geoValue + geoPoolValue, \"\");\n document.getElementById(divId.id).innerHTML += divStartCenter + icon + textFill + divEnd;\n}\n/**\r\n * Fills HTML with appropriate number of notch images\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {number} totalNotches Number of total Charm Notches the player has. 11 = max\r\n * @param {number} filledNotches Number of total used Charm Notches (including overcharmed notches). 15 = max\r\n */\n\n\nfunction CheckNotches(divId) {\n var totalNotches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n var filledNotches = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var _ = 0,\n overcharmedNotches = _.overcharmedNotches,\n unusedNotches = _.unusedNotches; // How many overcharmed notches images to show\n\n overcharmedNotches = filledNotches - totalNotches;\n if (overcharmedNotches < 1) overcharmedNotches = 0; // How many unused notches images to show\n\n unusedNotches = totalNotches - filledNotches;\n if (unusedNotches < 1) unusedNotches = 0; // Correct number of filled/used notches images to show when player is overcharmed\n\n if (filledNotches > totalNotches) filledNotches = totalNotches;\n var icon = SYMBOL_EMPTY;\n var textFill = \"Notches:\".concat(pSpan);\n var notchImages = \"\";\n var notchNormalImage = \"
\");\n var notchFilledImage = \"
\");\n var notchOvercharmedImage = \"
\"); // First check filled (used) notches and fill them (skips if no filled notches)\n\n if (filledNotches > 0) {\n for (var i = 0; i < filledNotches; i++) {\n notchImages += notchFilledImage;\n }\n } // Second check overcharmed notches and fill them (skips if player is not overcharmed)\n\n\n if (overcharmedNotches > 0) {\n for (var _i2 = 0; _i2 < overcharmedNotches; _i2++) {\n notchImages += notchOvercharmedImage;\n }\n } // Lastly, fill all unused notches\n\n\n if (unusedNotches > 0) {\n for (var _i3 = 0; _i3 < unusedNotches; _i3++) {\n notchImages += notchNormalImage;\n }\n }\n\n document.getElementById(divId.id).innerHTML += divStartCenter + icon + textFill + notchImages + divEnd;\n}\n/**\r\n * Verifies if the data in a specific object is true or false, and appends HTML accordingly.\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted)\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n */\n\n\nfunction CheckIfDataTrue(divId, dataObject, playerData) {\n for (var i in dataObject) {\n switch (i) {\n case \"gotCharm_36\":\n // prevents green checkbox and adding 1% when only got one white fragment\n playerData.gotQueenFragment === true && playerData.gotKingFragment === true ? CurrentDataTrue(divId) : CurrentDataFalse();\n break;\n\n default:\n playerData[i] === true ? CurrentDataTrue(divId) : CurrentDataFalse();\n }\n\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n }\n}\n/**\r\n * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly.\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted)\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n */\n\n\nfunction CheckSpellLevel(divId, dataObject, playerData) {\n for (var i in dataObject) {\n for (var j = 1; j <= 2; j++) {\n playerData[i] >= j ? CurrentDataTrue(divId) : CurrentDataFalse();\n FillHTML(divId, dataObject[i][j][0], dataObject[i][j][1]);\n }\n }\n}\n/**\r\n * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly.\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted)\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n */\n\n\nfunction CheckWarriorDreams(divId, dataObject, playerData) {\n for (var i in dataObject) {\n playerData[i] > 0 ? CurrentDataTrue(divId) : CurrentDataFalse();\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n }\n}\n/**\r\n * Verifies if the data in a specific object are true or false, and appends HTML accordingly. Creates a copy of dataObject.\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {string} idText Text string inside save data to search for\r\n * @param {object} dataObject Object containing data to be verified\r\n * @param {object} worldData Reference/pointer to specific data where to search\r\n */\n\n\nfunction CheckWorldDataTrue(divId, idText, dataObject, worldData) {\n var orderedArray = [];\n var size = ObjectLength(dataObject); // Order the items before displaying them (creates a copy of dataObject)\n\n for (var i in dataObject) {\n orderedArray.push([i, dataObject[i][0], dataObject[i][1], false]);\n } // Search for completed items and mark them for display\n\n\n for (var _i4 = 0, length = worldData.length; _i4 < length; _i4++) {\n for (var j = 0; j < size; j++) {\n if (worldData[_i4].id === idText && worldData[_i4].sceneName === orderedArray[j][0] && worldData[_i4].activated === true) {\n orderedArray[j][3] = true;\n }\n }\n } // Display the items as they were initially ordered\n\n\n for (var _i5 = 0; _i5 < size; _i5++) {\n CurrentDataFalse();\n if (orderedArray[_i5][3] === true) CurrentDataTrue(divId);\n FillHTML(divId, orderedArray[_i5][1], orderedArray[_i5][2]);\n }\n}\n/**\r\n * Verifies if the data in a specific object are true or false, or checks what values they have, and appends HTML accordingly.\r\n * @param {object} divId ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n * @param {object} worldData Reference/pointer to specific data where to search\r\n */\n\n\nfunction CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneData) {\n var textPrefix = \"\";\n var textSuffix = \"\";\n /**\r\n * Searches for a given item in the in-game area and returns true when found and collected.\r\n * @param {string} itemArea Code of the in-game area on the map\r\n * @param {string} itemId Name of the item\r\n * @returns {boolean}\r\n */\n\n function FindWorldItem() {\n var itemArea = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var itemId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"Shiny Item\";\n\n for (var i = 0, length = worldData.length; i < length; i++) {\n if (worldData[i].id === itemId) {\n if (worldData[i].sceneName === itemArea) {\n if (worldData[i].activated === true) return true;\n }\n }\n }\n\n return false;\n }\n /**\r\n * Searches for a given item that the player has found and returns the amount of them that the player completed.\r\n * @param {string} itemId Name of the item\r\n * @returns {number}\r\n */\n\n\n function CountWorldItem() {\n var itemId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var total = 0;\n\n for (var i = 0, length = worldData.length; i < length; i++) {\n if (worldData[i].id === itemId) {\n if (worldData[i].activated === true) total++;\n }\n }\n\n return total;\n }\n /**\r\n * Counts the number of maps the player has acquired (from the list in an array)\r\n * @param {array} mapArray Array of strings with area map names\r\n * @returns {number}\r\n */\n\n\n function CountMaps(mapArray) {\n var totalMaps = 0;\n\n for (var i = 0, len = mapArray.length; i < len; i++) {\n if (playerData[mapArray[i]] === true) totalMaps++;\n }\n\n return totalMaps;\n }\n /**\r\n * Counts the total amount of Geo Rocks Unbroken or Broken. Logs to console all the Unbroken IDs and Map locations.\r\n * @param {number} arrayLength How many items the Geo Rocks array is currently storing (for iteration)\r\n * @param {string} mode Choose which Geo Rocks to count (broken or unbroken)\r\n */\n\n\n function CountGeoRocks(arrayLength) {\n var mode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"unbroken\";\n var countTotal = 0;\n\n if (mode === \"unbroken\") {\n console.groupCollapsed(\"%cUnbroken Geo Rocks List:\", \"color: #16c60c;\");\n\n for (var i = 0; i < arrayLength; i++) {\n if (sceneData.geoRocks[i].hitsLeft > 0) {\n countTotal++;\n console.log(\"#\".concat(countTotal, \" | \").concat(sceneData.geoRocks[i].id, \" | Map location: \").concat(sceneData.geoRocks[i].sceneName));\n }\n }\n\n console.groupEnd();\n } else {\n for (var _i6 = 0; _i6 < arrayLength; _i6++) {\n if (sceneData.geoRocks[_i6].hitsLeft === 0) countTotal++;\n }\n }\n\n return countTotal;\n }\n\n function LogMissingGrubs() {\n var rescuedGrubsSceneList = [];\n\n for (var i = 0, _length = worldData.length; i < _length; i++) {\n if (worldData[i].id.includes(\"Grub Bottle\")) {\n if (worldData[i].activated === true) {\n // There are 3 duplicates of the same map scene name, so we need to assign each one its unique name\n if (worldData[i].sceneName === \"Ruins2_11\" && worldData[i].id === \"Grub Bottle\") {\n rescuedGrubsSceneList.push(\"Ruins2_11_1\");\n } else if (worldData[i].sceneName === \"Ruins2_11\" && worldData[i].id === \"Grub Bottle (1)\") {\n rescuedGrubsSceneList.push(\"Ruins2_11_2\");\n } else if (worldData[i].sceneName === \"Ruins2_11\" && worldData[i].id === \"Grub Bottle (2)\") {\n rescuedGrubsSceneList.push(\"Ruins2_11_3\");\n } else {\n rescuedGrubsSceneList.push(worldData[i].sceneName);\n }\n }\n }\n } // Filtering the reference database Grub list to include only the missing values\n\n\n var missingGrubsList = _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GRUBS_LIST.filter(function (x) {\n return !rescuedGrubsSceneList.includes(x);\n });\n var length = missingGrubsList.length;\n\n if (length) {\n console.groupCollapsed(\"%cUnrescued Grubs List:\", \"color: #16c60c;\");\n\n for (var _i7 = 0; _i7 < length; _i7++) {\n console.log(\"#\".concat(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GRUBS_LIST.indexOf(missingGrubsList[_i7]) + 1, \" | Map location: \").concat(missingGrubsList[_i7]));\n }\n\n console.groupEnd();\n }\n\n return false;\n } // Start main loop\n\n\n for (var i in dataObject) {\n textPrefix = dataObject[i][0];\n dataObject[i][1] ? textSuffix = dataObject[i][1] : textSuffix = \"\";\n var _2 = 0,\n amount = _2.amount,\n countTotal = _2.countTotal,\n total = _2.total,\n unbroken = _2.unbroken,\n broken = _2.broken,\n discoveredTotal = _2.discoveredTotal;\n\n switch (i) {\n case \"areaMaps\":\n case \"grubsCollected\":\n case \"dreamOrbs\":\n case \"fountainGeo\":\n case \"nailDamage\":\n case \"stationsOpened\":\n case \"charmSlots\":\n case \"whisperingRoots\":\n case \"journalEntriesCompleted\":\n case \"journalNotesCompleted\":\n case \"whiteDefenderDefeats\":\n case \"greyPrinceDefeats\":\n if (i === \"areaMaps\") {\n amount = CountMaps(dataObject[i][3]);\n } else if (i === \"whisperingRoots\") {\n amount = CountWorldItem(\"Dream Plant\");\n } else {\n amount = playerData[i];\n }\n\n if (i === \"stationsOpened\") {\n if (playerData.openedHiddenStation === true) amount++;\n }\n\n countTotal = amount;\n\n if (i === \"journalEntriesCompleted\" || i === \"journalNotesCompleted\") {\n countTotal = amount + \" / \" + playerData.journalEntriesTotal;\n }\n\n if (i === \"grubsCollected\") LogMissingGrubs();\n textPrefix += \": \" + countTotal;\n amount >= dataObject[i][2] ? CurrentDataTrue() : CurrentDataBlank();\n break;\n\n case \"geoPool\":\n case \"rancidEggs\":\n case \"xunFlowerBrokeTimes\":\n textPrefix += \": \" + Math.abs(playerData[i]);\n i === \"geoPool\" && playerData[i] > 0 ? CurrentDataBlank() : CurrentDataTrue();\n break;\n\n case \"geoRocks\":\n discoveredTotal = sceneData.geoRocks.length;\n unbroken = CountGeoRocks(discoveredTotal, \"unbroken\");\n broken = CountGeoRocks(discoveredTotal, \"broken\");\n textPrefix += \": \".concat(unbroken, \" | \").concat(broken, \" | \").concat(discoveredTotal);\n CurrentDataTrue();\n break;\n\n case \"shopkeeperKey\":\n playerData.hasSlykey === true || playerData.gaveSlykey === true ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"elegantKey\":\n playerData.hasWhiteKey === true || playerData.usedWhiteKey === true ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"loveKey\":\n playerData.hasLoveKey === true || playerData.openedLoveDoor === true ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"simpleKeyCityOfTears\":\n // #2\n FindWorldItem(\"Ruins1_17\", \"Shiny Item\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"simpleKeyAncientBasin\":\n // #3\n FindWorldItem(\"Abyss_20\", \"Shiny Item Stand\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreAncientBasin\":\n // #1\n FindWorldItem(\"Abyss_17\", \"Battle Scene Ore\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreSeer\":\n // #2\n playerData.dreamReward2 === true ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreCrystalPeak\":\n // #3\n FindWorldItem(\"Mines_34\", \"Shiny Item Stand\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreDeepnest\":\n // #4\n FindWorldItem(\"Deepnest_32\", \"Shiny Item Stand\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreGrubfather\":\n // #5\n FindWorldItem(\"Crossroads_38\", \"Shiny Item Ore\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"paleOreColosseum\":\n // #6\n FindWorldItem(\"Room_Colosseum_Silver\", \"Shiny Item\") ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"relicsWandererJournal\":\n case \"relicsHallownestSeal\":\n case \"relicsKingsIdol\":\n case \"relicsArcaneEgg\":\n total = playerData[dataObject[i][3]] + playerData[dataObject[i][4]];\n total >= dataObject[i][2] ? CurrentDataTrue() : CurrentDataBlank();\n textPrefix += \": \" + total;\n break;\n\n case \"bossDoorStateTier5\":\n playerData[i].completed === true ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"killsBindingSeal\":\n playerData[i] == 0 ? CurrentDataTrue() : CurrentDataFalse();\n break;\n\n case \"killedVoidIdol_1\":\n playerData[i] === true ? CurrentDataTrue() : CurrentDataFalse();\n if (playerData[i] === false && (playerData.killedVoidIdol_2 === true || playerData.killedVoidIdol_3 === true)) CurrentDataTrue();\n break;\n\n case \"killedVoidIdol_2\":\n playerData[i] === true ? CurrentDataTrue() : CurrentDataFalse();\n if (playerData[i] === false && playerData.killedVoidIdol_3 === true) CurrentDataTrue();\n break;\n\n case \"greyPrinceDefeated\":\n case \"zoteDead\":\n case \"nailsmithSpared\":\n playerData[i] === true ? CurrentDataTrue() : CurrentDataBlank();\n break;\n\n default:\n playerData[i] === true ? CurrentDataTrue() : CurrentDataFalse();\n } // end main for loop\n\n\n FillHTML(divId, textPrefix, textSuffix);\n }\n}\n/**\r\n * Checks, validates and shows hints to the player depending on their save progression, in chronological order. Shows only hint for the last uncompleted event. If Hollow Knight is defeated, shows a dummy text.\r\n * @param {object} divId object containing div hints ID and h2 title\r\n * @param {object} dataObject object containing all hints data\r\n * @param {object} playerData object containing HK Player Data to look in\r\n * @param {object} worldData object containing HK World Data to look in\r\n * @returns {bool} true when defeated Hollow Knight, false if not\r\n */\n\n\nfunction CheckHintsTrue(divId, dataObject, playerData, worldData) {\n if (playerData.killedHollowKnight === true) {\n // a text to show when player already finished their first playthrough (killed Hollow Knight first time)\n FillHTML(divId, \"\", \"...a successful Knight who doesn't need hints anymore. The Knight explores the world of Hallownest patiently in constant search of its remaining secrets...\");\n return true;\n }\n\n for (var i in dataObject) {\n if (playerData[i] === true) {\n continue;\n } else if (i === \"fireballLevel\") {\n if (playerData[i] >= 1) {\n continue;\n } else {\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } else if (i === \"Crossroads_04\") {\n var GruzMotherDefeated = false;\n\n for (var k = 0, length = worldData.length; k < length; k++) {\n if (worldData[k].id === \"Battle Scene\" && worldData[k].sceneName === \"Crossroads_04\" && worldData[k].activated === true) {\n GruzMotherDefeated = true;\n break;\n }\n }\n\n if (GruzMotherDefeated) {\n continue; // next dataObject (i)\n } else {\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } else if (i === \"dungDefenderOrHornet2\") {\n if (playerData.defeatedDungDefender === true) {\n continue;\n } else if (playerData.hornetOutskirtsDefeated === true) {\n continue;\n } else {\n // if no Dung Defender or Hornet 2\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } else if (i === \"ismaTearOrShadeCloak\") {\n if (playerData.hasAcidArmour === true) {\n continue;\n } else if (playerData.hasKingsBrand === true) {\n if (playerData.hasShadowDash === true) {\n continue;\n } else {\n // if Kings Brand but no Shade Cloak\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } else {\n // if no Isma's Tear or Kings Brand\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } else {\n // if anything from the hints list is not done\n FillHTML(divId, dataObject[i][0], dataObject[i][1]);\n return false;\n }\n } // end: for (let i in dataObject)\n\n} // function CheckHintsTrue()\n\n/**\r\n * Pre-Cleans HTML. Reads contents inside text area and parses it to a JavaScript object. If not empty, runs HKCheckCompletion() to check data.\r\n */\n\n\nfunction HKReadTextArea() {\n var textAreaId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n // refresh and prepare document for filling with data from the save\n InitialHTMLPopulate(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID);\n var contents = document.getElementById(textAreaId).value;\n\n if (contents.length) {\n try {\n var jsonObject = JSON.parse(contents); // console.log(jsonObject);\n\n if (jsonObject.hasOwnProperty(\"playerData\")) HKCheckCompletion(jsonObject); // console.log(jsonObject);\n } catch (error) {\n alert(\"This seems like not a valid Hollow Knight save. \".concat(error));\n console.info(\"This seems like not a valid Hollow Knight save. \".concat(error));\n }\n }\n}\n/**\r\n * Checks the length of a JavaScript Object like Array.length\r\n * @param {object} object JavaScript Object\r\n * @return {number} length of the Object\r\n */\n\n\nfunction ObjectLength(object) {\n var length = 0;\n\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n ++length;\n }\n }\n\n return length;\n}\n/**\r\n * Populate all HTML with given ID and their initial data set as false (used at DOM load)\r\n * @param {object} divIdObj JavaScript Object containing all HTML IDs to populate\r\n */\n\n\nfunction InitialHTMLPopulate(divIdObj) {\n PrefillHTML(divIdObj);\n CurrentDataFalse(); // Play Time\n\n CheckPlayTime(divIdObj.intro, 0); // Game Completion\n\n CheckCompletionPercent(divIdObj.intro, 0); // Fleur Divide\n\n AppendHTML(divIdObj.intro, FLEUR_DIVIDE); // Health Masks\n\n CheckHealthMasks(divIdObj.intro); // Soul Orbs\n\n CheckSoulOrbs(divIdObj.intro, 99); // Charm Notches\n\n CheckNotches(divIdObj.intro); // Geo\n\n CheckGeo(divIdObj.intro); // First Hint Only\n\n FillHTML(divIdObj.hints, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.HINTS.fireballLevel[0], _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.HINTS.fireballLevel[1]); // Temp arrays storing references (addresses) to objects for looping through them (duplicates important)\n\n var hkObjArray = [_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.BOSSES, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.BOSSES_WORLD, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.CHARMS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.EQUIPMENT, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILARTS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.MASKSHARDS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.MASKSHARDS_WORLD, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.VESSELFRAGMENTS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.VESSELFRAGMENTS_WORLD, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DREAMERS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.COLOSSEUM, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DREAMNAIL, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.WARRIORDREAMS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GRIMMTROUPE, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.LIFEBLOOD, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.ESSENTIAL, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.ACHIEVEMENTS, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.STATISTICS]; // duplicates and order important - must be the same as in hkObjArray[]\n\n var divObjArray = [divIdObj.bosses, divIdObj.bosses, divIdObj.charms, divIdObj.equipment, divIdObj.nailArts, divIdObj.maskShards, divIdObj.maskShards, divIdObj.vesselFragments, divIdObj.vesselFragments, divIdObj.dreamers, divIdObj.colosseum, divIdObj.dreamNail, divIdObj.warriorDreams, divIdObj.grimmTroupe, divIdObj.lifeblood, divIdObj.godmaster, divIdObj.essential, divIdObj.achievements, divIdObj.statistics]; // Looped filling to reduce redundancy\n\n do {\n for (var parameter in hkObjArray[0]) {\n FillHTML(divObjArray[0], hkObjArray[0][parameter][0], hkObjArray[0][parameter][1]);\n }\n\n divObjArray.shift();\n } while (hkObjArray.shift()); // Nail Upgrades Misc\n\n\n for (var i = 0; i < _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILUPGRADES.length; i++) {\n FillHTML(divIdObj.nailUpgrades, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILUPGRADES[i][0], _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.NAILUPGRADES[i][1]);\n } // Spells Misc\n\n\n for (var _i8 in _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.SPELLS) {\n for (var j = 1; j <= 2; j++) {\n FillHTML(divIdObj.spells, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.SPELLS[_i8][j][0], _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.SPELLS[_i8][j][1]);\n }\n } // Nightmare King Grimm / Banishment Misc\n\n\n FillHTML(divIdObj.grimmTroupe, \"Nightmare King Grimm / Banishment\", \"Dirtmouth or Howling Cliffs\"); // Godmaster Doors Misc\n\n for (var _i9 = 0; _i9 < ObjectLength(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER_DOORS); _i9++) {\n FillHTML(divIdObj.godmaster, _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER_DOORS[_i9][0], _hk_database_js__WEBPACK_IMPORTED_MODULE_0__.GODMASTER_DOORS[_i9][1]);\n } // Fleur Dividers\n\n\n AppendHTML(divIdObj.godmaster, FLEUR_DIVIDE);\n AppendHTML(divIdObj.essential, FLEUR_DIVIDE);\n AppendHTML(divIdObj.achievements, FLEUR_DIVIDE); // Check local storage first to set proper checkbox state before the below functions start (default is always unchecked)\n\n if (localStorage.getItem(\"hkCheckboxHints\") === \"checked\") document.getElementById(\"checkbox-hints\").checked = true;\n if (localStorage.getItem(\"hkCheckboxSpoilers\") === \"checked\") document.getElementById(\"checkbox-spoilers\").checked = true; // Prevents wrong checkbox behaviour (must run after everything is finished)\n\n CheckboxHintsToggle();\n CheckboxSpoilersToggle();\n}\n/**\r\n * Toggles display of \"hk-hints\". On click with no parameters or on demand when called with a parameter\r\n * @param {string} param \"hide\", \"show\" or none (optional)\r\n */\n\n\nfunction CheckboxHintsToggle() {\n var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"none\";\n var checkboxId = document.getElementById(\"checkbox-hints\");\n\n switch (param) {\n case \"hide\":\n document.getElementById(\"hk-hints\").classList.add(\"hidden\");\n checkboxId.value = \"hints-off\";\n checkboxId.checked = false; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxHints\", \"unchecked\");\n break;\n\n case \"show\":\n document.getElementById(\"hk-hints\").classList.remove(\"hidden\");\n checkboxId.value = \"hints-on\";\n checkboxId.checked = true; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxHints\", \"checked\");\n break;\n\n default:\n // This runs when the checkbox is not checked\n if (checkboxId.checked === false) {\n document.getElementById(\"hk-hints\").classList.add(\"hidden\");\n checkboxId.value = \"hints-off\"; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxHints\", \"unchecked\");\n } // This runs when the checkbox is checked\n else {\n document.getElementById(\"hk-hints\").classList.remove(\"hidden\");\n checkboxId.value = \"hints-on\"; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxHints\", \"checked\");\n }\n\n }\n}\n/**\r\n * Toggles display of \".spoiler-span\" class. On click with no parameters or on demand when called with a parameter\r\n * @param {string} param \"hide\", \"show\" or none (optional)\r\n */\n\n\nfunction CheckboxSpoilersToggle() {\n var param = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"none\";\n var checkboxId = document.getElementById(\"checkbox-spoilers\");\n var allClassElements = document.querySelectorAll(\".spoiler-span\");\n var length = allClassElements.length;\n\n switch (param) {\n case \"hide\":\n for (var i = 0; i < length; i++) {\n allClassElements[i].classList.add(\"hidden\");\n }\n\n checkboxId.value = \"spoilers-off\";\n checkboxId.checked = false; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxSpoilers\", \"unchecked\");\n break;\n\n case \"show\":\n for (var _i10 = 0; _i10 < length; _i10++) {\n allClassElements[_i10].classList.remove(\"hidden\");\n }\n\n checkboxId.value = \"spoilers-on\";\n checkboxId.checked = true; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxSpoilers\", \"checked\");\n break;\n\n default:\n // This runs when the checkbox is not checked\n if (checkboxId.checked === false) {\n for (var _i11 = 0; _i11 < length; _i11++) {\n allClassElements[_i11].classList.add(\"hidden\");\n }\n\n checkboxId.value = \"spoilers-off\"; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxSpoilers\", \"unchecked\");\n } // This runs when the checkbox is checked\n else {\n for (var _i12 = 0; _i12 < length; _i12++) {\n allClassElements[_i12].classList.remove(\"hidden\");\n }\n\n checkboxId.value = \"spoilers-on\"; // remember this choice for subsequent page visits and browser restarts\n\n localStorage.setItem(\"hkCheckboxSpoilers\", \"checked\");\n }\n\n }\n}\n/**\r\n * Zero-fill all \"percent\" properties in the JSON Object (reset to default)\r\n * @param {object} jsObj object containing the \"percent\" properties to be reset to 0\r\n */\n\n\nfunction ResetCompletion(jsObj) {\n for (var i in jsObj) {\n if (jsObj[i].hasOwnProperty(\"percent\")) jsObj[i].percent = 0;\n }\n}\n/**\r\n * Focuses, selects and copies to clipboard contents inside a clicked element. Includes optional tooltip update after the copying is done.\r\n * @param {MouseEvent} mouseEvent from the clicked element (AddEventListener)\r\n * @param {string} tooltipId Element ID of the tooltip to update\r\n * @param {string} tooltipFill Updated contents of the tooltip\r\n */\n\n\nfunction SelectCopyInputText(mouseEvent) {\n var tooltipId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var tooltipFill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"\";\n var element = document.getElementById(mouseEvent.target.id); // this prevents the un-selected effect after clicking the second time (clears all selection first)\n\n if (window.getSelection) {\n window.getSelection().removeAllRanges();\n }\n\n element.focus(); // best to focus the element first before selecting\n\n element.select();\n element.setSelectionRange(0, 99999); // for mobile devices\n // Copy the text inside the text field to clipboard\n\n document.execCommand(\"copy\"); // optional tooltip showing\n\n if (tooltipFill.length && tooltipId.length) FillInnerHTML(tooltipId, tooltipFill);\n}\n/**\r\n * Fills the innerHTML of a given HTML Element with provided contents\r\n * @param {string} elementId Element ID to update\r\n * @param {string} textFill Updated contents (innerHTML)\r\n */\n\n\nfunction FillInnerHTML(elementId, textFill) {\n var element = document.getElementById(elementId);\n element.innerHTML = textFill;\n} // Populate HTML at load (before img and css)\n\n\ndocument.addEventListener(\"DOMContentLoaded\", InitialHTMLPopulate(_hk_database_js__WEBPACK_IMPORTED_MODULE_0__.DIV_ID)); // Does an action when the save file location input text is clicked once (auto select & copy to clipboard)\n\ndocument.getElementById(\"save-location-input\").addEventListener(\"click\", function (e) {\n SelectCopyInputText(e, \"save-location-input-tooltip\", \"Copied save file location to clipboard\");\n}, false);\ndocument.getElementById(\"save-location-input\").addEventListener(\"mouseout\", function () {\n FillInnerHTML(\"save-location-input-tooltip\", \"Click once to copy to clipboard\");\n}, false); // Make functions global so they can be used on click and change events (for Webpack)\n\nwindow.HKReadTextArea = HKReadTextArea;\nwindow.InitialHTMLPopulate = InitialHTMLPopulate;\nwindow.CheckboxSpoilersToggle = CheckboxSpoilersToggle;\nwindow.CheckboxHintsToggle = CheckboxHintsToggle;\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/HKCheckCompletion.js?");
/***/ }),
/***/ "./src/js/LoadSaveFile.js":
/*!********************************!*\
!*** ./src/js/LoadSaveFile.js ***!
\********************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
eval("/* global require HKReadTextArea */\n\n/* \r\n Parts of the code thanks to bloodorca https://github.com/bloodorca/hollow (base64.js, functions.js) with slight modifications.\r\n The steps used there for decryption were taken from KayDeeTee https://github.com/KayDeeTee/Hollow-Knight-SaveManager\r\n Without these two people the existence of this tool wouldn't be possible :)\r\n*/\n// ---------------- Constants ----------------- //\n// AES JS for file decryption\nvar aesjs = __webpack_require__(/*! ./aes-js.js */ \"./src/js/aes-js.js\");\n\nvar CSHARP_HEADER = [0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0]; // 22 bytes\n\nvar BASE64_ARRAY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".split(\"\").map(function (c) {\n return c.charCodeAt(0);\n});\nvar BASE64_DECODE_TABLE = new Map(BASE64_ARRAY.map(function (ord, i) {\n return [ord, i];\n}));\nvar AES_KEY = new TextEncoder().encode('UKu52ePUBwetZ9wNX88o54dnfKRu0T1l'); // encodes a string to Uint8Array (prepare for AES JS)\n\nvar ECB_STREAM_CIPHER = new aesjs.ModeOfOperation.ecb(AES_KEY); // create a new AES stream cipher object using the encoded key\n// ---------------- Variables ----------------- //\n\nvar benchLSFBegin, benchLSFEnd, benchTotal; // ---------------- Functions ----------------- //\n\n/**\r\n * Main input tag file function. Selects the first file, reads it as an Array Buffer, starts the processing of the file when loaded.\r\n * Starts benchmarking.\r\n * @param {FileList} input FileList object containing a list of File objects. The FileList behaves like an array, so you can check its length property to get the number of selected files.\r\n */\n// eslint-disable-next-line no-unused-vars\n\nfunction LoadSaveFile(input) {\n var startTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n // console.info(\"Input length: \" + input.files.length)\n // Cease further processing if user canceled the file input dialog\n if (input.files.length < 1) return false; // start benchmark\n\n benchLSFBegin = startTime; // Prepares a File object from the first file of the input files for reading as an Array Buffer\n\n var inputFileObject = input.files[0]; // Cleans the file list to avoid problems after subsequent use\n // document.getElementById(\"save-area-file\").value = \"\";\n // 1. read file\n // The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.\n // It is an array of bytes, often referred to in other languages as a \"byte array\".\n // new FileReader()\n\n var inputReader = new FileReader(); // readAsArrayBuffer(file)\n\n inputReader.readAsArrayBuffer(inputFileObject); // addEventListener(\"load\", function) - to decode the file when loaded\n\n inputReader.addEventListener(\"load\", ProcessFileObject);\n}\n/**\r\n * Reads the File object as an Array Buffer and does all other operations (decoding, decryption, conversion to string, pasting to text area).\r\n * Launches the HKReadTextArea() function automatically after pasting the string to text area\r\n */\n\n\nfunction ProcessFileObject() {\n var inputArrayBuffer = this.result;\n var decodedString; // 2. Decode file\n\n try {\n // Uint8Array(ArrayBuffer) uint8_t equivalent in C\n inputArrayBuffer = new Uint8Array(inputArrayBuffer); // ArrayBuffer.slice()\n // The slice() method copies up to, but not including, the byte indicated by the end parameter.\n\n inputArrayBuffer.slice(); // remove C# header and LengthPrefixedString header (ArrayBuffer)\n\n inputArrayBuffer = RemoveHeaders(inputArrayBuffer); // base64 Decoding (ArrayBuffer)\n\n inputArrayBuffer = Base64Decode(inputArrayBuffer); // AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)\n\n inputArrayBuffer = AESDecryption(inputArrayBuffer); // Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)\n\n decodedString = new TextDecoder().decode(inputArrayBuffer); // 4. Paste decoded string file to text area\n\n document.getElementById(\"save-area\").value = \"\";\n document.getElementById(\"save-area\").value = decodedString; // finish and show benchmark\n\n benchLSFEnd = new Date();\n console.info(\"LoadSaveFile() time (ms) =\", benchLSFEnd - benchLSFBegin); // after pasting the decoded string, launch the main analyzing function immediately\n\n HKReadTextArea(\"save-area\"); // finish total and show benchmark\n\n benchTotal = new Date();\n console.info(\"Total time (ms) =\", benchTotal - benchLSFBegin); // alert(`Decoded String: ${decodedString}`);\n // alert(`Array Buffer: ${inputArrayBuffer}`);\n } catch (error) {\n alert(\"The file cannot be decoded. \".concat(error));\n console.info(\"The file cannot be decoded. \".concat(error));\n }\n}\n/**\r\n * Removes C# header, LengthPrefixedString header and byte 11 at the end of the Uint8 Array Buffer\r\n * @param {Uint8Array} buffer Uint8Array buffer for removing the header from\r\n * @param {Uint8Array} csHeader Uint8Array for the C# header length calculation\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction RemoveHeaders(buffer) {\n var csHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CSHARP_HEADER;\n // Remove the fixed C# header and byte 11 at the end. \n buffer = buffer.subarray(csHeader.length, buffer.length - 1); // Remove LengthPrefixedString header\n\n var lengthCount = 0;\n\n for (var i = 0; i < 5; i++) {\n lengthCount++;\n\n if ((buffer[i] & 0x80) == 0) {\n break;\n }\n }\n\n return buffer.subarray(lengthCount);\n}\n/**\r\n * Decodes an Array Buffer using a Base64 decode table\r\n * @param {Uint8Array} buffer Uint8Array Buffer to decode\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction Base64Decode(buffer) {\n buffer = new Uint8Array(buffer).slice();\n buffer = buffer.map(function (v) {\n return BASE64_DECODE_TABLE.get(v);\n }); // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.\n\n var p = buffer.indexOf(64);\n var end;\n\n if (p != -1) {\n end = p;\n } else {\n end = buffer.length;\n }\n\n buffer = buffer.subarray(0, end);\n var output = new Uint8Array(3 * buffer.length / 4);\n var continuous = Math.floor(buffer.length / 4) * 4;\n\n for (var i = 0; i < continuous; i += 4) {\n var k = 3 * i / 4;\n output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;\n output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;\n output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];\n }\n\n if (buffer[continuous] != undefined) {\n var _k = 3 * continuous / 4;\n\n output[_k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;\n\n if (buffer[continuous + 2] != undefined) {\n output[_k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;\n }\n }\n\n return output;\n}\n/**\r\n * Decrypt an Uint8Array Buffer using aesjs (ECB) and a predefined AES key + remove pkcs7 padding\r\n * @param {Uint8Array} buffer Uint8Array buffer to decrypt\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction AESDecryption(buffer) {\n var cipherObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ECB_STREAM_CIPHER;\n var output = cipherObject.decrypt(buffer);\n return output.subarray(0, -output[output.length - 1]);\n} // Make functions global so they can be used on click and change events (for Webpack)\n\n\nwindow.LoadSaveFile = LoadSaveFile;\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/LoadSaveFile.js?");
/***/ }),
/***/ "./src/js/aes-js.js":
/*!**************************!*\
!*** ./src/js/aes-js.js ***!
\**************************/
/***/ (function(module) {
"use strict";
eval("/* eslint-disable */\n\n\n(function (root) {\n function checkInt(value) {\n return parseInt(value) === value;\n }\n\n function checkInts(arrayish) {\n if (!checkInt(arrayish.length)) {\n return false;\n }\n\n for (var i = 0; i < arrayish.length; i++) {\n if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {\n return false;\n }\n }\n\n return true;\n }\n\n function coerceArray(arg, copy) {\n // ArrayBuffer view\n if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') {\n if (copy) {\n if (arg.slice) {\n arg = arg.slice();\n } else {\n arg = Array.prototype.slice.call(arg);\n }\n }\n\n return arg;\n } // It's an array; check it is a valid representation of a byte\n\n\n if (Array.isArray(arg)) {\n if (!checkInts(arg)) {\n throw new Error('Array contains invalid value: ' + arg);\n }\n\n return new Uint8Array(arg);\n } // Something else, but behaves like an array (maybe a Buffer? Arguments?)\n\n\n if (checkInt(arg.length) && checkInts(arg)) {\n return new Uint8Array(arg);\n }\n\n throw new Error('unsupported array-like object');\n }\n\n function createArray(length) {\n return new Uint8Array(length);\n }\n\n function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {\n if (sourceStart != null || sourceEnd != null) {\n if (sourceArray.slice) {\n sourceArray = sourceArray.slice(sourceStart, sourceEnd);\n } else {\n sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);\n }\n }\n\n targetArray.set(sourceArray, targetStart);\n }\n\n var convertUtf8 = function () {\n function toBytes(text) {\n var result = [],\n i = 0;\n text = encodeURI(text);\n\n while (i < text.length) {\n var c = text.charCodeAt(i++); // if it is a % sign, encode the following 2 bytes as a hex value\n\n if (c === 37) {\n result.push(parseInt(text.substr(i, 2), 16));\n i += 2; // otherwise, just the actual byte\n } else {\n result.push(c);\n }\n }\n\n return coerceArray(result);\n }\n\n function fromBytes(bytes) {\n var result = [],\n i = 0;\n\n while (i < bytes.length) {\n var c = bytes[i];\n\n if (c < 128) {\n result.push(String.fromCharCode(c));\n i++;\n } else if (c > 191 && c < 224) {\n result.push(String.fromCharCode((c & 0x1f) << 6 | bytes[i + 1] & 0x3f));\n i += 2;\n } else {\n result.push(String.fromCharCode((c & 0x0f) << 12 | (bytes[i + 1] & 0x3f) << 6 | bytes[i + 2] & 0x3f));\n i += 3;\n }\n }\n\n return result.join('');\n }\n\n return {\n toBytes: toBytes,\n fromBytes: fromBytes\n };\n }();\n\n var convertHex = function () {\n function toBytes(text) {\n var result = [];\n\n for (var i = 0; i < text.length; i += 2) {\n result.push(parseInt(text.substr(i, 2), 16));\n }\n\n return result;\n } // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html\n\n\n var Hex = '0123456789abcdef';\n\n function fromBytes(bytes) {\n var result = [];\n\n for (var i = 0; i < bytes.length; i++) {\n var v = bytes[i];\n result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);\n }\n\n return result.join('');\n }\n\n return {\n toBytes: toBytes,\n fromBytes: fromBytes\n };\n }(); // Number of rounds by keysize\n\n\n var numberOfRounds = {\n 16: 10,\n 24: 12,\n 32: 14\n }; // Round constant words\n\n var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; // S-box and Inverse S-box (S is for Substitution)\n\n var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];\n var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; // Transformations for encryption\n\n var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];\n var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];\n var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];\n var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; // Transformations for decryption\n\n var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];\n var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];\n var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];\n var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; // Transformations for decryption key expansion\n\n var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];\n var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];\n var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];\n var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];\n\n function convertToInt32(bytes) {\n var result = [];\n\n for (var i = 0; i < bytes.length; i += 4) {\n result.push(bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]);\n }\n\n return result;\n }\n\n var AES = function AES(key) {\n if (!(this instanceof AES)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n Object.defineProperty(this, 'key', {\n value: coerceArray(key, true)\n });\n\n this._prepare();\n };\n\n AES.prototype._prepare = function () {\n var rounds = numberOfRounds[this.key.length];\n\n if (rounds == null) {\n throw new Error('invalid key size (must be 16, 24 or 32 bytes)');\n } // encryption round keys\n\n\n this._Ke = []; // decryption round keys\n\n this._Kd = [];\n\n for (var i = 0; i <= rounds; i++) {\n this._Ke.push([0, 0, 0, 0]);\n\n this._Kd.push([0, 0, 0, 0]);\n }\n\n var roundKeyCount = (rounds + 1) * 4;\n var KC = this.key.length / 4; // convert the key into ints\n\n var tk = convertToInt32(this.key); // copy values into round key arrays\n\n var index;\n\n for (var i = 0; i < KC; i++) {\n index = i >> 2;\n this._Ke[index][i % 4] = tk[i];\n this._Kd[rounds - index][i % 4] = tk[i];\n } // key expansion (fips-197 section 5.2)\n\n\n var rconpointer = 0;\n var t = KC,\n tt;\n\n while (t < roundKeyCount) {\n tt = tk[KC - 1];\n tk[0] ^= S[tt >> 16 & 0xFF] << 24 ^ S[tt >> 8 & 0xFF] << 16 ^ S[tt & 0xFF] << 8 ^ S[tt >> 24 & 0xFF] ^ rcon[rconpointer] << 24;\n rconpointer += 1; // key expansion (for non-256 bit)\n\n if (KC != 8) {\n for (var i = 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n } // key expansion for 256-bit keys is \"slightly different\" (fips-197)\n\n } else {\n for (var i = 1; i < KC / 2; i++) {\n tk[i] ^= tk[i - 1];\n }\n\n tt = tk[KC / 2 - 1];\n tk[KC / 2] ^= S[tt & 0xFF] ^ S[tt >> 8 & 0xFF] << 8 ^ S[tt >> 16 & 0xFF] << 16 ^ S[tt >> 24 & 0xFF] << 24;\n\n for (var i = KC / 2 + 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n }\n } // copy values into round key arrays\n\n\n var i = 0,\n r,\n c;\n\n while (i < KC && t < roundKeyCount) {\n r = t >> 2;\n c = t % 4;\n this._Ke[r][c] = tk[i];\n this._Kd[rounds - r][c] = tk[i++];\n t++;\n }\n } // inverse-cipher-ify the decryption round key (fips-197 section 5.3)\n\n\n for (var r = 1; r < rounds; r++) {\n for (var c = 0; c < 4; c++) {\n tt = this._Kd[r][c];\n this._Kd[r][c] = U1[tt >> 24 & 0xFF] ^ U2[tt >> 16 & 0xFF] ^ U3[tt >> 8 & 0xFF] ^ U4[tt & 0xFF];\n }\n }\n };\n\n AES.prototype.encrypt = function (plaintext) {\n if (plaintext.length != 16) {\n throw new Error('invalid plaintext size (must be 16 bytes)');\n }\n\n var rounds = this._Ke.length - 1;\n var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)\n\n var t = convertToInt32(plaintext);\n\n for (var i = 0; i < 4; i++) {\n t[i] ^= this._Ke[0][i];\n } // apply round transforms\n\n\n for (var r = 1; r < rounds; r++) {\n for (var i = 0; i < 4; i++) {\n a[i] = T1[t[i] >> 24 & 0xff] ^ T2[t[(i + 1) % 4] >> 16 & 0xff] ^ T3[t[(i + 2) % 4] >> 8 & 0xff] ^ T4[t[(i + 3) % 4] & 0xff] ^ this._Ke[r][i];\n }\n\n t = a.slice();\n } // the last round is special\n\n\n var result = createArray(16),\n tt;\n\n for (var i = 0; i < 4; i++) {\n tt = this._Ke[rounds][i];\n result[4 * i] = (S[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;\n result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;\n result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;\n result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;\n }\n\n return result;\n };\n\n AES.prototype.decrypt = function (ciphertext) {\n if (ciphertext.length != 16) {\n throw new Error('invalid ciphertext size (must be 16 bytes)');\n }\n\n var rounds = this._Kd.length - 1;\n var a = [0, 0, 0, 0]; // convert plaintext to (ints ^ key)\n\n var t = convertToInt32(ciphertext);\n\n for (var i = 0; i < 4; i++) {\n t[i] ^= this._Kd[0][i];\n } // apply round transforms\n\n\n for (var r = 1; r < rounds; r++) {\n for (var i = 0; i < 4; i++) {\n a[i] = T5[t[i] >> 24 & 0xff] ^ T6[t[(i + 3) % 4] >> 16 & 0xff] ^ T7[t[(i + 2) % 4] >> 8 & 0xff] ^ T8[t[(i + 1) % 4] & 0xff] ^ this._Kd[r][i];\n }\n\n t = a.slice();\n } // the last round is special\n\n\n var result = createArray(16),\n tt;\n\n for (var i = 0; i < 4; i++) {\n tt = this._Kd[rounds][i];\n result[4 * i] = (Si[t[i] >> 24 & 0xff] ^ tt >> 24) & 0xff;\n result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 0xff] ^ tt >> 16) & 0xff;\n result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 0xff] ^ tt >> 8) & 0xff;\n result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;\n }\n\n return result;\n };\n /**\n * Mode Of Operation - Electonic Codebook (ECB)\n */\n\n\n var ModeOfOperationECB = function ModeOfOperationECB(key) {\n if (!(this instanceof ModeOfOperationECB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Electronic Code Block\";\n this.name = \"ecb\";\n this._aes = new AES(key);\n };\n\n ModeOfOperationECB.prototype.encrypt = function (plaintext) {\n plaintext = coerceArray(plaintext);\n\n if (plaintext.length % 16 !== 0) {\n throw new Error('invalid plaintext size (must be multiple of 16 bytes)');\n }\n\n var ciphertext = createArray(plaintext.length);\n var block = createArray(16);\n\n for (var i = 0; i < plaintext.length; i += 16) {\n copyArray(plaintext, block, 0, i, i + 16);\n block = this._aes.encrypt(block);\n copyArray(block, ciphertext, i);\n }\n\n return ciphertext;\n };\n\n ModeOfOperationECB.prototype.decrypt = function (ciphertext) {\n ciphertext = coerceArray(ciphertext);\n\n if (ciphertext.length % 16 !== 0) {\n throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');\n }\n\n var plaintext = createArray(ciphertext.length);\n var block = createArray(16);\n\n for (var i = 0; i < ciphertext.length; i += 16) {\n copyArray(ciphertext, block, 0, i, i + 16);\n block = this._aes.decrypt(block);\n copyArray(block, plaintext, i);\n }\n\n return plaintext;\n };\n /**\n * Mode Of Operation - Cipher Block Chaining (CBC)\n */\n\n\n var ModeOfOperationCBC = function ModeOfOperationCBC(key, iv) {\n if (!(this instanceof ModeOfOperationCBC)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Cipher Block Chaining\";\n this.name = \"cbc\";\n\n if (!iv) {\n iv = createArray(16);\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 bytes)');\n }\n\n this._lastCipherblock = coerceArray(iv, true);\n this._aes = new AES(key);\n };\n\n ModeOfOperationCBC.prototype.encrypt = function (plaintext) {\n plaintext = coerceArray(plaintext);\n\n if (plaintext.length % 16 !== 0) {\n throw new Error('invalid plaintext size (must be multiple of 16 bytes)');\n }\n\n var ciphertext = createArray(plaintext.length);\n var block = createArray(16);\n\n for (var i = 0; i < plaintext.length; i += 16) {\n copyArray(plaintext, block, 0, i, i + 16);\n\n for (var j = 0; j < 16; j++) {\n block[j] ^= this._lastCipherblock[j];\n }\n\n this._lastCipherblock = this._aes.encrypt(block);\n copyArray(this._lastCipherblock, ciphertext, i);\n }\n\n return ciphertext;\n };\n\n ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {\n ciphertext = coerceArray(ciphertext);\n\n if (ciphertext.length % 16 !== 0) {\n throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');\n }\n\n var plaintext = createArray(ciphertext.length);\n var block = createArray(16);\n\n for (var i = 0; i < ciphertext.length; i += 16) {\n copyArray(ciphertext, block, 0, i, i + 16);\n block = this._aes.decrypt(block);\n\n for (var j = 0; j < 16; j++) {\n plaintext[i + j] = block[j] ^ this._lastCipherblock[j];\n }\n\n copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);\n }\n\n return plaintext;\n };\n /**\n * Mode Of Operation - Cipher Feedback (CFB)\n */\n\n\n var ModeOfOperationCFB = function ModeOfOperationCFB(key, iv, segmentSize) {\n if (!(this instanceof ModeOfOperationCFB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Cipher Feedback\";\n this.name = \"cfb\";\n\n if (!iv) {\n iv = createArray(16);\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 size)');\n }\n\n if (!segmentSize) {\n segmentSize = 1;\n }\n\n this.segmentSize = segmentSize;\n this._shiftRegister = coerceArray(iv, true);\n this._aes = new AES(key);\n };\n\n ModeOfOperationCFB.prototype.encrypt = function (plaintext) {\n if (plaintext.length % this.segmentSize != 0) {\n throw new Error('invalid plaintext size (must be segmentSize bytes)');\n }\n\n var encrypted = coerceArray(plaintext, true);\n var xorSegment;\n\n for (var i = 0; i < encrypted.length; i += this.segmentSize) {\n xorSegment = this._aes.encrypt(this._shiftRegister);\n\n for (var j = 0; j < this.segmentSize; j++) {\n encrypted[i + j] ^= xorSegment[j];\n } // Shift the register\n\n\n copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n }\n\n return encrypted;\n };\n\n ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {\n if (ciphertext.length % this.segmentSize != 0) {\n throw new Error('invalid ciphertext size (must be segmentSize bytes)');\n }\n\n var plaintext = coerceArray(ciphertext, true);\n var xorSegment;\n\n for (var i = 0; i < plaintext.length; i += this.segmentSize) {\n xorSegment = this._aes.encrypt(this._shiftRegister);\n\n for (var j = 0; j < this.segmentSize; j++) {\n plaintext[i + j] ^= xorSegment[j];\n } // Shift the register\n\n\n copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n }\n\n return plaintext;\n };\n /**\n * Mode Of Operation - Output Feedback (OFB)\n */\n\n\n var ModeOfOperationOFB = function ModeOfOperationOFB(key, iv) {\n if (!(this instanceof ModeOfOperationOFB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Output Feedback\";\n this.name = \"ofb\";\n\n if (!iv) {\n iv = createArray(16);\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 bytes)');\n }\n\n this._lastPrecipher = coerceArray(iv, true);\n this._lastPrecipherIndex = 16;\n this._aes = new AES(key);\n };\n\n ModeOfOperationOFB.prototype.encrypt = function (plaintext) {\n var encrypted = coerceArray(plaintext, true);\n\n for (var i = 0; i < encrypted.length; i++) {\n if (this._lastPrecipherIndex === 16) {\n this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);\n this._lastPrecipherIndex = 0;\n }\n\n encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];\n }\n\n return encrypted;\n }; // Decryption is symetric\n\n\n ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;\n /**\n * Counter object for CTR common mode of operation\n */\n\n var Counter = function Counter(initialValue) {\n if (!(this instanceof Counter)) {\n throw Error('Counter must be instanitated with `new`');\n } // We allow 0, but anything false-ish uses the default 1\n\n\n if (initialValue !== 0 && !initialValue) {\n initialValue = 1;\n }\n\n if (typeof initialValue === 'number') {\n this._counter = createArray(16);\n this.setValue(initialValue);\n } else {\n this.setBytes(initialValue);\n }\n };\n\n Counter.prototype.setValue = function (value) {\n if (typeof value !== 'number' || parseInt(value) != value) {\n throw new Error('invalid counter value (must be an integer)');\n }\n\n for (var index = 15; index >= 0; --index) {\n this._counter[index] = value % 256;\n value = value >> 8;\n }\n };\n\n Counter.prototype.setBytes = function (bytes) {\n bytes = coerceArray(bytes, true);\n\n if (bytes.length != 16) {\n throw new Error('invalid counter bytes size (must be 16 bytes)');\n }\n\n this._counter = bytes;\n };\n\n Counter.prototype.increment = function () {\n for (var i = 15; i >= 0; i--) {\n if (this._counter[i] === 255) {\n this._counter[i] = 0;\n } else {\n this._counter[i]++;\n break;\n }\n }\n };\n /**\n * Mode Of Operation - Counter (CTR)\n */\n\n\n var ModeOfOperationCTR = function ModeOfOperationCTR(key, counter) {\n if (!(this instanceof ModeOfOperationCTR)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Counter\";\n this.name = \"ctr\";\n\n if (!(counter instanceof Counter)) {\n counter = new Counter(counter);\n }\n\n this._counter = counter;\n this._remainingCounter = null;\n this._remainingCounterIndex = 16;\n this._aes = new AES(key);\n };\n\n ModeOfOperationCTR.prototype.encrypt = function (plaintext) {\n var encrypted = coerceArray(plaintext, true);\n\n for (var i = 0; i < encrypted.length; i++) {\n if (this._remainingCounterIndex === 16) {\n this._remainingCounter = this._aes.encrypt(this._counter._counter);\n this._remainingCounterIndex = 0;\n\n this._counter.increment();\n }\n\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n }\n\n return encrypted;\n }; // Decryption is symetric\n\n\n ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; ///////////////////////\n // Padding\n // See:https://tools.ietf.org/html/rfc2315\n\n function pkcs7pad(data) {\n data = coerceArray(data, true);\n var padder = 16 - data.length % 16;\n var result = createArray(data.length + padder);\n copyArray(data, result);\n\n for (var i = data.length; i < result.length; i++) {\n result[i] = padder;\n }\n\n return result;\n }\n\n function pkcs7strip(data) {\n data = coerceArray(data, true);\n\n if (data.length < 16) {\n throw new Error('PKCS#7 invalid length');\n }\n\n var padder = data[data.length - 1];\n\n if (padder > 16) {\n throw new Error('PKCS#7 padding byte out of range');\n }\n\n var length = data.length - padder;\n\n for (var i = 0; i < padder; i++) {\n if (data[length + i] !== padder) {\n throw new Error('PKCS#7 invalid padding byte');\n }\n }\n\n var result = createArray(length);\n copyArray(data, result, 0, 0, length);\n return result;\n } ///////////////////////\n // Exporting\n // The block cipher\n\n\n var aesjs = {\n AES: AES,\n Counter: Counter,\n ModeOfOperation: {\n ecb: ModeOfOperationECB,\n cbc: ModeOfOperationCBC,\n cfb: ModeOfOperationCFB,\n ofb: ModeOfOperationOFB,\n ctr: ModeOfOperationCTR\n },\n utils: {\n hex: convertHex,\n utf8: convertUtf8\n },\n padding: {\n pkcs7: {\n pad: pkcs7pad,\n strip: pkcs7strip\n }\n },\n _arrayTest: {\n coerceArray: coerceArray,\n createArray: createArray,\n copyArray: copyArray\n }\n }; // node.js\n\n if (true) {\n module.exports = aesjs; // RequireJS/AMD\n // http://www.requirejs.org/docs/api.html\n // https://github.com/amdjs/amdjs-api/wiki/AMD\n } else {}\n})(this);\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/aes-js.js?");
/***/ }),
/***/ "./src/js/cookieconsent.min.js":
/*!*************************************!*\
!*** ./src/js/cookieconsent.min.js ***!
\*************************************/
/***/ (() => {
eval("function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n!function (e) {\n function t(i) {\n if (n[i]) return n[i].exports;\n var o = n[i] = {\n i: i,\n l: !1,\n exports: {}\n };\n return e[i].call(o.exports, o, o.exports, t), o.l = !0, o.exports;\n }\n\n var n = {};\n t.m = e, t.c = n, t.d = function (e, n, i) {\n t.o(e, n) || Object.defineProperty(e, n, {\n enumerable: !0,\n get: i\n });\n }, t.r = function (e) {\n \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: \"Module\"\n }), Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, t.t = function (e, n) {\n if (1 & n && (e = t(e)), 8 & n) return e;\n if (4 & n && \"object\" == _typeof(e) && e && e.__esModule) return e;\n var i = Object.create(null);\n if (t.r(i), Object.defineProperty(i, \"default\", {\n enumerable: !0,\n value: e\n }), 2 & n && \"string\" != typeof e) for (var o in e) {\n t.d(i, o, function (t) {\n return e[t];\n }.bind(null, o));\n }\n return i;\n }, t.n = function (e) {\n var n = e && e.__esModule ? function () {\n return e[\"default\"];\n } : function () {\n return e;\n };\n return t.d(n, \"a\", n), n;\n }, t.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, t.p = \"\", t(t.s = 4);\n}([function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return s;\n });\n var i = n(1),\n o = n(16);\n var c = new (n.n(o).a)();\n\n var s = function s() {\n var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, s);\n\n this.options = Object(i.j)(e, t), this.on = c.on.bind(c), this.emit = c.emit.bind(c);\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"b\", function () {\n return a;\n }), n.d(t, \"k\", function () {\n return l;\n }), n.d(t, \"e\", function () {\n return u;\n }), n.d(t, \"l\", function () {\n return d;\n }), n.d(t, \"d\", function () {\n return p;\n }), n.d(t, \"m\", function () {\n return h;\n }), n.d(t, \"a\", function () {\n return f;\n }), n.d(t, \"h\", function () {\n return m;\n }), n.d(t, \"g\", function () {\n return b;\n }), n.d(t, \"f\", function () {\n return g;\n }), n.d(t, \"c\", function () {\n return v;\n }), n.d(t, \"i\", function () {\n return y;\n }), n.d(t, \"j\", function () {\n return k;\n });\n var i = n(12),\n o = n(3),\n c = n(13),\n s = n(14),\n r = n(15);\n\n var a = i.a,\n l = i.b,\n u = function u(e, t) {\n return e.replace(/{{([a-z][a-z0-9\\-_]*)}}/gi, function (e, n) {\n return t(n) || \"\";\n });\n },\n d = function d(e, t) {\n var n = !1;\n return function () {\n n || (e.apply(void 0, arguments), n = !0, setTimeout(function () {\n n = !1;\n }, t));\n };\n },\n p = function p(e) {\n var t,\n n = 0,\n i = 0,\n o = e.length;\n if (0 === e.length) return n;\n\n for (; i < o; ++i) {\n n = (n << 5) - n + (t = e.charCodeAt(i)), n |= 0;\n }\n\n return n;\n },\n h = (o.d, o.a, o.c, o.b, c.b),\n f = c.a,\n m = s.c,\n b = s.b,\n g = s.a,\n v = r.a,\n y = r.b,\n w = function w(e) {\n return function (t, _ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n n = _ref2[0],\n i = _ref2[1];\n\n return t[n] = i instanceof Object && !(i instanceof Array) ? e[n] instanceof Object && !(e[n] instanceof Array) ? Object.entries(i).reduce(w(e[n]), {}) : i : e.hasOwnProperty(n) ? e[n] : i, t;\n };\n },\n k = function k(e, t) {\n return Object.entries(e).reduce(w(t), {});\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"e\", function () {\n return i;\n }), n.d(t, \"c\", function () {\n return o;\n }), n.d(t, \"b\", function () {\n return c;\n }), n.d(t, \"d\", function () {\n return s;\n }), n.d(t, \"a\", function () {\n return r;\n });\n var i = [\"DENY\", \"ALLOW\", \"DISMISS\"],\n o = \"DENY\",\n c = \"ALLOW\",\n s = \"DISMISS\",\n r = [\"UNCATEGORIZED\", \"ESSENTIAL\", \"PERSONALIZATION\", \"ANALYTICS\", \"MARKETING\"];\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"d\", function () {\n return i;\n }), n.d(t, \"a\", function () {\n return o;\n }), n.d(t, \"c\", function () {\n return c;\n }), n.d(t, \"b\", function () {\n return s;\n });\n\n var i = function i(e) {\n return \"#\" == e[0] ? e.substr(1) : 3 == e.length ? e[0] + e[0] + e[1] + e[1] + e[2] + e[2] : e;\n },\n o = function o(e) {\n return e = i(e), 128 <= (299 * parseInt(e.substr(0, 2), 16) + 587 * parseInt(e.substr(2, 2), 16) + 114 * parseInt(e.substr(4, 2), 16)) / 1e3 ? \"#000\" : \"#fff\";\n },\n c = function c(e) {\n var t = parseInt(i(e), 16),\n n = 38 + (t >> 16),\n o = 38 + (255 & t >> 8),\n c = 38 + (255 & t);\n return \"#\" + (16777216 + 65536 * (255 > n ? 1 > n ? 0 : n : 255) + 256 * (255 > o ? 1 > o ? 0 : o : 255) + (255 > c ? 1 > c ? 0 : c : 255)).toString(16).slice(1);\n },\n s = function s(e) {\n return e = i(e), \"000000\" === e ? \"#222\" : c(e);\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.r(t), function (e) {\n var t = n(6),\n i = (n.n(t), n(11));\n false ? 0 : e.exports = i.a;\n }.call(this, n(5)(e));\n}, function (e) {\n e.exports = function (e) {\n if (!e.webpackPolyfill) {\n var t = Object.create(e);\n t.children || (t.children = []), Object.defineProperty(t, \"loaded\", {\n enumerable: !0,\n get: function get() {\n return t.l;\n }\n }), Object.defineProperty(t, \"id\", {\n enumerable: !0,\n get: function get() {\n return t.i;\n }\n }), Object.defineProperty(t, \"exports\", {\n enumerable: !0\n }), t.webpackPolyfill = 1;\n }\n\n return t;\n };\n}, function (e, t, n) {\n var i = n(7);\n \"string\" == typeof i && (i = [[e.i, i, \"\"]]);\n var o = {\n hmr: !0,\n transform: void 0,\n insertInto: void 0\n };\n n(9)(i, o), i.locals && (e.exports = i.locals);\n}, function (e, t, n) {\n (e.exports = n(8)(!1)).push([e.i, '.cc-window{opacity:1;-webkit-transition:opacity 1s ease;-moz-transition:opacity 1s ease;-ms-transition:opacity 1s ease;-o-transition:opacity 1s ease;transition:opacity 1s ease}.cc-window.cc-invisible{opacity:0}.cc-animate.cc-revoke{-webkit-transition:transform 1s ease;-moz-transition:transform 1s ease;-ms-transition:transform 1s ease;-o-transition:transform 1s ease;transition:transform 1s ease}.cc-animate.cc-revoke.cc-top{transform:translateY(-2em)}.cc-animate.cc-revoke.cc-bottom{transform:translateY(2em)}.cc-animate.cc-revoke.cc-active.cc-top{transform:translateY(0)}.cc-animate.cc-revoke.cc-active.cc-bottom{transform:translateY(0)}.cc-revoke:hover{transform:translateY(0)}.cc-grower{max-height:0;overflow:hidden;-webkit-transition:max-height 1s;-moz-transition:max-height 1s;-ms-transition:max-height 1s;-o-transition:max-height 1s;transition:max-height 1s}.cc-window,.cc-revoke{position:fixed;overflow:hidden;box-sizing:border-box;font-family:Helvetica, Calibri, Arial, sans-serif;font-size:16px;line-height:1.5em;display:flex;flex-wrap:nowrap;z-index:9998}.cc-revoke{z-index:9999}.cc-window.cc-static{position:static}.cc-window.cc-floating{padding:2em;max-width:24em;flex-direction:column}.cc-window.cc-banner{padding:1em 1.8em;width:100%;flex-direction:row}.cc-revoke{padding:0.5em}.cc-revoke:hover{text-decoration:underline}.cc-header{font-size:18px;font-weight:bold}.cc-btn,.cc-link,.cc-close,.cc-revoke{cursor:pointer}.cc-link{opacity:0.8;display:inline-block;padding:0.2em;text-decoration:underline}.cc-link:hover{opacity:1}.cc-link:active,.cc-link:visited{color:initial}.cc-btn{display:block;padding:0.4em 0.8em;font-size:0.9em;font-weight:bold;border-width:2px;border-style:solid;text-align:center;white-space:nowrap}.cc-highlight .cc-btn:first-child{background-color:transparent;border-color:transparent}.cc-highlight .cc-btn:first-child:hover,.cc-highlight .cc-btn:first-child:focus{background-color:transparent;text-decoration:underline}.cc-close{display:block;position:absolute;top:0.5em;right:0.5em;font-size:1.6em;opacity:0.9;line-height:0.75}.cc-close:hover,.cc-close:focus{opacity:1}.cc-revoke.cc-top{top:0;left:3em;border-bottom-left-radius:0.5em;border-bottom-right-radius:0.5em}.cc-revoke.cc-bottom{bottom:0;left:3em;border-top-left-radius:0.5em;border-top-right-radius:0.5em}.cc-revoke.cc-left{left:3em;right:unset}.cc-revoke.cc-right{right:3em;left:unset}.cc-top{top:1em}.cc-left{left:1em}.cc-right{right:1em}.cc-bottom{bottom:1em}.cc-floating>.cc-link{margin-bottom:1em}.cc-floating .cc-message{display:block;margin-bottom:1em}.cc-window.cc-floating .cc-compliance{flex:1 0 auto}.cc-window.cc-banner{align-items:center}.cc-banner.cc-top{left:0;right:0;top:0}.cc-banner.cc-bottom{left:0;right:0;bottom:0}.cc-banner .cc-message{display:block;flex:1 1 auto;max-width:100%;margin-right:1em}.cc-compliance{display:flex;align-items:center;justify-content:space-between}.cc-floating .cc-compliance>.cc-btn{flex:1}.cc-btn+.cc-btn{margin-left:0.5em}.cc-window.cc-type-categories{display:inline-flex;flex-direction:column;overflow:visible}.cc-window.cc-type-categories .form{text-align:right}.cc-window.cc-type-categories .cc-btn{margin:0}.cc-window.cc-type-categories .cc-btn.cc-save{margin:0;display:inline-block}.cc-categories{display:inline-flex}.cc-categories .cc-category{display:flex;max-width:100%;margin:0 2px;position:relative}.cc-categories .cc-btn{border-right:none;outline:none;text-transform:capitalize}.cc-categories .cc-btn input[type=checkbox]{float:left;height:26px;width:calc( 100% - 22px);display:block;position:absolute;top:0;left:2px;cursor:pointer}.cc-categories .cc-btn:not(.cc-info):not(.cc-save){padding-left:26px}.cc-categories .cc-info{border-left:none;border-right:2px solid lightgrey;padding:4px;font-variant:all-small-caps}.cc-categories .cc-info:focus+.cc-tooltip{display:block}.cc-categories .cc-tooltip{display:none;position:absolute;z-index:3;width:190px;bottom:46px;padding:8px;border:thin solid lightgrey;box-shadow:1px 1px 4px rgba(150,150,150,0.7)}.cc-categories .cc-tooltip:after{content:\"\";width:10px;height:10px;transform:rotate(45deg);position:absolute;bottom:-7px;left:10px;box-shadow:2px 1px 1px rgba(200,200,200,0.5)}.cc-categories .cc-tooltip p{margin:0}@media print{.cc-window,.cc-revoke{display:none}}@media screen and (max-width: 900px){.cc-btn{white-space:normal}}@media screen and (max-width: 414px) and (orientation: portrait), screen and (max-width: 736px) and (orientation: landscape){.cc-window.cc-top{top:0}.cc-window.cc-bottom{bottom:0}.cc-window.cc-banner,.cc-window.cc-floating,.cc-window.cc-right,.cc-window.cc-left{left:0;right:0}.cc-window.cc-banner{flex-direction:column;align-items:unset}.cc-window.cc-banner .cc-compliance{flex:1 1 auto}.cc-window.cc-banner .cc-message{margin-right:0;margin-bottom:1em}.cc-window.cc-floating{max-width:none}.cc-window.cc-type-categories{flex-direction:column}.cc-window .cc-message{margin-bottom:1em}.cc-window .cc-categories{flex-direction:column;width:100%;margin-right:8px}.cc-window .cc-category{margin:4px 0}.cc-window .cc-category .cc-btn:not(.cc-info){width:calc( 100% - 16px);min-width:140px}}@media screen and (max-width: 854px){.cc-window.cc-type-categories .cc-btn.cc-save{margin:8px 0}}@media screen and (max-width: 790px){.cc-window.cc-type-categories .cc-categories{display:flex;flex-direction:column}.cc-categories .cc-category{margin:4px 0}.form{width:100%;max-width:350px}.cc-btn:not(.cc-info):not(.cc-save){width:calc( 100% - 16px)}}.cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;flex:none}.cc-theme-classic{overflow:visible;justify-content:space-between}.cc-theme-classic .cc-btn{position:relative;border-radius:5px;outline:none}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-theme-classic .cc-category .cc-btn{border-radius:5px 0 0 5px;padding-right:2px;padding-left:28px;font-weight:normal;border-right:none;box-sizing:border-box}.cc-theme-classic .cc-category .cc-btn input[type=checkbox]{position:absolute;left:0;top:-1px;width:100%;height:26px;opacity:0;cursor:pointer;z-index:1}.cc-theme-classic .cc-category .cc-btn input[type=checkbox]+.cc-btn-checkbox{display:block;font-size:2rem;position:absolute;top:2px;left:6px;z-index:0;outline:none}.cc-theme-classic .cc-category .cc-btn input[type=checkbox]+.cc-btn-checkbox:before{content:\"\\\\1F5F5\"}.cc-theme-classic .cc-category .cc-btn input[type=checkbox]:checked+.cc-btn-checkbox:after{content:\"\\\\2713\";position:absolute;top:-4px;left:0;font-size:2.3rem;text-shadow:0 1px 3px rgba(150,150,150,0.5)}.cc-theme-classic .cc-category .cc-btn.cc-info{margin:0;padding:0 4px;border-radius:0 5px 5px 0}.cc-theme-classic .cc-category .cc-btn:last-child{min-width:0}.cc-theme-classic .cc-category .cc-tooltip{border-radius:5px}.cc-theme-classic .cc-category .cc-tooltip:after{border-bottom:thin solid lightgrey;border-right:thin solid lightgrey}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block}.cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em;margin-bottom:1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:0.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0}.cc-window.cc-theme-edgeless.cc-type-categories .cc-categories .cc-btn{padding:0.4em 0.8em;padding-left:26px}.cc-window.cc-theme-edgeless.cc-type-categories .cc-categories .cc-btn.cc-info{padding:0.4em 4px}.cc-window.cc-theme-edgeless.cc-type-categories .cc-categories .cc-tooltip{border:none}\\n', \"\"]);\n}, function (e) {\n \"use strict\";\n\n function t(e, t) {\n var n = e[1] || \"\",\n i = e[3];\n if (!i) return n;\n\n if (t && \"function\" == typeof btoa) {\n var o = function (e) {\n var t = btoa(unescape(encodeURIComponent(JSON.stringify(e)))),\n n = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(t);\n return \"/*# \".concat(n, \" */\");\n }(i),\n c = i.sources.map(function (e) {\n return \"/*# sourceURL=\".concat(i.sourceRoot).concat(e, \" */\");\n });\n\n return [n].concat(c).concat([o]).join(\"\\n\");\n }\n\n return [n].join(\"\\n\");\n }\n\n e.exports = function (e) {\n var n = [];\n return n.toString = function () {\n return this.map(function (n) {\n var i = t(n, e);\n return n[2] ? \"@media \".concat(n[2], \"{\").concat(i, \"}\") : i;\n }).join(\"\");\n }, n.i = function (e, t) {\n \"string\" == typeof e && (e = [[null, e, \"\"]]);\n\n for (var i, o = {}, c = 0; c < this.length; c++) {\n null != (i = this[c][0]) && (o[i] = !0);\n }\n\n for (var s, r = 0; r < e.length; r++) {\n null != (s = e[r])[0] && o[s[0]] || (t && !s[2] ? s[2] = t : t && (s[2] = \"(\".concat(s[2], \") and (\").concat(t, \")\")), n.push(s));\n }\n }, n;\n };\n}, function (e, t, n) {\n function i(e, t) {\n for (var n = 0; n < e.length; n++) {\n var i = e[n],\n o = h[i.id];\n\n if (o) {\n o.refs++;\n\n for (var c = 0; c < o.parts.length; c++) {\n o.parts[c](i.parts[c]);\n }\n\n for (; c < i.parts.length; c++) {\n o.parts.push(d(i.parts[c], t));\n }\n } else {\n var s = [];\n\n for (c = 0; c < i.parts.length; c++) {\n s.push(d(i.parts[c], t));\n }\n\n h[i.id] = {\n id: i.id,\n refs: 1,\n parts: s\n };\n }\n }\n }\n\n function o(e, t) {\n for (var n = [], i = {}, o = 0; o < e.length; o++) {\n var c = e[o],\n s = t.base ? c[0] + t.base : c[0],\n r = {\n css: c[1],\n media: c[2],\n sourceMap: c[3]\n };\n i[s] ? i[s].parts.push(r) : n.push(i[s] = {\n id: s,\n parts: [r]\n });\n }\n\n return n;\n }\n\n function c(e, t) {\n var n = m(e.insertInto);\n if (!n) throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n var i = v[v.length - 1];\n if (\"top\" === e.insertAt) i ? i.nextSibling ? n.insertBefore(t, i.nextSibling) : n.appendChild(t) : n.insertBefore(t, n.firstChild), v.push(t);else if (\"bottom\" === e.insertAt) n.appendChild(t);else {\n if (\"object\" != _typeof(e.insertAt) || !e.insertAt.before) throw new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n var o = m(e.insertAt.before, n);\n n.insertBefore(t, o);\n }\n }\n\n function s(e) {\n if (null === e.parentNode) return !1;\n e.parentNode.removeChild(e);\n var t = v.indexOf(e);\n 0 <= t && v.splice(t, 1);\n }\n\n function r(e) {\n var t = document.createElement(\"style\");\n\n if (void 0 === e.attrs.type && (e.attrs.type = \"text/css\"), void 0 === e.attrs.nonce) {\n var n = u();\n n && (e.attrs.nonce = n);\n }\n\n return l(t, e.attrs), c(e, t), t;\n }\n\n function a(e) {\n var t = document.createElement(\"link\");\n return void 0 === e.attrs.type && (e.attrs.type = \"text/css\"), e.attrs.rel = \"stylesheet\", l(t, e.attrs), c(e, t), t;\n }\n\n function l(e, t) {\n Object.keys(t).forEach(function (n) {\n e.setAttribute(n, t[n]);\n });\n }\n\n function u() {\n return n.nc;\n }\n\n function d(e, t) {\n var n, i, o, c;\n\n if (t.transform && e.css) {\n if (!(c = \"function\" == typeof t.transform ? t.transform(e.css) : t.transform[\"default\"](e.css))) return function () {};\n e.css = c;\n }\n\n if (t.singleton) {\n var l = g++;\n n = b || (b = r(t)), i = p.bind(null, n, l, !1), o = p.bind(null, n, l, !0);\n } else e.sourceMap && \"function\" == typeof URL && \"function\" == typeof URL.createObjectURL && \"function\" == typeof URL.revokeObjectURL && \"function\" == typeof Blob && \"function\" == typeof btoa ? (n = a(t), i = function (e, t, n) {\n var i = n.css,\n o = n.sourceMap,\n c = void 0 === t.convertToAbsoluteUrls && o;\n (t.convertToAbsoluteUrls || c) && (i = y(i)), o && (i += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(o)))) + \" */\");\n var s = new Blob([i], {\n type: \"text/css\"\n }),\n r = e.href;\n e.href = URL.createObjectURL(s), r && URL.revokeObjectURL(r);\n }.bind(null, n, t), o = function o() {\n s(n), n.href && URL.revokeObjectURL(n.href);\n }) : (n = r(t), i = function (e, t) {\n var n = t.css,\n i = t.media;\n if (i && e.setAttribute(\"media\", i), e.styleSheet) e.styleSheet.cssText = n;else {\n for (; e.firstChild;) {\n e.removeChild(e.firstChild);\n }\n\n e.appendChild(document.createTextNode(n));\n }\n }.bind(null, n), o = function o() {\n s(n);\n });\n\n return i(e), function (t) {\n if (t) {\n if (t.css === e.css && t.media === e.media && t.sourceMap === e.sourceMap) return;\n i(e = t);\n } else o();\n };\n }\n\n function p(e, t, n, i) {\n var o = n ? \"\" : i.css;\n if (e.styleSheet) e.styleSheet.cssText = w(t, o);else {\n var c = document.createTextNode(o),\n s = e.childNodes;\n s[t] && e.removeChild(s[t]), s.length ? e.insertBefore(c, s[t]) : e.appendChild(c);\n }\n }\n\n var h = {},\n f = function (e) {\n var t;\n return function () {\n return void 0 === t && (t = e.apply(this, arguments)), t;\n };\n }(function () {\n return window && document && document.all && !window.atob;\n }),\n m = function () {\n var e = {};\n return function (t, n) {\n if (\"function\" == typeof t) return t();\n\n if (void 0 === e[t]) {\n var i = function (e, t) {\n return t ? t.querySelector(e) : document.querySelector(e);\n }.call(this, t, n);\n\n if (window.HTMLIFrameElement && i instanceof window.HTMLIFrameElement) try {\n i = i.contentDocument.head;\n } catch (t) {\n i = null;\n }\n e[t] = i;\n }\n\n return e[t];\n };\n }(),\n b = null,\n g = 0,\n v = [],\n y = n(10);\n\n e.exports = function (e, t) {\n if (\"undefined\" != typeof DEBUG && DEBUG && \"object\" != (typeof document === \"undefined\" ? \"undefined\" : _typeof(document))) throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n (t = t || {}).attrs = \"object\" == _typeof(t.attrs) ? t.attrs : {}, t.singleton || \"boolean\" == typeof t.singleton || (t.singleton = f()), t.insertInto || (t.insertInto = \"head\"), t.insertAt || (t.insertAt = \"bottom\");\n var n = o(e, t);\n return i(n, t), function (e) {\n for (var c = [], s = 0; s < n.length; s++) {\n var r = n[s];\n (a = h[r.id]).refs--, c.push(a);\n }\n\n e && i(o(e, t), t);\n var a;\n\n for (s = 0; s < c.length; s++) {\n if (0 === (a = c[s]).refs) {\n for (var l = 0; l < a.parts.length; l++) {\n a.parts[l]();\n }\n\n delete h[a.id];\n }\n }\n };\n };\n\n var w = function () {\n var e = [];\n return function (t, n) {\n return e[t] = n, e.filter(Boolean).join(\"\\n\");\n };\n }();\n}, function (e) {\n e.exports = function (e) {\n var t = \"undefined\" != typeof window && window.location;\n if (!t) throw new Error(\"fixUrls requires window.location\");\n if (!e || \"string\" != typeof e) return e;\n var n = t.protocol + \"//\" + t.host,\n i = n + t.pathname.replace(/\\/[^\\/]*$/, \"/\");\n return e.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function (e, t) {\n var o,\n c = t.trim().replace(/^\"(.*)\"$/, function (e, t) {\n return t;\n }).replace(/^'(.*)'$/, function (e, t) {\n return t;\n });\n return /^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(c) ? e : (o = 0 === c.indexOf(\"//\") ? c : 0 === c.indexOf(\"/\") ? n + c : i + c.replace(/^\\.\\//, \"\"), \"url(\" + JSON.stringify(o) + \")\");\n });\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return l;\n });\n var i = n(0),\n o = n(17),\n c = n(19),\n s = n(21),\n r = n(2),\n a = n(1);\n\n var l = /*#__PURE__*/function (_i$a) {\n _inherits(l, _i$a);\n\n var _super = _createSuper(l);\n\n function l() {\n var _this;\n\n var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, l);\n\n _this = _super.call(this, e);\n var t = r.a.map(function (e) {\n var t = _this.options.cookie && _this.options.cookie.name ? _this.options.cookie.name : \"cookieconsent_status_\",\n n = Object(a.b)(t + e);\n return Object(a.h)(n) ? _defineProperty({}, e, n) : void 0;\n }).filter(function (e) {\n return !!e && e[Object.keys(e)[0]];\n });\n 0 < t.length ? setTimeout(function () {\n return _this.emit(\"initialized\", t);\n }) : _this.options.legal && _this.options.legal.countryCode ? _this.initializationComplete({\n code: _this.options.legal.countryCode\n }) : _this.options.location ? new c.a(_this.options.location).locate(_this.initializationComplete.bind(_assertThisInitialized(_this)), _this.initializationError.bind(_assertThisInitialized(_this))) : _this.initializationComplete({});\n return _this;\n }\n\n _createClass(l, [{\n key: \"initializationComplete\",\n value: function initializationComplete(e) {\n var _this2 = this;\n\n e.code && (this.options = new o.a(this.options.legal).applyLaw(this.options, e.code)), this.popup = new s.a(this.options), setTimeout(function () {\n return _this2.emit(\"initialized\", _this2.popup);\n }, 0);\n }\n }, {\n key: \"initializationError\",\n value: function initializationError(e) {\n var _this3 = this;\n\n setTimeout(function () {\n return _this3.emit(\"error\", e, new s.a(_this3.options));\n }, 0);\n }\n }, {\n key: \"getCountryLaws\",\n value: function getCountryLaws(e) {\n return new o.a(this.options.legal).get(e);\n }\n }, {\n key: \"isOpen\",\n value: function isOpen() {\n return this.popup.isOpen();\n }\n }, {\n key: \"close\",\n value: function close() {\n return this.popup.close(), this;\n }\n }, {\n key: \"revokeChoice\",\n value: function revokeChoice() {\n return this.popup.revokeChoice(), this;\n }\n }, {\n key: \"open\",\n value: function open() {\n return this.popup.open(), this;\n }\n }, {\n key: \"toggleRevokeButton\",\n value: function toggleRevokeButton(e) {\n return this.popup.toggleRevokeButton(e), this;\n }\n }, {\n key: \"setStatuses\",\n value: function setStatuses(e) {\n return this.popup.setStatuses(e), this;\n }\n }, {\n key: \"clearStatuses\",\n value: function clearStatuses() {\n return this.popup.clearStatuses(), this;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n return this.popup.destroy(), this;\n }\n }]);\n\n return l;\n }(i.a);\n\n r.e.reduce(function (e, t) {\n return Object.defineProperty(l, t, {\n get: function get() {\n return t;\n },\n set: function set() {},\n enumerable: !1,\n writeable: !1,\n configurable: !1\n }), e;\n }, l);\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return i;\n }), n.d(t, \"b\", function () {\n return o;\n });\n\n var i = function i(e) {\n var t = (\" \" + document.cookie).split(\" \" + e + \"=\");\n return 2 > t.length ? void 0 : t.pop().split(\";\").shift();\n },\n o = function o(e, t, n, i, _o, c) {\n var s = new Date();\n s.setHours(s.getHours() + 24 * (\"number\" == typeof n ? n : 365)), document.cookie = e + \"=\" + t + \";expires=\" + s.toUTCString() + \";path=\" + (_o || \"/\") + (i ? \";domain=\" + i : \"\") + (c ? \";secure\" : \"\");\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"b\", function () {\n return o;\n }), n.d(t, \"a\", function () {\n return c;\n });\n var i = n(3);\n\n var o = function o(e, t) {\n return e && e.parentNode ? e.classList.contains(t) ? e : o(e.parentNode, t) : null;\n },\n c = function c(e, t, n) {\n var o = {},\n c = t.popup,\n s = t.button,\n r = t.highlight,\n a = t.saveButton;\n c && (c.text = c.text ? c.text : Object(i.a)(c.background), c.link = c.link ? c.link : c.text, o[n + \" .cc-tooltip, \" + n + \" .cc-tooltip:after\"] = [\"color: \" + c.text, \"background-color: \" + c.background], o[n + \".cc-window\"] = [\"color: \" + c.text, \"background-color: \" + c.background], o[n + \".cc-revoke\"] = [\"color: \" + c.text, \"background-color: \" + c.background], o[n + \" .cc-link,\" + n + \" .cc-link:active,\" + n + \" .cc-link:visited\"] = [\"color: \" + c.link], s && (s.text = s.text ? s.text : Object(i.a)(s.background), s.border = s.border ? s.border : \"transparent\", o[n + \" .cc-btn\"] = [\"color: \" + s.text, \"border-color: \" + s.border, \"background-color: \" + s.background], s.padding && o[n + \" .cc-btn\"].push(\"padding: \" + s.padding), \"transparent\" != s.background && (o[n + \" .cc-btn:hover, \" + n + \" .cc-btn:focus\"] = [\"background-color: \" + (s.hover || Object(i.b)(s.background))]), r ? (r.text = r.text ? r.text : Object(i.a)(r.background), r.border = r.border ? r.border : \"transparent\", o[n + \" .cc-highlight .cc-btn:first-child\"] = [\"color: \" + r.text, \"border-color: \" + r.border, \"background-color: \" + r.background]) : o[n + \" .cc-highlight .cc-btn:first-child\"] = [\"color: \" + c.text]), a && (o[\"\".concat(n, \" .cc-btn.cc-save\")] = [\"color: \" + a.text, \"border-color: \" + a.border, \"background-color: \" + a.background]));\n var l = document.createElement(\"style\");\n return l.id = e, document.head.appendChild(l), Object.entries(o).forEach(function (_ref4, n) {\n var _ref5 = _slicedToArray(_ref4, 2),\n e = _ref5[0],\n t = _ref5[1];\n\n return l.sheet.insertRule(\"\".concat(e, \"{\").concat(t.join(\";\"), \"}\"), n);\n }), l;\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"c\", function () {\n return o;\n }), n.d(t, \"a\", function () {\n return c;\n }), n.d(t, \"b\", function () {\n return s;\n });\n var i = n(2);\n\n var o = function o(e) {\n return 0 <= i.e.indexOf(e);\n },\n c = function c() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n },\n s = function s(e) {\n return \"object\" == _typeof(e) && null !== e && e.constructor == Object;\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return i;\n }), n.d(t, \"b\", function () {\n return o;\n });\n\n var i = function i(e, t, n) {\n var i;\n var o = document.createElement(\"script\");\n o.type = \"text/\" + (e.type || \"javascript\"), o.src = e.src || e, o.async = !1, o.onreadystatechange = s.onload = function () {\n var e = o.readyState;\n clearTimeout(i), t.done || e && !/loaded|complete/.test(e) || (t.done = !0, t(), o.onreadystatechange = o.onload = null);\n }, document.body.appendChild(o), i = setTimeout(function () {\n t.done = !0, t(), o.onreadystatechange = o.onload = null;\n }, n);\n },\n o = function o(e, t, n, i, _o2) {\n var c = new (window.XMLHttpRequest || window.ActiveXObject)(\"MSXML2.XMLHTTP.3.0\");\n if (c.open(i ? \"POST\" : \"GET\", e, 1), c.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\"), Array.isArray(_o2)) for (var _e2 = 0, _t = _o2.length; _e2 < _t; ++_e2) {\n var _t2 = _o2[_e2].split(\":\", 2);\n\n c.setRequestHeader(_t2[0].replace(/^\\s+|\\s+$/g, \"\"), _t2[1].replace(/^\\s+|\\s+$/g, \"\"));\n }\n \"function\" == typeof t && (c.onreadystatechange = function () {\n 3 < c.readyState && t(c);\n }), c.send(i);\n };\n}, function (e) {\n \"use strict\";\n\n function t() {\n t.init.call(this);\n }\n\n function n(e) {\n return void 0 === e._maxListeners ? t.defaultMaxListeners : e._maxListeners;\n }\n\n function i(e, t, i, o) {\n var c, s, r;\n if (\"function\" != typeof i) throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + _typeof(i));\n if (void 0 === (s = e._events) ? (s = e._events = Object.create(null), e._eventsCount = 0) : (void 0 !== s.newListener && (e.emit(\"newListener\", t, i.listener ? i.listener : i), s = e._events), r = s[t]), void 0 === r) r = s[t] = i, ++e._eventsCount;else if (\"function\" == typeof r ? r = s[t] = o ? [i, r] : [r, i] : o ? r.unshift(i) : r.push(i), 0 < (c = n(e)) && r.length > c && !r.warned) {\n r.warned = !0;\n var a = new Error(\"Possible EventEmitter memory leak detected. \" + r.length + \" \" + t + \" listeners added. Use emitter.setMaxListeners() to increase limit\");\n a.name = \"MaxListenersExceededWarning\", a.emitter = e, a.type = t, a.count = r.length, console;\n }\n return e;\n }\n\n function o(e, t, n) {\n var i = {\n fired: !1,\n wrapFn: void 0,\n target: e,\n type: t,\n listener: n\n },\n o = function () {\n for (var e = [], t = 0; t < arguments.length; t++) {\n e.push(arguments[t]);\n }\n\n this.fired || (this.target.removeListener(this.type, this.wrapFn), this.fired = !0, u(this.listener, this.target, e));\n }.bind(i);\n\n return o.listener = n, i.wrapFn = o, o;\n }\n\n function c(e, t, n) {\n var i = e._events;\n if (void 0 === i) return [];\n var o = i[t];\n return void 0 === o ? [] : \"function\" == typeof o ? n ? [o.listener || o] : [o] : n ? function (e) {\n for (var t = Array(e.length), n = 0; n < t.length; ++n) {\n t[n] = e[n].listener || e[n];\n }\n\n return t;\n }(o) : r(o, o.length);\n }\n\n function s(e) {\n var t = this._events;\n\n if (void 0 !== t) {\n var n = t[e];\n if (\"function\" == typeof n) return 1;\n if (void 0 !== n) return n.length;\n }\n\n return 0;\n }\n\n function r(e, t) {\n for (var n = Array(t), i = 0; i < t; ++i) {\n n[i] = e[i];\n }\n\n return n;\n }\n\n var a,\n l = \"object\" == (typeof Reflect === \"undefined\" ? \"undefined\" : _typeof(Reflect)) ? Reflect : null,\n u = l && \"function\" == typeof l.apply ? l.apply : function (e, t, n) {\n return Function.prototype.apply.call(e, t, n);\n };\n a = l && \"function\" == typeof l.ownKeys ? l.ownKeys : Object.getOwnPropertySymbols ? function (e) {\n return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e));\n } : function (e) {\n return Object.getOwnPropertyNames(e);\n };\n\n var d = Number.isNaN || function (e) {\n return e != e;\n };\n\n e.exports = t, t.EventEmitter = t, t.prototype._events = void 0, t.prototype._eventsCount = 0, t.prototype._maxListeners = void 0;\n var p = 10;\n Object.defineProperty(t, \"defaultMaxListeners\", {\n enumerable: !0,\n get: function get() {\n return p;\n },\n set: function set(e) {\n if (\"number\" != typeof e || 0 > e || d(e)) throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + e + \".\");\n p = e;\n }\n }), t.init = function () {\n (void 0 === this._events || this._events === Object.getPrototypeOf(this)._events) && (this._events = Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;\n }, t.prototype.setMaxListeners = function (e) {\n if (\"number\" != typeof e || 0 > e || d(e)) throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + e + \".\");\n return this._maxListeners = e, this;\n }, t.prototype.getMaxListeners = function () {\n return n(this);\n }, t.prototype.emit = function (e) {\n for (var t = [], n = 1; n < arguments.length; n++) {\n t.push(arguments[n]);\n }\n\n var i = \"error\" === e,\n o = this._events;\n if (void 0 !== o) i = i && void 0 === o.error;else if (!i) return !1;\n\n if (i) {\n var c;\n if (0 < t.length && (c = t[0]), c instanceof Error) throw c;\n var s = new Error(\"Unhandled error.\" + (c ? \" (\" + c.message + \")\" : \"\"));\n throw s.context = c, s;\n }\n\n var a = o[e];\n if (void 0 === a) return !1;\n if (\"function\" == typeof a) u(a, this, t);else {\n var l = a.length,\n d = r(a, l);\n\n for (n = 0; n < l; ++n) {\n u(d[n], this, t);\n }\n }\n return !0;\n }, t.prototype.addListener = function (e, t) {\n return i(this, e, t, !1);\n }, t.prototype.on = t.prototype.addListener, t.prototype.prependListener = function (e, t) {\n return i(this, e, t, !0);\n }, t.prototype.once = function (e, t) {\n if (\"function\" != typeof t) throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + _typeof(t));\n return this.on(e, o(this, e, t)), this;\n }, t.prototype.prependOnceListener = function (e, t) {\n if (\"function\" != typeof t) throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + _typeof(t));\n return this.prependListener(e, o(this, e, t)), this;\n }, t.prototype.removeListener = function (e, t) {\n var n, i, o, c, s;\n if (\"function\" != typeof t) throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + _typeof(t));\n if (void 0 === (i = this._events)) return this;\n if (void 0 === (n = i[e])) return this;\n if (n === t || n.listener === t) 0 == --this._eventsCount ? this._events = Object.create(null) : (delete i[e], i.removeListener && this.emit(\"removeListener\", e, n.listener || t));else if (\"function\" != typeof n) {\n for (o = -1, c = n.length - 1; 0 <= c; c--) {\n if (n[c] === t || n[c].listener === t) {\n s = n[c].listener, o = c;\n break;\n }\n }\n\n if (0 > o) return this;\n 0 === o ? n.shift() : function (e, t) {\n for (; t + 1 < e.length; t++) {\n e[t] = e[t + 1];\n }\n\n e.pop();\n }(n, o), 1 === n.length && (i[e] = n[0]), void 0 !== i.removeListener && this.emit(\"removeListener\", e, s || t);\n }\n return this;\n }, t.prototype.off = t.prototype.removeListener, t.prototype.removeAllListeners = function (e) {\n var t, n, i;\n if (void 0 === (n = this._events)) return this;\n if (void 0 === n.removeListener) return 0 === arguments.length ? (this._events = Object.create(null), this._eventsCount = 0) : void 0 !== n[e] && (0 == --this._eventsCount ? this._events = Object.create(null) : delete n[e]), this;\n\n if (0 === arguments.length) {\n var o,\n c = Object.keys(n);\n\n for (i = 0; i < c.length; ++i) {\n \"removeListener\" === (o = c[i]) || this.removeAllListeners(o);\n }\n\n return this.removeAllListeners(\"removeListener\"), this._events = Object.create(null), this._eventsCount = 0, this;\n }\n\n if (\"function\" == typeof (t = n[e])) this.removeListener(e, t);else if (void 0 !== t) for (i = t.length - 1; 0 <= i; i--) {\n this.removeListener(e, t[i]);\n }\n return this;\n }, t.prototype.listeners = function (e) {\n return c(this, e, !0);\n }, t.prototype.rawListeners = function (e) {\n return c(this, e, !1);\n }, t.listenerCount = function (e, t) {\n return \"function\" == typeof e.listenerCount ? e.listenerCount(t) : s.call(e, t);\n }, t.prototype.listenerCount = s, t.prototype.eventNames = function () {\n return 0 < this._eventsCount ? a(this._events) : [];\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return c;\n });\n var i = n(0),\n o = n(18);\n\n var c = /*#__PURE__*/function (_i$a2) {\n _inherits(c, _i$a2);\n\n var _super2 = _createSuper(c);\n\n function c() {\n var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, c);\n\n return _super2.call(this, o.a, e);\n }\n\n _createClass(c, [{\n key: \"get\",\n value: function get(e) {\n return {\n hasLaw: 0 <= this.options.hasLaw.indexOf(e),\n revokable: 0 <= this.options.revokable.indexOf(e),\n explicitAction: 0 <= this.options.explicitAction.indexOf(e)\n };\n }\n }, {\n key: \"applyLaw\",\n value: function applyLaw(e, t) {\n var n = this.get(t);\n return n.hasLaw || (e.enabled = !1, this.emit(\"noCookieLaw\", t, n)), this.options.regionalLaw && (n.revokable && (e.revokable = !0), n.explicitAction && (e.dismissOnScroll = !1, e.dismissOnTimeout = !1)), e;\n }\n }]);\n\n return c;\n }(i.a);\n}, function (e, t) {\n \"use strict\";\n\n t.a = {\n regionalLaw: !0,\n hasLaw: [\"AT\", \"BE\", \"BG\", \"HR\", \"CZ\", \"CY\", \"DK\", \"EE\", \"FI\", \"FR\", \"DE\", \"EL\", \"HU\", \"IE\", \"IT\", \"LV\", \"LT\", \"LU\", \"MT\", \"NL\", \"NO\", \"PL\", \"PT\", \"SK\", \"ES\", \"SE\", \"GB\", \"UK\", \"GR\", \"EU\", \"RO\"],\n revokable: [\"HR\", \"CY\", \"DK\", \"EE\", \"FR\", \"DE\", \"LV\", \"LT\", \"NL\", \"NO\", \"PT\", \"ES\"],\n explicitAction: [\"HR\", \"IT\", \"ES\", \"NO\"]\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return s;\n });\n var i = n(0),\n o = n(20),\n c = n(1);\n\n var s = /*#__PURE__*/function (_i$a3) {\n _inherits(s, _i$a3);\n\n var _super3 = _createSuper(s);\n\n function s(e) {\n var _this4;\n\n _classCallCheck(this, s);\n\n _this4 = _super3.call(this, o.a, e), _this4.currentServiceIndex = -1;\n return _this4;\n }\n\n _createClass(s, [{\n key: \"getNextService\",\n value: function getNextService() {\n var e;\n\n do {\n e = this.getServiceByIdx(++this.currentServiceIndex);\n } while (this.currentServiceIndex < this.options.services.length && !e);\n\n return e;\n }\n }, {\n key: \"getServiceByIdx\",\n value: function getServiceByIdx(e) {\n var t = this.options.services[e];\n\n if (\"function\" == typeof t) {\n var _e3 = t();\n\n return _e3.name ? Object.assign({}, _e3, this.options.serviceDefinitions[_e3.name](_e3)) : _e3;\n }\n\n return \"string\" == typeof t ? this.options.serviceDefinitions[t]() : Object(c.g)(t) ? this.options.serviceDefinitions[t.name](t) : null;\n }\n }, {\n key: \"locate\",\n value: function locate(e, t) {\n var n = this.getNextService();\n return n ? (this.callbackComplete = e, this.callbackError = t, void this.runService(n, this.runNextServiceOnError.bind(this))) : void t(new Error(\"No services to run\"));\n }\n }, {\n key: \"setupUrl\",\n value: function setupUrl(e) {\n var t = this.getCurrentServiceOpts();\n return e.url.replace(/\\{(.*?)\\}/g, function (n, i) {\n if (\"callback\" === i) {\n var _t3 = \"callback\" + Date.now();\n\n return window[_t3] = function (t) {\n e.__JSONP_DATA = JSON.stringify(t);\n }, _t3;\n }\n\n return i in t.interpolateUrl ? t.interpolateUrl[i] : void 0;\n });\n }\n }, {\n key: \"runService\",\n value: function runService(e, t) {\n var _this5 = this;\n\n if (e && e.url && e.callback) {\n (e.isScript ? c.c : c.i)(this.setupUrl(e), function (n) {\n var i = n ? n.responseText : \"\";\n e.__JSONP_DATA && (i = e.__JSONP_DATA, delete e.__JSONP_DATA), _this5.runServiceCallback.call(_this5, t, e, i);\n }, this.options.timeout, e.data, e.headers);\n }\n }\n }, {\n key: \"runServiceCallback\",\n value: function runServiceCallback(e, t, n) {\n var _this6 = this;\n\n var i = t.callback(function (t) {\n i || _this6.onServiceResult(e, t);\n }, n);\n i && this.onServiceResult(e, i);\n }\n }, {\n key: \"onServiceResult\",\n value: function onServiceResult(e, t) {\n t instanceof Error || t && t.error ? e.call(this, t, null) : e.call(this, null, t);\n }\n }, {\n key: \"runNextServiceOnError\",\n value: function runNextServiceOnError(e, t) {\n if (e) {\n this.logError(e);\n\n var _t4 = this.getNextService();\n\n _t4 ? this.runService(_t4, this.runNextServiceOnError.bind(this)) : this.completeService.call(this, this.callbackError, new Error(\"All services failed\"));\n } else this.completeService.call(this, this.callbackComplete, t);\n }\n }, {\n key: \"getCurrentServiceOpts\",\n value: function getCurrentServiceOpts() {\n var e = this.options.services[this.currentServiceIndex];\n return \"string\" == typeof e ? {\n name: e\n } : \"function\" == typeof e ? e() : Object(c.g)(e) ? e : {};\n }\n }, {\n key: \"completeService\",\n value: function completeService(e, t) {\n this.currentServiceIndex = -1, e && e(t);\n }\n }, {\n key: \"logError\",\n value: function logError() {}\n }]);\n\n return s;\n }(i.a);\n}, function (e, t) {\n \"use strict\";\n\n var n = function n(e) {\n return new Error(\"Error [\" + (e.code || \"UNKNOWN\") + \"]: \" + e.error);\n };\n\n t.a = {\n timeout: 5e3,\n services: [\"ipinfo\"],\n serviceDefinitions: {\n ipinfo: function ipinfo() {\n return {\n url: \"//ipinfo.io\",\n headers: [\"Accept: application/json\"],\n callback: function callback(e, t) {\n try {\n var i = JSON.parse(t);\n return i.error ? n(i) : {\n code: i.country\n };\n } catch (e) {\n return n({\n error: \"Invalid response (\" + e + \")\"\n });\n }\n }\n };\n },\n ipinfodb: function ipinfodb() {\n return {\n url: \"//api.ipinfodb.com/v3/ip-country/?key={api_key}&format=json&callback={callback}\",\n isScript: !0,\n callback: function callback(e, t) {\n try {\n var i = JSON.parse(t);\n return \"ERROR\" == i.statusCode ? n({\n error: i.statusMessage\n }) : {\n code: i.countryCode\n };\n } catch (e) {\n return n({\n error: \"Invalid response (\" + e + \")\"\n });\n }\n }\n };\n },\n maxmind: function maxmind() {\n return {\n url: \"//js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js\",\n isScript: !0,\n callback: function callback(e) {\n return window.geoip2 ? void geoip2.country(function (t) {\n try {\n e({\n code: t.country.iso_code\n });\n } catch (t) {\n e(n(t));\n }\n }, function (t) {\n e(n(t));\n }) : void e(new Error(\"Unexpected response format. The downloaded script should have exported `geoip2` to the global scope\"));\n }\n };\n }\n }\n };\n}, function (e, t, n) {\n \"use strict\";\n\n n.d(t, \"a\", function () {\n return r;\n });\n var i = n(0),\n o = n(22),\n c = n(2),\n s = n(1);\n\n var r = /*#__PURE__*/function (_i$a4) {\n _inherits(r, _i$a4);\n\n var _super4 = _createSuper(r);\n\n function r(e) {\n var _this7;\n\n _classCallCheck(this, r);\n\n _this7 = _super4.call(this, o.a, e), _this7.userCategories = {\n UNCATEGORIZED: \"DISMISS\",\n ESSENTIAL: \"ALLOW\",\n PERSONALIZATION: \"DISMISS\",\n ANALYTICS: \"DISMISS\",\n MARKETING: \"DISMISS\"\n }, _this7.customStyles = {}, _this7.hasTransition = !!function () {\n var e = document.createElement(\"div\"),\n t = {\n t: \"transitionend\",\n OT: \"oTransitionEnd\",\n msT: \"MSTransitionEnd\",\n MozT: \"transitionend\",\n WebkitT: \"webkitTransitionEnd\"\n };\n\n for (var _n2 in t) {\n if (t.hasOwnProperty(_n2) && void 0 !== e.style[_n2 + \"ransition\"]) return t[_n2];\n }\n\n return \"\";\n }(), _this7.canUseCookies() && (_this7.options.enabled = !1), _this7.options.blacklistPage.includes(location.pathname) && (_this7.options.enabled = !1), _this7.options.whitelistPage.includes(location.pathname) && (_this7.options.enabled = !0);\n\n var t = _this7.options.window.replace(\"{{classes}}\", _this7.getPopupClasses().join(\" \")).replace(\"{{children}}\", _this7.getPopupInnerMarkup());\n\n var n = _this7.options.overrideHTML;\n\n if (\"string\" == typeof n && n.length && (t = n), _this7.options[\"static\"]) {\n var _e4 = _this7.appendMarkup(\"\".concat(t, \"
\"));\n\n _e4.style.display = \"\", _this7.element = _e4.firstChild, _this7.element.style.display = \"none\", _this7.element.classList.add(\"cc-invisible\");\n } else _this7.element = _this7.appendMarkup(t);\n\n _this7.applyAutoDismiss(), _this7.applyRevokeButton(), _this7.options.autoOpen && _this7.autoOpen();\n return _this7;\n }\n\n _createClass(r, [{\n key: \"open\",\n value: function open() {\n if (this.element) return this.isOpen() || (this.hasTransition ? this.fadeIn() : this.element.style.display = \"\", this.options.revokable && this.toggleRevokeButton(), this.emit(\"popupOpened\")), this;\n }\n }, {\n key: \"close\",\n value: function close(e) {\n if (this.element) return this.isOpen() && (this.hasTransition ? this.fadeOut() : this.element.style.display = \"none\", e && this.options.revokable && this.toggleRevokeButton(!0), this.emit(\"popupClosed\")), this;\n }\n }, {\n key: \"fadeIn\",\n value: function fadeIn() {\n var _this8 = this;\n\n var e = this.element;\n this.hasTransition && e && (this.afterTransition && this.afterFadeOut(e), e.classList.contains(\"cc-invisible\")) && (e.style.display = \"\", this.options[\"static\"] && (this.element.parentNode.style.maxHeight = this.element.clientHeight + \"px\"), this.openingTimeout = setTimeout(function () {\n return _this8.afterFadeIn(e);\n }, 20));\n }\n }, {\n key: \"afterFadeIn\",\n value: function afterFadeIn(e) {\n this.openingTimeout = null, e.classList.remove(\"cc-invisible\");\n }\n }, {\n key: \"fadeOut\",\n value: function fadeOut() {\n var _this9 = this;\n\n this.hasTransition && this.element && (this.openingTimeout && (clearTimeout(this.openingTimeout), this.afterFadeIn(this.element)), !this.element.classList.contains(\"cc-invisible\") && (this.options[\"static\"] && (this.element.parentNode.style.maxHeight = \"\"), this.afterTransition = function () {\n return _this9.afterFadeOut(_this9.element);\n }, this.element.addEventListener(this.transitionEnd, this.afterTransition), this.element.classList.add(\"cc-invisible\")));\n }\n }, {\n key: \"afterFadeOut\",\n value: function afterFadeOut(e) {\n e.style.display = \"none\", e.removeEventListener(this.transitionEnd, this.afterTransition), this.afterTransition = null;\n }\n }, {\n key: \"isOpen\",\n value: function isOpen() {\n return this.element && \"\" === this.element.style.display && (!this.hasTransition || !this.element.classList.contains(\"cc-invisible\"));\n }\n }, {\n key: \"toggleRevokeButton\",\n value: function toggleRevokeButton(e) {\n this.revokeBtn && (this.revokeBtn.style.display = e ? \"\" : \"none\");\n }\n }, {\n key: \"revokeChoice\",\n value: function revokeChoice(e) {\n this.options.enabled = !0, this.clearStatuses(), this.emit(\"revokeChoice\"), e || this.autoOpen();\n }\n }, {\n key: \"hasAnswered\",\n value: function hasAnswered() {\n return this.getStatuses().some(function (e) {\n return !!e;\n });\n }\n }, {\n key: \"hasConsented\",\n value: function hasConsented() {\n return this.getStatuses().map(function (e) {\n return e === c.b || e === c.d;\n });\n }\n }, {\n key: \"autoOpen\",\n value: function autoOpen() {\n var e = this.hasAnswered();\n !e && this.options.enabled ? this.open() : e && this.options.revokable && this.toggleRevokeButton(!0);\n }\n }, {\n key: \"setStatuses\",\n value: function setStatuses() {\n var _this10 = this,\n _arguments = arguments;\n\n var _this$options$cookie = this.options.cookie,\n e = _this$options$cookie.name,\n t = _this$options$cookie.expiryDays,\n n = _this$options$cookie.domain,\n i = _this$options$cookie.path,\n o = _this$options$cookie.secure,\n r = function r(_r, a) {\n if (Object(s.h)(a)) {\n var l = e + \"_\" + _r,\n u = 0 <= c.e.indexOf(Object(s.b)(l));\n Object(s.k)(l, a, t, n, i, o), _this10.emit(\"statusChanged\", l, a, u);\n } else _this10.clearStatuses();\n };\n\n 0 === arguments.length ? c.a.forEach(function (e) {\n return r(e, _this10.userCategories[e]);\n }) : 1 === arguments.length ? c.a.forEach(function (e) {\n return r(e, _arguments[0]);\n }) : 1 < arguments.length && arguments.forEach(function (e, t) {\n r(_this10.userCategories[t], e);\n });\n }\n }, {\n key: \"getStatuses\",\n value: function getStatuses() {\n var _this11 = this;\n\n return c.a.map(function (e) {\n return Object(s.b)(_this11.options.cookie.name + \"_\" + e);\n });\n }\n }, {\n key: \"clearStatuses\",\n value: function clearStatuses() {\n var _this$options$cookie2 = this.options.cookie,\n e = _this$options$cookie2.name,\n t = _this$options$cookie2.domain,\n n = _this$options$cookie2.path;\n c.a.forEach(function (i) {\n Object(s.k)(e + \"_\" + i, \"\", -1, t, n);\n });\n }\n }, {\n key: \"canUseCookies\",\n value: function canUseCookies() {\n var _this12 = this;\n\n if (!window.navigator.cookieEnabled || window.CookiesOK || window.navigator.CookiesOK) return !0;\n var e = this.getStatuses(),\n t = 0 < e.map(function (e, t) {\n return _defineProperty({}, c.a[t], Object(s.h)(e));\n }).filter(function (e) {\n return e[Object.keys(e)[0]];\n }).length;\n return e.forEach(function (e, t) {\n return _this12.userCategories[c.a[t]] === e ? e : _this12.userCategories[c.a[t]];\n }), t;\n }\n }, {\n key: \"getPositionClasses\",\n value: function getPositionClasses() {\n return this.options.position.split(\"-\").map(function (e) {\n return \"cc-\" + e;\n });\n }\n }, {\n key: \"getPopupClasses\",\n value: function getPopupClasses() {\n var e = this.options;\n var t = \"top\" == e.position || \"bottom\" == e.position ? \"banner\" : \"floating\";\n Object(s.f)() && e.mobileForceFloat && (t = \"floating\");\n var n = [\"cc-\" + t, \"cc-type-\" + e.type, \"cc-theme-\" + e.theme];\n return e[\"static\"] && n.push(\"cc-static\"), n.push.apply(n, this.getPositionClasses()), this.attachCustomPalette(this.options.palette), this.customStyleSelector && n.push(this.customStyleSelector), n;\n }\n }, {\n key: \"getPopupInnerMarkup\",\n value: function getPopupInnerMarkup() {\n var e = {},\n t = this.options;\n t.showLink || (t.elements.link = \"\", t.elements.messagelink = t.elements.message), Object.keys(t.elements).forEach(function (n) {\n e[n] = Object(s.e)(t.elements[n], function (e) {\n var n = t.content[e];\n return e && \"string\" == typeof n && n.length ? n : \"\";\n });\n });\n var n = t.compliance[t.type];\n n || (n = t.compliance.info), e.compliance = Object(s.e)(n, function (t) {\n return e[t];\n });\n var i = t.layouts[t.layout];\n return i || (i = t.layouts.basic), Object(s.e)(i, function (t) {\n return e[t];\n });\n }\n }, {\n key: \"appendMarkup\",\n value: function appendMarkup(e) {\n var _this13 = this;\n\n var t = this.options,\n n = document.createElement(\"div\"),\n i = t.container && 1 === t.container.nodeType ? t.container : document.body;\n n.innerHTML = e;\n var o = n.children[0];\n if (o.style.display = \"none\", o.classList.contains(\"cc-window\") && this.hasTransition && o.classList.add(\"cc-invisible\"), o.addEventListener(\"click\", function (e) {\n return _this13.handleButtonClick(e);\n }), o.querySelectorAll('.cc-btn [type=\"checkbox\"]').forEach(function (e) {\n e.addEventListener(\"change\", function () {\n _this13.userCategories[e.name] = e.checked ? \"ALLOW\" : \"DENY\";\n }), e.addEventListener(\"click\", function (e) {\n return e.stopPropagation();\n });\n }), o.querySelectorAll(\".cc-info\").forEach(function (e) {\n e.addEventListener(\"mousedown\", function (e) {\n this === document.activeElement && (this.blur(), e.preventDefault());\n });\n }), t.autoAttach) try {\n i.firstChild ? i.insertBefore(o, i.firstChild) : i.appendChild(o);\n } catch (e) {\n throw new Error(\"No container to attach too. Make sure the DOM has loaded. Is your script loaded just before the `