diff --git a/dist/engine.bundle.js b/dist/engine.bundle.js
index 26c0f85fe..89b6011ef 100644
--- a/dist/engine.bundle.js
+++ b/dist/engine.bundle.js
@@ -1,7388 +1,20 @@
-/******/ (function(modules) { // webpackBootstrap
-/******/ // install a JSONP callback for chunk loading
-/******/ function webpackJsonpCallback(data) {
-/******/ var chunkIds = data[0];
-/******/ var moreModules = data[1];
-/******/ var executeModules = data[2];
-/******/
-/******/ // add "moreModules" to the modules object,
-/******/ // then flag all "chunkIds" as loaded and fire callback
-/******/ var moduleId, chunkId, i = 0, resolves = [];
-/******/ for(;i < chunkIds.length; i++) {
-/******/ chunkId = chunkIds[i];
-/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
-/******/ resolves.push(installedChunks[chunkId][0]);
-/******/ }
-/******/ installedChunks[chunkId] = 0;
-/******/ }
-/******/ for(moduleId in moreModules) {
-/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
-/******/ modules[moduleId] = moreModules[moduleId];
-/******/ }
-/******/ }
-/******/ if(parentJsonpFunction) parentJsonpFunction(data);
-/******/
-/******/ while(resolves.length) {
-/******/ resolves.shift()();
-/******/ }
-/******/
-/******/ // add entry modules from loaded chunk to deferred list
-/******/ deferredModules.push.apply(deferredModules, executeModules || []);
-/******/
-/******/ // run deferred modules when all chunks ready
-/******/ return checkDeferredModules();
-/******/ };
-/******/ function checkDeferredModules() {
-/******/ var result;
-/******/ for(var i = 0; i < deferredModules.length; i++) {
-/******/ var deferredModule = deferredModules[i];
-/******/ var fulfilled = true;
-/******/ for(var j = 1; j < deferredModule.length; j++) {
-/******/ var depId = deferredModule[j];
-/******/ if(installedChunks[depId] !== 0) fulfilled = false;
-/******/ }
-/******/ if(fulfilled) {
-/******/ deferredModules.splice(i--, 1);
-/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
-/******/ }
-/******/ }
-/******/
-/******/ return result;
-/******/ }
-/******/
-/******/ // The module cache
-/******/ var installedModules = {};
-/******/
-/******/ // object to store loaded and loading chunks
-/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
-/******/ // Promise = chunk loading, 0 = chunk loaded
-/******/ var installedChunks = {
-/******/ 1: 0
-/******/ };
-/******/
-/******/ var deferredModules = [];
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/
-/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId]) {
-/******/ return installedModules[moduleId].exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = installedModules[moduleId] = {
-/******/ i: moduleId,
-/******/ l: false,
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ // Flag the module as loaded
-/******/ module.l = true;
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/******/
-/******/ // expose the modules object (__webpack_modules__)
-/******/ __webpack_require__.m = modules;
-/******/
-/******/ // expose the module cache
-/******/ __webpack_require__.c = installedModules;
-/******/
-/******/ // define getter function for harmony exports
-/******/ __webpack_require__.d = function(exports, name, getter) {
-/******/ if(!__webpack_require__.o(exports, name)) {
-/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ }
-/******/ };
-/******/
-/******/ // define __esModule on exports
-/******/ __webpack_require__.r = function(exports) {
-/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ }
-/******/ Object.defineProperty(exports, '__esModule', { value: true });
-/******/ };
-/******/
-/******/ // create a fake namespace object
-/******/ // mode & 1: value is a module id, require it
-/******/ // mode & 2: merge all properties of value into the ns
-/******/ // mode & 4: return value when already ns object
-/******/ // mode & 8|1: behave like require
-/******/ __webpack_require__.t = function(value, mode) {
-/******/ if(mode & 1) value = __webpack_require__(value);
-/******/ if(mode & 8) return value;
-/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ var ns = Object.create(null);
-/******/ __webpack_require__.r(ns);
-/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ return ns;
-/******/ };
-/******/
-/******/ // getDefaultExport function for compatibility with non-harmony modules
-/******/ __webpack_require__.n = function(module) {
-/******/ var getter = module && module.__esModule ?
-/******/ function getDefault() { return module['default']; } :
-/******/ function getModuleExports() { return module; };
-/******/ __webpack_require__.d(getter, 'a', getter);
-/******/ return getter;
-/******/ };
-/******/
-/******/ // Object.prototype.hasOwnProperty.call
-/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ // __webpack_public_path__
-/******/ __webpack_require__.p = "";
-/******/
-/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
-/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
-/******/ jsonpArray.push = webpackJsonpCallback;
-/******/ jsonpArray = jsonpArray.slice();
-/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
-/******/ var parentJsonpFunction = oldJsonpFunction;
-/******/
-/******/
-/******/ // add entry module to deferred list
-/******/ deferredModules.push([140,0]);
-/******/ // run deferred modules when ready
-/******/ return checkDeferredModules();
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */,
-/* 1 */,
-/* 2 */
-/*!***********************!*\
- !*** ./src/Player.js ***!
- \***********************/
-/*! exports provided: Player, loadPlayer */
-/*! exports used: Player, loadPlayer */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Player; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return loadPlayer; });\n/* harmony import */ var _Corporation_Corporation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Corporation/Corporation */ 262);\n/* harmony import */ var _PersonObjects_Player_PlayerObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PersonObjects/Player/PlayerObject */ 645);\n/* harmony import */ var _Exploits_Exploit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Exploits/Exploit */ 224);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/JSONReviver */ 15);\n/* harmony import */ var decimal_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! decimal.js */ 78);\n\n\n\n\n\nlet Player = new _PersonObjects_Player_PlayerObject__WEBPACK_IMPORTED_MODULE_1__[/* PlayerObject */ \"a\"]();\nfunction loadPlayer(saveString) {\n Player = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_3__[/* Reviver */ \"c\"]); // Parse Decimal.js objects\n\n Player.money = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](Player.money);\n\n if (Player.corporation instanceof _Corporation_Corporation__WEBPACK_IMPORTED_MODULE_0__[/* Corporation */ \"a\"]) {\n Player.corporation.funds = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](Player.corporation.funds);\n Player.corporation.revenue = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](Player.corporation.revenue);\n Player.corporation.expenses = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](Player.corporation.expenses);\n\n for (var i = 0; i < Player.corporation.divisions.length; ++i) {\n var ind = Player.corporation.divisions[i];\n ind.lastCycleRevenue = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](ind.lastCycleRevenue);\n ind.lastCycleExpenses = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](ind.lastCycleExpenses);\n ind.thisCycleRevenue = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](ind.thisCycleRevenue);\n ind.thisCycleExpenses = new decimal_js__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"](ind.thisCycleExpenses);\n }\n }\n\n Player.exploits = Object(_Exploits_Exploit__WEBPACK_IMPORTED_MODULE_2__[/* sanitizeExploits */ \"c\"])(Player.exploits);\n}\n\n//# sourceURL=webpack:///./src/Player.js?");
-
-/***/ }),
-/* 3 */
-/*!*********************************!*\
- !*** ./src/ui/numeralFormat.ts ***!
- \*********************************/
-/*! exports provided: numeralWrapper */
-/*! exports used: numeralWrapper */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return numeralWrapper; });\n/* harmony import */ var numeral__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! numeral */ 123);\n/* harmony import */ var numeral__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(numeral__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var numeral_locales_bg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! numeral/locales/bg */ 1098);\n/* harmony import */ var numeral_locales_bg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_bg__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var numeral_locales_cs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! numeral/locales/cs */ 1099);\n/* harmony import */ var numeral_locales_cs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_cs__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var numeral_locales_da_dk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! numeral/locales/da-dk */ 1100);\n/* harmony import */ var numeral_locales_da_dk__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_da_dk__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var numeral_locales_de__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! numeral/locales/de */ 1101);\n/* harmony import */ var numeral_locales_de__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_de__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var numeral_locales_en_au__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! numeral/locales/en-au */ 1102);\n/* harmony import */ var numeral_locales_en_au__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_en_au__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var numeral_locales_en_gb__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! numeral/locales/en-gb */ 1103);\n/* harmony import */ var numeral_locales_en_gb__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_en_gb__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var numeral_locales_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! numeral/locales/es */ 1104);\n/* harmony import */ var numeral_locales_es__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_es__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var numeral_locales_fr__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! numeral/locales/fr */ 1105);\n/* harmony import */ var numeral_locales_fr__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_fr__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var numeral_locales_hu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! numeral/locales/hu */ 1106);\n/* harmony import */ var numeral_locales_hu__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_hu__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var numeral_locales_it__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! numeral/locales/it */ 1107);\n/* harmony import */ var numeral_locales_it__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_it__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var numeral_locales_lv__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! numeral/locales/lv */ 1108);\n/* harmony import */ var numeral_locales_lv__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_lv__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var numeral_locales_no__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! numeral/locales/no */ 1109);\n/* harmony import */ var numeral_locales_no__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_no__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var numeral_locales_pl__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! numeral/locales/pl */ 1110);\n/* harmony import */ var numeral_locales_pl__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_pl__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var numeral_locales_ru__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! numeral/locales/ru */ 1111);\n/* harmony import */ var numeral_locales_ru__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(numeral_locales_ru__WEBPACK_IMPORTED_MODULE_14__);\nfunction _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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* eslint-disable class-methods-use-this */\n\nconst extraFormats = [1e15, 1e18, 1e21, 1e24, 1e27, 1e30];\nconst extraNotations = [\"q\", \"Q\", \"s\", \"S\", \"o\", \"n\"];\n\nclass NumeralFormatter {\n // Default Locale\n constructor() {\n _defineProperty(this, \"defaultLocale\", \"en\");\n\n this.defaultLocale = \"en\";\n }\n\n updateLocale(l) {\n if (numeral__WEBPACK_IMPORTED_MODULE_0___default.a.locale(l) == null) {\n console.warn(`Invalid locale for numeral: ${l}`);\n numeral__WEBPACK_IMPORTED_MODULE_0___default.a.locale(this.defaultLocale);\n return false;\n }\n\n return true;\n }\n\n format(n, format) {\n // numeraljs doesnt properly format numbers that are too big or too small\n if (Math.abs(n) < 1e-6) {\n n = 0;\n }\n\n const answer = numeral__WEBPACK_IMPORTED_MODULE_0___default()(n).format(format);\n\n if (answer === \"NaN\") {\n return `${n}`;\n }\n\n return answer;\n }\n\n formatBigNumber(n) {\n return this.format(n, \"0.000a\");\n } // TODO: leverage numeral.js to do it. This function also implies you can\n // use this format in some text field but you can't. ( \"1t\" will parse but\n // \"1s\" will not)\n\n\n formatReallyBigNumber(n, decimalPlaces = 3) {\n if (n === Infinity) return \"∞\";\n\n for (let i = 0; i < extraFormats.length; i++) {\n if (extraFormats[i] < n && n <= extraFormats[i] * 1000) {\n return this.format(n / extraFormats[i], \"0.\" + \"0\".repeat(decimalPlaces)) + extraNotations[i];\n }\n }\n\n if (Math.abs(n) < 1000) {\n return this.format(n, \"0.\" + \"0\".repeat(decimalPlaces));\n }\n\n const str = this.format(n, \"0.\" + \"0\".repeat(decimalPlaces) + \"a\");\n if (str === \"NaNt\") return this.format(n, \"0.\" + \" \".repeat(decimalPlaces) + \"e+0\");\n return str;\n }\n\n formatHp(n) {\n if (n < 1e6) {\n return this.format(n, \"0,0\");\n }\n\n return this.formatReallyBigNumber(n);\n }\n\n formatMoney(n) {\n return \"$\" + this.formatReallyBigNumber(n);\n }\n\n formatSkill(n) {\n if (n < 1e15) {\n return this.format(n, \"0,0\");\n }\n\n return this.formatReallyBigNumber(n);\n }\n\n formatExp(n) {\n return this.formatReallyBigNumber(n);\n }\n\n formatHashes(n) {\n return this.formatReallyBigNumber(n);\n }\n\n formatReputation(n) {\n return this.formatReallyBigNumber(n);\n }\n\n formatFavor(n) {\n return this.format(n, \"0,0\");\n }\n\n formatRAM(n) {\n return this.format(n, \"0.00\") + \"GB\";\n }\n\n formatPercentage(n, decimalPlaces = 2) {\n const formatter = \"0.\" + \"0\".repeat(decimalPlaces) + \"%\";\n return this.format(n, formatter);\n }\n\n formatServerSecurity(n) {\n return this.format(n, \"0,0.000\");\n }\n\n formatRespect(n) {\n return this.formatReallyBigNumber(n, 5);\n }\n\n formatWanted(n) {\n return this.formatReallyBigNumber(n, 5);\n }\n\n formatMultiplier(n) {\n return this.format(n, \"0,0.00\");\n }\n\n formatSleeveShock(n) {\n return this.format(n, \"0,0.000\");\n }\n\n formatSleeveSynchro(n) {\n return this.format(n, \"0,0.000\");\n }\n\n formatSleeveMemory(n) {\n return this.format(n, \"0\");\n }\n\n formatPopulation(n) {\n return this.format(n, \"0.000a\");\n }\n\n formatStamina(n) {\n return this.format(n, \"0.0\");\n }\n\n formatShares(n) {\n if (n < 1000) {\n return this.format(n, \"0\");\n }\n\n return this.formatReallyBigNumber(n);\n }\n\n formatInfiltrationSecurity(n) {\n return this.formatReallyBigNumber(n);\n }\n\n formatThreads(n) {\n return this.format(n, \"0,0\");\n }\n\n parseMoney(s) {\n // numeral library does not handle formats like 1e10 well (returns 110),\n // so if both return a valid number, return the biggest one\n const numeralValue = numeral__WEBPACK_IMPORTED_MODULE_0___default()(s).value();\n const parsed = parseFloat(s);\n\n if (isNaN(parsed) && numeralValue === null) {\n return NaN;\n } else if (isNaN(parsed)) {\n return numeralValue;\n } else if (numeralValue === null) {\n return parsed;\n } else {\n return Math.max(numeralValue, parsed);\n }\n }\n\n}\n\nconst numeralWrapper = new NumeralFormatter();\n\n//# sourceURL=webpack:///./src/ui/numeralFormat.ts?");
-
-/***/ }),
-/* 4 */,
-/* 5 */
-/*!**************************!*\
- !*** ./src/Constants.ts ***!
- \**************************/
-/*! exports provided: CONSTANTS */
-/*! exports used: CONSTANTS */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return CONSTANTS; });\n/**\n * Generic Game Constants\n *\n * Constants for specific mechanics or features will NOT be here.\n */\nconst CONSTANTS = {\n Version: \"0.53.0\",\n // Speed (in ms) at which the main loop is updated\n _idleSpeed: 200,\n\n /** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience\n * and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then\n * the player will have this level assuming no multipliers. Multipliers can cause skills to go above this.\n */\n MaxSkillLevel: 975,\n // Milliseconds per game cycle\n MilliPerCycle: 200,\n // How much reputation is needed to join a megacorporation's faction\n CorpFactionRepRequirement: 200e3,\n // Base RAM costs\n BaseCostFor1GBOfRamHome: 32000,\n BaseCostFor1GBOfRamServer: 55000,\n //1 GB of RAM\n // Cost to travel to another city\n TravelCost: 200e3,\n // Faction and Company favor-related things\n BaseFavorToDonate: 150,\n DonateMoneyToRepDivisor: 1e6,\n FactionReputationToFavorBase: 500,\n FactionReputationToFavorMult: 1.02,\n CompanyReputationToFavorBase: 500,\n CompanyReputationToFavorMult: 1.02,\n // NeuroFlux Governor Augmentation cost multiplier\n NeuroFluxGovernorLevelMult: 1.14,\n NumNetscriptPorts: 20,\n // Server-related constants\n HomeComputerMaxRam: 1073741824,\n // 2 ^ 30\n ServerBaseGrowthRate: 1.03,\n // Unadjusted Growth rate\n ServerMaxGrowthRate: 1.0035,\n // Maximum possible growth rate (max rate accounting for server security)\n ServerFortifyAmount: 0.002,\n // Amount by which server's security increases when its hacked/grown\n ServerWeakenAmount: 0.05,\n // Amount by which server's security decreases when weakened\n PurchasedServerLimit: 25,\n PurchasedServerMaxRam: 1048576,\n // 2^20\n // Augmentation Constants\n MultipleAugMultiplier: 1.9,\n // TOR Router\n TorRouterCost: 200e3,\n // Infiltration\n InfiltrationBribeBaseAmount: 100e3,\n //Amount per clearance level\n InfiltrationMoneyValue: 5e3,\n //Convert \"secret\" value to money\n InfiltrationRepValue: 1.4,\n //Convert \"secret\" value to faction reputation\n InfiltrationExpPow: 0.8,\n // Stock market\n WSEAccountCost: 200e6,\n TIXAPICost: 5e9,\n MarketData4SCost: 1e9,\n MarketDataTixApi4SCost: 25e9,\n StockMarketCommission: 100e3,\n // Hospital/Health\n HospitalCostPerHp: 100e3,\n // Intelligence-related constants\n IntelligenceCrimeWeight: 0.025,\n // Weight for how much int affects crime success rates\n IntelligenceInfiltrationWeight: 0.1,\n // Weight for how much int affects infiltration success rates\n IntelligenceCrimeBaseExpGain: 0.05,\n IntelligenceProgramBaseExpGain: 2.5,\n // Program required hack level divided by this to determine int exp gain\n IntelligenceTerminalHackBaseExpGain: 200,\n // Hacking exp divided by this to determine int exp gain\n IntelligenceSingFnBaseExpGain: 1.5,\n IntelligenceClassBaseExpGain: 0.01,\n IntelligenceHackingMissionBaseExpGain: 3,\n // Hacking Mission difficulty multiplied by this to get exp gain\n // Hacking Missions\n // TODO Move this into Hacking Mission implementation\n HackingMissionRepToDiffConversion: 10000,\n // Faction rep is divided by this to get mission difficulty\n HackingMissionRepToRewardConversion: 7,\n // Faction rep divided byt his to get mission rep reward\n HackingMissionSpamTimeIncrease: 25000,\n // How much time limit increase is gained when conquering a Spam Node (ms)\n HackingMissionTransferAttackIncrease: 1.05,\n // Multiplier by which the attack for all Core Nodes is increased when conquering a Transfer Node\n HackingMissionMiscDefenseIncrease: 1.05,\n // The amount by which every misc node's defense is multiplied when one is conquered\n HackingMissionDifficultyToHacking: 135,\n // Difficulty is multiplied by this to determine enemy's \"hacking\" level (to determine effects of scan/attack, etc)\n HackingMissionHowToPlay: \"Hacking missions are a minigame that, if won, will reward you with faction reputation.
\" + \"In this game you control a set of Nodes and use them to try and defeat an enemy. Your Nodes \" + \"are colored blue, while the enemy's are red. There are also other nodes on the map colored gray \" + \"that initially belong to neither you nor the enemy. The goal of the game is \" + \"to capture all of the enemy's Database nodes within the time limit. \" + \"If you fail to do this, you will lose.
\" + \"Each Node has three stats: Attack, Defense, and HP. There are five different actions that \" + \"a Node can take:
\" + \"Attack - Targets an enemy Node and lowers its HP. The effectiveness is determined by the owner's Attack, the Player's \" + \"hacking level, and the enemy's defense.
\" + \"Scan - Targets an enemy Node and lowers its Defense. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the \" + \"enemy's defense.
\" + \"Weaken - Targets an enemy Node and lowers its Attack. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the enemy's \" + \"defense.
\" + \"Fortify - Raises the Node's Defense. The effectiveness is determined by your hacking level.
\" + \"Overflow - Raises the Node's Attack but lowers its Defense. The effectiveness is determined by your hacking level.
\" + \"Note that when determining the effectiveness of the above actions, the TOTAL Attack or Defense of the team is used, not just the \" + \"Attack/Defense of the individual Node that is performing the action.
\" + \"To capture a Node, you must lower its HP down to 0.
\" + \"There are six different types of Nodes:
\" + \"CPU Core - These are your main Nodes that are used to perform actions. Capable of performing every action
\" + \"Firewall - Nodes with high defense. These Nodes can 'Fortify'
\" + \"Database - A special type of Node. The player's objective is to conquer all of the enemy's Database Nodes within \" + \"the time limit. These Nodes cannot perform any actions
\" + \"Spam - Conquering one of these Nodes will slow the enemy's trace, giving the player additional time to complete \" + \"the mission. These Nodes cannot perform any actions
\" + \"Transfer - Conquering one of these nodes will increase the Attack of all of your CPU Cores by a small fixed percentage. \" + \"These Nodes are capable of performing every action except the 'Attack' action
\" + \"Shield - Nodes with high defense. These Nodes can 'Fortify'
\" + \"To assign an action to a Node, you must first select one of your Nodes. This can be done by simply clicking on it. Double-clicking \" + \"a node will select all of your Nodes of the same type (e.g. select all CPU Core Nodes or all Transfer Nodes). Note that only Nodes \" + \"that can perform actions (CPU Core, Transfer, Shield, Firewall) can be selected. Selected Nodes will be denoted with a white highlight. After selecting a Node or multiple Nodes, \" + \"select its action using the Action Buttons near the top of the screen. Every action also has a corresponding keyboard \" + \"shortcut.
\" + \"For certain actions such as attacking, scanning, and weakening, the Node performing the action must have a target. To target \" + \"another node, simply click-and-drag from the 'source' Node to a target. A Node can only have one target, and you can target \" + \"any Node that is adjacent to one of your Nodes (immediately above, below, or to the side. NOT diagonal). Furthermore, only CPU Cores and Transfer Nodes \" + \"can target, since they are the only ones that can perform the related actions. To remove a target, you can simply click on the line that represents \" + \"the connection between one of your Nodes and its target. Alternatively, you can select the 'source' Node and click the 'Drop Connection' button, \" + \"or press 'd'.
\" + \"Other Notes:
\" + \"-Whenever a miscellenaous Node (not owned by the player or enemy) is conquered, the defense of all remaining miscellaneous Nodes that \" + \"are not actively being targeted will increase by a fixed percentage.
\" + \"-Whenever a Node is conquered, its stats are significantly reduced
\" + \"-Miscellaneous Nodes slowly raise their defense over time
\" + \"-Nodes slowly regenerate health over time.\",\n // Time-related constants\n MillisecondsPer20Hours: 72000000,\n GameCyclesPer20Hours: 72000000 / 200,\n MillisecondsPer10Hours: 36000000,\n GameCyclesPer10Hours: 36000000 / 200,\n MillisecondsPer8Hours: 28800000,\n GameCyclesPer8Hours: 28800000 / 200,\n MillisecondsPer4Hours: 14400000,\n GameCyclesPer4Hours: 14400000 / 200,\n MillisecondsPer2Hours: 7200000,\n GameCyclesPer2Hours: 7200000 / 200,\n MillisecondsPerHour: 3600000,\n GameCyclesPerHour: 3600000 / 200,\n MillisecondsPerHalfHour: 1800000,\n GameCyclesPerHalfHour: 1800000 / 200,\n MillisecondsPerQuarterHour: 900000,\n GameCyclesPerQuarterHour: 900000 / 200,\n MillisecondsPerFiveMinutes: 300000,\n GameCyclesPerFiveMinutes: 300000 / 200,\n // Player Work & Action\n FactionWorkHacking: \"Faction Hacking Work\",\n FactionWorkField: \"Faction Field Work\",\n FactionWorkSecurity: \"Faction Security Work\",\n WorkTypeCompany: \"Working for Company\",\n WorkTypeCompanyPartTime: \"Working for Company part-time\",\n WorkTypeFaction: \"Working for Faction\",\n WorkTypeCreateProgram: \"Working on Create a Program\",\n WorkTypeStudyClass: \"Studying or Taking a class at university\",\n WorkTypeCrime: \"Committing a crime\",\n ClassStudyComputerScience: \"studying Computer Science\",\n ClassDataStructures: \"taking a Data Structures course\",\n ClassNetworks: \"taking a Networks course\",\n ClassAlgorithms: \"taking an Algorithms course\",\n ClassManagement: \"taking a Management course\",\n ClassLeadership: \"taking a Leadership course\",\n ClassGymStrength: \"training your strength at a gym\",\n ClassGymDefense: \"training your defense at a gym\",\n ClassGymDexterity: \"training your dexterity at a gym\",\n ClassGymAgility: \"training your agility at a gym\",\n ClassDataStructuresBaseCost: 40,\n ClassNetworksBaseCost: 80,\n ClassAlgorithmsBaseCost: 320,\n ClassManagementBaseCost: 160,\n ClassLeadershipBaseCost: 320,\n ClassGymBaseCost: 120,\n ClassStudyComputerScienceBaseExp: 0.5,\n ClassDataStructuresBaseExp: 1,\n ClassNetworksBaseExp: 2,\n ClassAlgorithmsBaseExp: 4,\n ClassManagementBaseExp: 2,\n ClassLeadershipBaseExp: 4,\n CrimeShoplift: \"shoplift\",\n CrimeRobStore: \"rob a store\",\n CrimeMug: \"mug someone\",\n CrimeLarceny: \"commit larceny\",\n CrimeDrugs: \"deal drugs\",\n CrimeBondForgery: \"forge corporate bonds\",\n CrimeTraffickArms: \"traffick illegal arms\",\n CrimeHomicide: \"commit homicide\",\n CrimeGrandTheftAuto: \"commit grand theft auto\",\n CrimeKidnap: \"kidnap someone for ransom\",\n CrimeAssassination: \"assassinate a high-profile target\",\n CrimeHeist: \"pull off the ultimate heist\",\n // Coding Contract\n // TODO: Move this into Coding contract implementation?\n CodingContractBaseFactionRepGain: 2500,\n CodingContractBaseCompanyRepGain: 4000,\n CodingContractBaseMoneyGain: 75e6,\n // BitNode/Source-File related stuff\n TotalNumBitNodes: 24,\n LatestUpdate: `\n v0.53.0 - 2021-09-09 Way too many things. (hydroflame & community)\n -------------------------------------------\n\n ** Dev? **\n\n * The entire codebase has been run through a code prettifier, hurray for consistency. (@threehams)\n * Lots of test. (@threehams)\n * Massive improvements to build speed. (@threehams)\n * Dev notes: This won't affect any players but is immensely useful for me.\n\n ** Hacknet **\n\n * Converted to ts/react\n\n ** Resleeving **\n\n * Converted to ts/react\n\n ** Sleeves **\n\n * Converted to ts/react. The ui should also have a better feel.\n * Fixed a bug that allowed players to recover shock much faster than intended.\n\n ** BN10 **\n\n * You have access to Sleeves right away\n * In BN10 Sleeves start with 75 shock and 25 sync.\n\n ** MathJax **\n\n * Several tooltips have been updated to display the relevant formula in Mathjax, e.g. Favor and reputation\n\n ** Corporation ** \n\n * Completely rewritten in React. Paving the way for bigger change.\n * Smart Supply is now smarter and won't deadlock the warehouse. It is also more configurable.\n * Several UI fixes.\n\n ** Bladeburner ** \n\n * Action count is no longer decided when joining the Bladeburners. Experiences for all players should be more similar.\n\n ** Factions ** \n\n * No factions have home computer ram requirement. This caused some confusion for new players.\n\n ** Gang ** \n\n * Made it clear when there's a new equipment coming up.\n\n ** Netscript **\n\n * getActionCountRemaining now returns Infinity for bladeburner general actions. (@brubsy)\n * getActionEstimatedSuccessChance now returns 100% for Diplomacy and Hyperbolic Regeneration Chamber. (@brubsy)\n * disableLog('ALL') now disables all logs individually, meaning you can re-enable the ones you want after. (@Cass)\n * getPlayer returns numPeopleKilled.\n * Dynamic RAM calculation errors have a better error message.\n * Hide some functions from autocomplete.\n * Added getAugmentationPrice, getAugmentationRepReq, deprecated getAugmentationCost. (@TempFound)\n * Fixed bug where some crime API would return \"assassinate\" when that's not accepted in other functions.\n\n ** Coding Contract **\n\n * Spiralize Matrix is easier to read.\n\n ** Misc. **\n\n * The world map is now used in sleeve travel and bladeburner travel.\n * noselect a bunch of stuff.\n * Ascii maps letters are more contrasting\n * Updated documentation for infiltration.\n * Most money costs in the game will turn grey/cyan when you don't have enough money.\n * Donation textbox has better look & feel.\n * Tech vendors ram & cores buttons have better look and feels.\n * cores cost modified to be a formula instead of a semi-random array of numbers.\n * Tech vendors now give a hint about where to get bigger servers.\n * logboxes now displays whitespaces exactly. (@Cass)\n * nerf noodle bar\n`\n /*\n */\n\n};\n\n//# sourceURL=webpack:///./src/Constants.ts?");
-
-/***/ }),
-/* 6 */
-/*!****************************************************!*\
- !*** ./src/Augmentation/data/AugmentationNames.ts ***!
- \****************************************************/
-/*! exports provided: AugmentationNames */
-/*! exports used: AugmentationNames */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AugmentationNames; });\nconst AugmentationNames = {\n Targeting1: \"Augmented Targeting I\",\n Targeting2: \"Augmented Targeting II\",\n Targeting3: \"Augmented Targeting III\",\n SyntheticHeart: \"Synthetic Heart\",\n SynfibrilMuscle: \"Synfibril Muscle\",\n CombatRib1: \"Combat Rib I\",\n CombatRib2: \"Combat Rib II\",\n CombatRib3: \"Combat Rib III\",\n NanofiberWeave: \"Nanofiber Weave\",\n SubdermalArmor: \"NEMEAN Subdermal Weave\",\n WiredReflexes: \"Wired Reflexes\",\n GrapheneBoneLacings: \"Graphene Bone Lacings\",\n BionicSpine: \"Bionic Spine\",\n GrapheneBionicSpine: \"Graphene Bionic Spine Upgrade\",\n BionicLegs: \"Bionic Legs\",\n GrapheneBionicLegs: \"Graphene Bionic Legs Upgrade\",\n SpeechProcessor: \"Speech Processor Implant\",\n TITN41Injection: \"TITN-41 Gene-Modification Injection\",\n EnhancedSocialInteractionImplant: \"Enhanced Social Interaction Implant\",\n BitWire: \"BitWire\",\n ArtificialBioNeuralNetwork: \"Artificial Bio-neural Network Implant\",\n ArtificialSynapticPotentiation: \"Artificial Synaptic Potentiation\",\n EnhancedMyelinSheathing: \"Enhanced Myelin Sheathing\",\n SynapticEnhancement: \"Synaptic Enhancement Implant\",\n NeuralRetentionEnhancement: \"Neural-Retention Enhancement\",\n DataJack: \"DataJack\",\n ENM: \"Embedded Netburner Module\",\n ENMCore: \"Embedded Netburner Module Core Implant\",\n ENMCoreV2: \"Embedded Netburner Module Core V2 Upgrade\",\n ENMCoreV3: \"Embedded Netburner Module Core V3 Upgrade\",\n ENMAnalyzeEngine: \"Embedded Netburner Module Analyze Engine\",\n ENMDMA: \"Embedded Netburner Module Direct Memory Access Upgrade\",\n Neuralstimulator: \"Neuralstimulator\",\n NeuralAccelerator: \"Neural Accelerator\",\n CranialSignalProcessorsG1: \"Cranial Signal Processors - Gen I\",\n CranialSignalProcessorsG2: \"Cranial Signal Processors - Gen II\",\n CranialSignalProcessorsG3: \"Cranial Signal Processors - Gen III\",\n CranialSignalProcessorsG4: \"Cranial Signal Processors - Gen IV\",\n CranialSignalProcessorsG5: \"Cranial Signal Processors - Gen V\",\n NeuronalDensification: \"Neuronal Densification\",\n NuoptimalInjectorImplant: \"Nuoptimal Nootropic Injector Implant\",\n SpeechEnhancement: \"Speech Enhancement\",\n FocusWire: \"FocusWire\",\n PCDNI: \"PC Direct-Neural Interface\",\n PCDNIOptimizer: \"PC Direct-Neural Interface Optimization Submodule\",\n PCDNINeuralNetwork: \"PC Direct-Neural Interface NeuroNet Injector\",\n PCMatrix: \"PCMatrix\",\n ADRPheromone1: \"ADR-V1 Pheromone Gene\",\n ADRPheromone2: \"ADR-V2 Pheromone Gene\",\n ShadowsSimulacrum: \"The Shadow's Simulacrum\",\n HacknetNodeCPUUpload: \"Hacknet Node CPU Architecture Neural-Upload\",\n HacknetNodeCacheUpload: \"Hacknet Node Cache Architecture Neural-Upload\",\n HacknetNodeNICUpload: \"Hacknet Node NIC Architecture Neural-Upload\",\n HacknetNodeKernelDNI: \"Hacknet Node Kernel Direct-Neural Interface\",\n HacknetNodeCoreDNI: \"Hacknet Node Core Direct-Neural Interface\",\n NeuroFluxGovernor: \"NeuroFlux Governor\",\n Neurotrainer1: \"Neurotrainer I\",\n Neurotrainer2: \"Neurotrainer II\",\n Neurotrainer3: \"Neurotrainer III\",\n Hypersight: \"HyperSight Corneal Implant\",\n LuminCloaking1: \"LuminCloaking-V1 Skin Implant\",\n LuminCloaking2: \"LuminCloaking-V2 Skin Implant\",\n HemoRecirculator: \"HemoRecirculator\",\n SmartSonar: \"SmartSonar Implant\",\n PowerRecirculator: \"Power Recirculation Core\",\n QLink: \"QLink\",\n TheRedPill: \"The Red Pill\",\n SPTN97: \"SPTN-97 Gene Modification\",\n HiveMind: \"ECorp HVMind Implant\",\n CordiARCReactor: \"CordiARC Fusion Reactor\",\n SmartJaw: \"SmartJaw\",\n Neotra: \"Neotra\",\n Xanipher: \"Xanipher\",\n nextSENS: \"nextSENS Gene Modification\",\n OmniTekInfoLoad: \"OmniTek InfoLoad\",\n PhotosyntheticCells: \"Photosynthetic Cells\",\n Neurolink: \"BitRunners Neurolink\",\n TheBlackHand: \"The Black Hand\",\n UnstableCircadianModulator: \"Unstable Circadian Modulator\",\n CRTX42AA: \"CRTX42-AA Gene Modification\",\n Neuregen: \"Neuregen Gene Modification\",\n CashRoot: \"CashRoot Starter Kit\",\n NutriGen: \"NutriGen Implant\",\n INFRARet: \"INFRARET Enhancement\",\n DermaForce: \"DermaForce Particle Barrier\",\n GrapheneBrachiBlades: \"Graphene BranchiBlades Upgrade\",\n GrapheneBionicArms: \"Graphene Bionic Arms Upgrade\",\n BrachiBlades: \"BrachiBlades\",\n BionicArms: \"Bionic Arms\",\n SNA: \"Social Negotiation Assistant (S.N.A)\",\n HydroflameLeftArm: \"Hydroflame Left Arm\",\n EsperEyewear: \"EsperTech Bladeburner Eyewear\",\n EMS4Recombination: \"EMS-4 Recombination\",\n OrionShoulder: \"ORION-MKIV Shoulder\",\n HyperionV1: \"Hyperion Plasma Cannon V1\",\n HyperionV2: \"Hyperion Plasma Cannon V2\",\n GolemSerum: \"GOLEM Serum\",\n VangelisVirus: \"Vangelis Virus\",\n VangelisVirus3: \"Vangelis Virus 3.0\",\n INTERLINKED: \"I.N.T.E.R.L.I.N.K.E.D\",\n BladeRunner: \"Blade's Runners\",\n BladeArmor: \"BLADE-51b Tesla Armor\",\n BladeArmorPowerCells: \"BLADE-51b Tesla Armor: Power Cells Upgrade\",\n BladeArmorEnergyShielding: \"BLADE-51b Tesla Armor: Energy Shielding Upgrade\",\n BladeArmorUnibeam: \"BLADE-51b Tesla Armor: Unibeam Upgrade\",\n BladeArmorOmnibeam: \"BLADE-51b Tesla Armor: Omnibeam Upgrade\",\n BladeArmorIPU: \"BLADE-51b Tesla Armor: IPU Upgrade\",\n BladesSimulacrum: \"The Blade's Simulacrum\" //Wasteland Augs\n //PepBoy: \"P.E.P-Boy\", Plasma Energy Projection System\n //PepBoyForceField Generates plasma force fields\n //PepBoyBlasts Generate high density plasma concussive blasts\n //PepBoyDataStorage STore more data on pep boy,\n\n};\n\n//# sourceURL=webpack:///./src/Augmentation/data/AugmentationNames.ts?");
-
-/***/ }),
-/* 7 */,
-/* 8 */
-/*!*******************************************!*\
- !*** ./src/BitNode/BitNodeMultipliers.ts ***!
- \*******************************************/
-/*! exports provided: BitNodeMultipliers */
-/*! exports used: BitNodeMultipliers */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BitNodeMultipliers; });\n/**\n * Bitnode multipliers influence the difficulty of different aspects of the game.\n * Each Bitnode has a different theme/strategy to achieving the end goal, so these multipliers will can help drive the\n * player toward the intended strategy. Unless they really want to play the long, slow game of waiting...\n */\n\n/**\n * The multipliers that are influenced by current Bitnode progression.\n */\n// tslint:disable-next-line:variable-name\nconst BitNodeMultipliers = {\n HackingLevelMultiplier: 1,\n StrengthLevelMultiplier: 1,\n DefenseLevelMultiplier: 1,\n DexterityLevelMultiplier: 1,\n AgilityLevelMultiplier: 1,\n CharismaLevelMultiplier: 1,\n ServerGrowthRate: 1,\n ServerMaxMoney: 1,\n ServerStartingMoney: 1,\n ServerStartingSecurity: 1,\n ServerWeakenRate: 1,\n HomeComputerRamCost: 1,\n PurchasedServerCost: 1,\n PurchasedServerLimit: 1,\n PurchasedServerMaxRam: 1,\n CompanyWorkMoney: 1,\n CrimeMoney: 1,\n HacknetNodeMoney: 1,\n ManualHackMoney: 1,\n ScriptHackMoney: 1,\n ScriptHackMoneyGain: 1,\n CodingContractMoney: 1,\n ClassGymExpGain: 1,\n CompanyWorkExpGain: 1,\n CrimeExpGain: 1,\n FactionWorkExpGain: 1,\n HackExpGain: 1,\n FactionPassiveRepGain: 1,\n FactionWorkRepGain: 1,\n RepToDonateToFaction: 1,\n AugmentationMoneyCost: 1,\n AugmentationRepCost: 1,\n InfiltrationMoney: 1,\n InfiltrationRep: 1,\n FourSigmaMarketDataCost: 1,\n FourSigmaMarketDataApiCost: 1,\n CorporationValuation: 1,\n BladeburnerRank: 1,\n BladeburnerSkillCost: 1,\n DaedalusAugsRequirement: 1,\n GangKarmaRequirement: 1\n};\n\n//# sourceURL=webpack:///./src/BitNode/BitNodeMultipliers.ts?");
-
-/***/ }),
-/* 9 */
-/*!*********************************************!*\
- !*** ./src/Locations/data/LocationNames.ts ***!
- \*********************************************/
-/*! exports provided: LocationName */
-/*! exports used: LocationName */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return LocationName; });\n/**\n * Names of all locations\n */\nlet LocationName;\n\n(function (LocationName) {\n LocationName[\"Aevum\"] = \"Aevum\";\n LocationName[\"Chongqing\"] = \"Chongqing\";\n LocationName[\"Ishima\"] = \"Ishima\";\n LocationName[\"NewTokyo\"] = \"New Tokyo\";\n LocationName[\"Sector12\"] = \"Sector-12\";\n LocationName[\"Volhaven\"] = \"Volhaven\";\n LocationName[\"AevumAeroCorp\"] = \"AeroCorp\";\n LocationName[\"AevumBachmanAndAssociates\"] = \"Bachman & Associates\";\n LocationName[\"AevumClarkeIncorporated\"] = \"Clarke Incorporated\";\n LocationName[\"AevumCrushFitnessGym\"] = \"Crush Fitness Gym\";\n LocationName[\"AevumECorp\"] = \"ECorp\";\n LocationName[\"AevumFulcrumTechnologies\"] = \"Fulcrum Technologies\";\n LocationName[\"AevumGalacticCybersystems\"] = \"Galactic Cybersystems\";\n LocationName[\"AevumNetLinkTechnologies\"] = \"NetLink Technologies\";\n LocationName[\"AevumPolice\"] = \"Aevum Police Headquarters\";\n LocationName[\"AevumRhoConstruction\"] = \"Rho Construction\";\n LocationName[\"AevumSnapFitnessGym\"] = \"Snap Fitness Gym\";\n LocationName[\"AevumSummitUniversity\"] = \"Summit University\";\n LocationName[\"AevumWatchdogSecurity\"] = \"Watchdog Security\";\n LocationName[\"AevumCasino\"] = \"Iker Molina Casino\";\n LocationName[\"ChongqingKuaiGongInternational\"] = \"KuaiGong International\";\n LocationName[\"ChongqingSolarisSpaceSystems\"] = \"Solaris Space Systems\";\n LocationName[\"Sector12AlphaEnterprises\"] = \"Alpha Enterprises\";\n LocationName[\"Sector12BladeIndustries\"] = \"Blade Industries\";\n LocationName[\"Sector12CIA\"] = \"Central Intelligence Agency\";\n LocationName[\"Sector12CarmichaelSecurity\"] = \"Carmichael Security\";\n LocationName[\"Sector12CityHall\"] = \"Sector-12 City Hall\";\n LocationName[\"Sector12DeltaOne\"] = \"DeltaOne\";\n LocationName[\"Sector12FoodNStuff\"] = \"FoodNStuff\";\n LocationName[\"Sector12FourSigma\"] = \"Four Sigma\";\n LocationName[\"Sector12IcarusMicrosystems\"] = \"Icarus Microsystems\";\n LocationName[\"Sector12IronGym\"] = \"Iron Gym\";\n LocationName[\"Sector12JoesGuns\"] = \"Joe's Guns\";\n LocationName[\"Sector12MegaCorp\"] = \"MegaCorp\";\n LocationName[\"Sector12NSA\"] = \"National Security Agency\";\n LocationName[\"Sector12PowerhouseGym\"] = \"Powerhouse Gym\";\n LocationName[\"Sector12RothmanUniversity\"] = \"Rothman University\";\n LocationName[\"Sector12UniversalEnergy\"] = \"Universal Energy\";\n LocationName[\"NewTokyoDefComm\"] = \"DefComm\";\n LocationName[\"NewTokyoGlobalPharmaceuticals\"] = \"Global Pharmaceuticals\";\n LocationName[\"NewTokyoNoodleBar\"] = \"Noodle Bar\";\n LocationName[\"NewTokyoVitaLife\"] = \"VitaLife\";\n LocationName[\"IshimaNovaMedical\"] = \"Nova Medical\";\n LocationName[\"IshimaOmegaSoftware\"] = \"Omega Software\";\n LocationName[\"IshimaStormTechnologies\"] = \"Storm Technologies\";\n LocationName[\"VolhavenCompuTek\"] = \"CompuTek\";\n LocationName[\"VolhavenHeliosLabs\"] = \"Helios Labs\";\n LocationName[\"VolhavenLexoCorp\"] = \"LexoCorp\";\n LocationName[\"VolhavenMilleniumFitnessGym\"] = \"Millenium Fitness Gym\";\n LocationName[\"VolhavenNWO\"] = \"NWO\";\n LocationName[\"VolhavenOmniTekIncorporated\"] = \"OmniTek Incorporated\";\n LocationName[\"VolhavenOmniaCybersystems\"] = \"Omnia Cybersystems\";\n LocationName[\"VolhavenSysCoreSecurities\"] = \"SysCore Securities\";\n LocationName[\"VolhavenZBInstituteOfTechnology\"] = \"ZB Institute of Technology\";\n LocationName[\"Hospital\"] = \"Hospital\";\n LocationName[\"Slums\"] = \"The Slums\";\n LocationName[\"TravelAgency\"] = \"Travel Agency\";\n LocationName[\"WorldStockExchange\"] = \"World Stock Exchange\";\n LocationName[\"Void\"] = \"The Void\";\n})(LocationName || (LocationName = {}));\n\n//# sourceURL=webpack:///./src/Locations/data/LocationNames.ts?");
-
-/***/ }),
-/* 10 */
-/*!*****************************!*\
- !*** ./utils/DialogBox.tsx ***!
- \*****************************/
-/*! exports provided: dialogBoxCreate */
-/*! exports used: dialogBoxCreate */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return dialogBoxCreate; });\n/* harmony import */ var _src_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../src/ui/React/createPopup */ 20);\n/* harmony import */ var _helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers/getRandomInt */ 19);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nfunction MessagePopup(props) {\n return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_2___default.a.Fragment, null, props.content);\n}\n\nfunction dialogBoxCreate(txt, preformatted = false) {\n const popupId = `popup-` + Array.from(Array(16)).map(() => `${Object(_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_1__[/* getRandomInt */ \"a\"])(0, 9)}`).join(\"\");\n\n if (typeof txt === \"string\") {\n if (preformatted) {\n // For text files as they are often computed data that\n // shouldn't be wrapped and should retain tabstops.\n Object(_src_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_0__[/* createPopup */ \"a\"])(popupId, MessagePopup, {\n content: react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"pre\", {\n dangerouslySetInnerHTML: {\n __html: txt\n }\n })\n });\n } else {\n Object(_src_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_0__[/* createPopup */ \"a\"])(popupId, MessagePopup, {\n content: react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"p\", {\n dangerouslySetInnerHTML: {\n __html: txt.replace(/(?:\\r\\n|\\r|\\n)/g, \" \")\n }\n })\n });\n }\n } else {\n Object(_src_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_0__[/* createPopup */ \"a\"])(popupId, MessagePopup, {\n content: txt\n });\n }\n}\n\n//# sourceURL=webpack:///./utils/DialogBox.tsx?");
-
-/***/ }),
-/* 11 */
-/*!*******************************************!*\
- !*** ./src/Netscript/RamCostGenerator.ts ***!
- \*******************************************/
-/*! exports provided: RamCostConstants, RamCosts, getRamCost */
-/*! exports used: RamCostConstants, RamCosts, getRamCost */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return RamCostConstants; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return RamCosts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getRamCost; });\n// TODO remember to update RamCalculations.js and WorkerScript.js\n// RAM costs for Netscript functions\nconst RamCostConstants = {\n ScriptBaseRamCost: 1.6,\n ScriptDomRamCost: 25,\n ScriptHackRamCost: 0.1,\n ScriptHackAnalyzeRamCost: 1,\n ScriptGrowRamCost: 0.15,\n ScriptGrowthAnalyzeRamCost: 1,\n ScriptWeakenRamCost: 0.15,\n ScriptScanRamCost: 0.2,\n ScriptPortProgramRamCost: 0.05,\n ScriptRunRamCost: 1.0,\n ScriptExecRamCost: 1.3,\n ScriptSpawnRamCost: 2.0,\n ScriptScpRamCost: 0.6,\n ScriptKillRamCost: 0.5,\n ScriptHasRootAccessRamCost: 0.05,\n ScriptGetHostnameRamCost: 0.05,\n ScriptGetHackingLevelRamCost: 0.05,\n ScriptGetMultipliersRamCost: 4.0,\n ScriptGetServerRamCost: 0.1,\n ScriptGetServerMaxRam: 0.05,\n ScriptGetServerUsedRam: 0.05,\n ScriptFileExistsRamCost: 0.1,\n ScriptIsRunningRamCost: 0.1,\n ScriptHacknetNodesRamCost: 4.0,\n ScriptHNUpgLevelRamCost: 0.4,\n ScriptHNUpgRamRamCost: 0.6,\n ScriptHNUpgCoreRamCost: 0.8,\n ScriptGetStockRamCost: 2.0,\n ScriptBuySellStockRamCost: 2.5,\n ScriptGetPurchaseServerRamCost: 0.25,\n ScriptPurchaseServerRamCost: 2.25,\n ScriptGetPurchasedServerLimit: 0.05,\n ScriptGetPurchasedServerMaxRam: 0.05,\n ScriptRoundRamCost: 0.05,\n ScriptReadWriteRamCost: 1.0,\n ScriptArbScriptRamCost: 1.0,\n ScriptGetScriptRamCost: 0.1,\n ScriptGetRunningScriptRamCost: 0.3,\n ScriptGetHackTimeRamCost: 0.05,\n ScriptGetFavorToDonate: 0.1,\n ScriptCodingContractBaseRamCost: 10,\n ScriptSleeveBaseRamCost: 4,\n ScriptSingularityFn1RamCost: 2,\n ScriptSingularityFn2RamCost: 3,\n ScriptSingularityFn3RamCost: 5,\n ScriptGangApiBaseRamCost: 4,\n ScriptBladeburnerApiBaseRamCost: 4\n};\nconst RamCosts = {\n hacknet: {\n numNodes: () => 0,\n purchaseNode: () => 0,\n getPurchaseNodeCost: () => 0,\n getNodeStats: () => 0,\n upgradeLevel: () => 0,\n upgradeRam: () => 0,\n upgradeCore: () => 0,\n upgradeCache: () => 0,\n getLevelUpgradeCost: () => 0,\n getRamUpgradeCost: () => 0,\n getCoreUpgradeCost: () => 0,\n getCacheUpgradeCost: () => 0,\n numHashes: () => 0,\n hashCost: () => 0,\n spendHashes: () => 0\n },\n sprintf: () => 0,\n vsprintf: () => 0,\n scan: () => RamCostConstants.ScriptScanRamCost,\n hack: () => RamCostConstants.ScriptHackRamCost,\n hackAnalyzeThreads: () => RamCostConstants.ScriptHackAnalyzeRamCost,\n hackAnalyzePercent: () => RamCostConstants.ScriptHackAnalyzeRamCost,\n hackChance: () => RamCostConstants.ScriptHackAnalyzeRamCost,\n sleep: () => 0,\n grow: () => RamCostConstants.ScriptGrowRamCost,\n growthAnalyze: () => RamCostConstants.ScriptGrowthAnalyzeRamCost,\n weaken: () => RamCostConstants.ScriptWeakenRamCost,\n print: () => 0,\n tprint: () => 0,\n clearLog: () => 0,\n disableLog: () => 0,\n enableLog: () => 0,\n isLogEnabled: () => 0,\n getScriptLogs: () => 0,\n nuke: () => RamCostConstants.ScriptPortProgramRamCost,\n brutessh: () => RamCostConstants.ScriptPortProgramRamCost,\n ftpcrack: () => RamCostConstants.ScriptPortProgramRamCost,\n relaysmtp: () => RamCostConstants.ScriptPortProgramRamCost,\n httpworm: () => RamCostConstants.ScriptPortProgramRamCost,\n sqlinject: () => RamCostConstants.ScriptPortProgramRamCost,\n run: () => RamCostConstants.ScriptRunRamCost,\n exec: () => RamCostConstants.ScriptExecRamCost,\n spawn: () => RamCostConstants.ScriptSpawnRamCost,\n kill: () => RamCostConstants.ScriptKillRamCost,\n killall: () => RamCostConstants.ScriptKillRamCost,\n exit: () => 0,\n scp: () => RamCostConstants.ScriptScpRamCost,\n ls: () => RamCostConstants.ScriptScanRamCost,\n ps: () => RamCostConstants.ScriptScanRamCost,\n hasRootAccess: () => RamCostConstants.ScriptHasRootAccessRamCost,\n getIp: () => RamCostConstants.ScriptGetHostnameRamCost,\n getHostname: () => RamCostConstants.ScriptGetHostnameRamCost,\n getHackingLevel: () => RamCostConstants.ScriptGetHackingLevelRamCost,\n getHackingMultipliers: () => RamCostConstants.ScriptGetMultipliersRamCost,\n getHacknetMultipliers: () => RamCostConstants.ScriptGetMultipliersRamCost,\n getBitNodeMultipliers: () => RamCostConstants.ScriptGetMultipliersRamCost,\n getServer: () => RamCostConstants.ScriptGetMultipliersRamCost / 2,\n getServerMoneyAvailable: () => RamCostConstants.ScriptGetServerRamCost,\n getServerSecurityLevel: () => RamCostConstants.ScriptGetServerRamCost,\n getServerBaseSecurityLevel: () => RamCostConstants.ScriptGetServerRamCost,\n getServerMinSecurityLevel: () => RamCostConstants.ScriptGetServerRamCost,\n getServerRequiredHackingLevel: () => RamCostConstants.ScriptGetServerRamCost,\n getServerMaxMoney: () => RamCostConstants.ScriptGetServerRamCost,\n getServerGrowth: () => RamCostConstants.ScriptGetServerRamCost,\n getServerNumPortsRequired: () => RamCostConstants.ScriptGetServerRamCost,\n getServerRam: () => RamCostConstants.ScriptGetServerRamCost,\n getServerMaxRam: () => RamCostConstants.ScriptGetServerMaxRam,\n getServerUsedRam: () => RamCostConstants.ScriptGetServerUsedRam,\n serverExists: () => RamCostConstants.ScriptGetServerRamCost,\n fileExists: () => RamCostConstants.ScriptFileExistsRamCost,\n isRunning: () => RamCostConstants.ScriptIsRunningRamCost,\n getStockSymbols: () => RamCostConstants.ScriptGetStockRamCost,\n getStockPrice: () => RamCostConstants.ScriptGetStockRamCost,\n getStockAskPrice: () => RamCostConstants.ScriptGetStockRamCost,\n getStockBidPrice: () => RamCostConstants.ScriptGetStockRamCost,\n getStockPosition: () => RamCostConstants.ScriptGetStockRamCost,\n getStockMaxShares: () => RamCostConstants.ScriptGetStockRamCost,\n getStockPurchaseCost: () => RamCostConstants.ScriptGetStockRamCost,\n getStockSaleGain: () => RamCostConstants.ScriptGetStockRamCost,\n buyStock: () => RamCostConstants.ScriptBuySellStockRamCost,\n sellStock: () => RamCostConstants.ScriptBuySellStockRamCost,\n shortStock: () => RamCostConstants.ScriptBuySellStockRamCost,\n sellShort: () => RamCostConstants.ScriptBuySellStockRamCost,\n placeOrder: () => RamCostConstants.ScriptBuySellStockRamCost,\n cancelOrder: () => RamCostConstants.ScriptBuySellStockRamCost,\n getOrders: () => RamCostConstants.ScriptBuySellStockRamCost,\n getStockVolatility: () => RamCostConstants.ScriptBuySellStockRamCost,\n getStockForecast: () => RamCostConstants.ScriptBuySellStockRamCost,\n purchase4SMarketData: () => RamCostConstants.ScriptBuySellStockRamCost,\n purchase4SMarketDataTixApi: () => RamCostConstants.ScriptBuySellStockRamCost,\n getPurchasedServerLimit: () => RamCostConstants.ScriptGetPurchasedServerLimit,\n getPurchasedServerMaxRam: () => RamCostConstants.ScriptGetPurchasedServerMaxRam,\n getPurchasedServerCost: () => RamCostConstants.ScriptGetPurchaseServerRamCost,\n purchaseServer: () => RamCostConstants.ScriptPurchaseServerRamCost,\n deleteServer: () => RamCostConstants.ScriptPurchaseServerRamCost,\n getPurchasedServers: () => RamCostConstants.ScriptPurchaseServerRamCost,\n write: () => RamCostConstants.ScriptReadWriteRamCost,\n tryWrite: () => RamCostConstants.ScriptReadWriteRamCost,\n read: () => RamCostConstants.ScriptReadWriteRamCost,\n peek: () => RamCostConstants.ScriptReadWriteRamCost,\n clear: () => RamCostConstants.ScriptReadWriteRamCost,\n getPortHandle: () => RamCostConstants.ScriptReadWriteRamCost * 10,\n rm: () => RamCostConstants.ScriptReadWriteRamCost,\n scriptRunning: () => RamCostConstants.ScriptArbScriptRamCost,\n scriptKill: () => RamCostConstants.ScriptArbScriptRamCost,\n getScriptName: () => 0,\n getScriptRam: () => RamCostConstants.ScriptGetScriptRamCost,\n getHackTime: () => RamCostConstants.ScriptGetHackTimeRamCost,\n getGrowTime: () => RamCostConstants.ScriptGetHackTimeRamCost,\n getWeakenTime: () => RamCostConstants.ScriptGetHackTimeRamCost,\n getScriptIncome: () => RamCostConstants.ScriptGetScriptRamCost,\n getScriptExpGain: () => RamCostConstants.ScriptGetScriptRamCost,\n getRunningScript: () => RamCostConstants.ScriptGetRunningScriptRamCost,\n nFormat: () => 0,\n getTimeSinceLastAug: () => RamCostConstants.ScriptGetHackTimeRamCost,\n prompt: () => 0,\n wget: () => 0,\n getFavorToDonate: () => RamCostConstants.ScriptGetFavorToDonate,\n // Singularity Functions\n universityCourse: () => RamCostConstants.ScriptSingularityFn1RamCost,\n gymWorkout: () => RamCostConstants.ScriptSingularityFn1RamCost,\n travelToCity: () => RamCostConstants.ScriptSingularityFn1RamCost,\n purchaseTor: () => RamCostConstants.ScriptSingularityFn1RamCost,\n purchaseProgram: () => RamCostConstants.ScriptSingularityFn1RamCost,\n getCurrentServer: () => RamCostConstants.ScriptSingularityFn1RamCost,\n connect: () => RamCostConstants.ScriptSingularityFn1RamCost,\n manualHack: () => RamCostConstants.ScriptSingularityFn1RamCost,\n installBackdoor: () => RamCostConstants.ScriptSingularityFn1RamCost,\n getStats: () => RamCostConstants.ScriptSingularityFn1RamCost / 4,\n getCharacterInformation: () => RamCostConstants.ScriptSingularityFn1RamCost / 4,\n getPlayer: () => RamCostConstants.ScriptSingularityFn1RamCost / 4,\n hospitalize: () => RamCostConstants.ScriptSingularityFn1RamCost / 4,\n isBusy: () => RamCostConstants.ScriptSingularityFn1RamCost / 4,\n stopAction: () => RamCostConstants.ScriptSingularityFn1RamCost / 2,\n upgradeHomeRam: () => RamCostConstants.ScriptSingularityFn2RamCost,\n getUpgradeHomeRamCost: () => RamCostConstants.ScriptSingularityFn2RamCost / 2,\n workForCompany: () => RamCostConstants.ScriptSingularityFn2RamCost,\n applyToCompany: () => RamCostConstants.ScriptSingularityFn2RamCost,\n getCompanyRep: () => RamCostConstants.ScriptSingularityFn2RamCost / 3,\n getCompanyFavor: () => RamCostConstants.ScriptSingularityFn2RamCost / 3,\n getCompanyFavorGain: () => RamCostConstants.ScriptSingularityFn2RamCost / 4,\n checkFactionInvitations: () => RamCostConstants.ScriptSingularityFn2RamCost,\n joinFaction: () => RamCostConstants.ScriptSingularityFn2RamCost,\n workForFaction: () => RamCostConstants.ScriptSingularityFn2RamCost,\n getFactionRep: () => RamCostConstants.ScriptSingularityFn2RamCost / 3,\n getFactionFavor: () => RamCostConstants.ScriptSingularityFn2RamCost / 3,\n getFactionFavorGain: () => RamCostConstants.ScriptSingularityFn2RamCost / 4,\n donateToFaction: () => RamCostConstants.ScriptSingularityFn3RamCost,\n createProgram: () => RamCostConstants.ScriptSingularityFn3RamCost,\n commitCrime: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getCrimeChance: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getCrimeStats: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getOwnedAugmentations: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getOwnedSourceFiles: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getAugmentationsFromFaction: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getAugmentationCost: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getAugmentationPrereq: () => RamCostConstants.ScriptSingularityFn3RamCost,\n getAugmentationPrice: () => RamCostConstants.ScriptSingularityFn3RamCost / 2,\n getAugmentationRepReq: () => RamCostConstants.ScriptSingularityFn3RamCost / 2,\n getAugmentationStats: () => RamCostConstants.ScriptSingularityFn3RamCost,\n purchaseAugmentation: () => RamCostConstants.ScriptSingularityFn3RamCost,\n softReset: () => RamCostConstants.ScriptSingularityFn3RamCost,\n installAugmentations: () => RamCostConstants.ScriptSingularityFn3RamCost,\n // Gang API\n gang: {\n createGang: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n inGang: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n getMemberNames: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n getGangInformation: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getOtherGangInformation: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getMemberInformation: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n canRecruitMember: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n recruitMember: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getTaskNames: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n getTaskStats: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n setMemberTask: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getEquipmentNames: () => RamCostConstants.ScriptGangApiBaseRamCost / 4,\n getEquipmentCost: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getEquipmentType: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getEquipmentStats: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n purchaseEquipment: () => RamCostConstants.ScriptGangApiBaseRamCost,\n ascendMember: () => RamCostConstants.ScriptGangApiBaseRamCost,\n setTerritoryWarfare: () => RamCostConstants.ScriptGangApiBaseRamCost / 2,\n getChanceToWinClash: () => RamCostConstants.ScriptGangApiBaseRamCost,\n getBonusTime: () => 0\n },\n // Bladeburner API\n bladeburner: {\n getContractNames: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 10,\n getOperationNames: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 10,\n getBlackOpNames: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 10,\n getBlackOpRank: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 2,\n getGeneralActionNames: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 10,\n getSkillNames: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 10,\n startAction: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n stopBladeburnerAction: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 2,\n getCurrentAction: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost / 4,\n getActionTime: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionEstimatedSuccessChance: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionRepGain: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionCountRemaining: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionMaxLevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionCurrentLevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getActionAutolevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n setActionAutolevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n setActionLevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getRank: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getSkillPoints: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getSkillLevel: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getSkillUpgradeCost: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n upgradeSkill: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getTeamSize: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n setTeamSize: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getCityEstimatedPopulation: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getCityEstimatedCommunities: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getCityChaos: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getCity: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n switchCity: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getStamina: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n joinBladeburnerFaction: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n joinBladeburnerDivision: () => RamCostConstants.ScriptBladeburnerApiBaseRamCost,\n getBonusTime: () => 0\n },\n // Coding Contract API\n codingcontract: {\n attempt: () => RamCostConstants.ScriptCodingContractBaseRamCost,\n getContractType: () => RamCostConstants.ScriptCodingContractBaseRamCost / 2,\n getData: () => RamCostConstants.ScriptCodingContractBaseRamCost / 2,\n getDescription: () => RamCostConstants.ScriptCodingContractBaseRamCost / 2,\n getNumTriesRemaining: () => RamCostConstants.ScriptCodingContractBaseRamCost / 5\n },\n // Duplicate Sleeve API\n sleeve: {\n getNumSleeves: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToShockRecovery: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToSynchronize: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToCommitCrime: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToUniversityCourse: () => RamCostConstants.ScriptSleeveBaseRamCost,\n travel: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToCompanyWork: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToFactionWork: () => RamCostConstants.ScriptSleeveBaseRamCost,\n setToGymWorkout: () => RamCostConstants.ScriptSleeveBaseRamCost,\n getSleeveStats: () => RamCostConstants.ScriptSleeveBaseRamCost,\n getTask: () => RamCostConstants.ScriptSleeveBaseRamCost,\n getInformation: () => RamCostConstants.ScriptSleeveBaseRamCost,\n getSleeveAugmentations: () => RamCostConstants.ScriptSleeveBaseRamCost,\n getSleevePurchasableAugs: () => RamCostConstants.ScriptSleeveBaseRamCost,\n purchaseSleeveAug: () => RamCostConstants.ScriptSleeveBaseRamCost\n },\n heart: {\n // Easter egg function\n break: () => 0\n }\n};\nfunction getRamCost(...args) {\n if (args.length === 0) {\n console.warn(`No arguments passed to getRamCost()`);\n return 0;\n }\n\n let curr = RamCosts[args[0]];\n\n for (let i = 1; i < args.length; ++i) {\n if (curr == null) {\n console.warn(`Invalid function passed to getRamCost: ${args}`);\n return 0;\n }\n\n const currType = typeof curr;\n\n if (currType === \"function\" || currType === \"number\") {\n break;\n }\n\n curr = curr[args[i]];\n }\n\n const currType = typeof curr;\n\n if (currType === \"function\") {\n return curr();\n }\n\n if (currType === \"number\") {\n return curr;\n }\n\n console.warn(`Unexpected type (${currType}) for value [${args}]`);\n return 0;\n}\n\n//# sourceURL=webpack:///./src/Netscript/RamCostGenerator.ts?");
-
-/***/ }),
-/* 12 */
-/*!****************************************!*\
- !*** ./utils/StringHelperFunctions.ts ***!
- \****************************************/
-/*! exports provided: convertTimeMsToTimeElapsedString, longestCommonStart, containsAllStrings, formatNumber, isHTML, generateRandomString, replaceAt */
-/*! exports used: containsAllStrings, convertTimeMsToTimeElapsedString, formatNumber, generateRandomString, longestCommonStart */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return convertTimeMsToTimeElapsedString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return longestCommonStart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return containsAllStrings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return formatNumber; });\n/* unused harmony export isHTML */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return generateRandomString; });\n/* unused harmony export replaceAt */\n/* harmony import */ var _helpers_isString__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers/isString */ 83);\n // Netburner String helper functions\n// Replaces the character at an index with a new character\n\nfunction replaceAt(base, index, character) {\n return base.substr(0, index) + character + base.substr(index + character.length);\n}\n/*\nConverts a date representing time in milliseconds to a string with the format H hours M minutes and S seconds\ne.g. 10000 -> \"10 seconds\"\n 120000 -> \"2 minutes and 0 seconds\"\n*/\n\n\nfunction convertTimeMsToTimeElapsedString(time, showMilli = false) {\n time = Math.floor(time);\n const millisecondsPerSecond = 1000;\n const secondPerMinute = 60;\n const minutesPerHours = 60;\n const secondPerHours = secondPerMinute * minutesPerHours;\n const hoursPerDays = 24;\n const secondPerDay = secondPerHours * hoursPerDays; // Convert ms to seconds, since we only have second-level precision\n\n const totalSeconds = Math.floor(time / millisecondsPerSecond);\n const days = Math.floor(totalSeconds / secondPerDay);\n const secTruncDays = totalSeconds % secondPerDay;\n const hours = Math.floor(secTruncDays / secondPerHours);\n const secTruncHours = secTruncDays % secondPerHours;\n const minutes = Math.floor(secTruncHours / secondPerMinute);\n const secTruncMinutes = secTruncHours % secondPerMinute;\n\n const milliTruncSec = (() => {\n let str = `${time % millisecondsPerSecond}`;\n\n while (str.length < 3) str = \"0\" + str;\n\n return str;\n })();\n\n const seconds = showMilli ? `${secTruncMinutes}.${milliTruncSec}` : `${secTruncMinutes}`;\n let res = \"\";\n\n if (days > 0) {\n res += `${days} days `;\n }\n\n if (hours > 0) {\n res += `${hours} hours `;\n }\n\n if (minutes > 0) {\n res += `${minutes} minutes `;\n }\n\n res += `${seconds} seconds`;\n return res;\n} // Finds the longest common starting substring in a set of strings\n\n\nfunction longestCommonStart(strings) {\n if (!containsAllStrings(strings)) {\n return \"\";\n }\n\n if (strings.length === 0) {\n return \"\";\n }\n\n const A = strings.concat().sort();\n const a1 = A[0];\n const a2 = A[A.length - 1];\n const L = a1.length;\n let i = 0;\n\n const areEqualCaseInsensitive = (a, b) => a.toUpperCase() === b.toUpperCase();\n\n while (i < L && areEqualCaseInsensitive(a1.charAt(i), a2.charAt(i))) {\n i++;\n }\n\n return a1.substring(0, i);\n} // Returns whether an array contains entirely of string objects\n\n\nfunction containsAllStrings(arr) {\n return arr.every(_helpers_isString__WEBPACK_IMPORTED_MODULE_0__[/* isString */ \"a\"]);\n} // Formats a number with commas and a specific number of decimal digits\n\n\nfunction formatNumber(num, numFractionDigits = 0) {\n return num.toLocaleString(undefined, {\n maximumFractionDigits: numFractionDigits,\n minimumFractionDigits: numFractionDigits\n });\n} // Checks if a string contains HTML elements\n\n\nfunction isHTML(str) {\n const element = document.createElement(\"div\");\n element.innerHTML = str;\n const c = element.childNodes;\n\n for (let i = c.length - 1; i >= 0; i--) {\n if (c[i].nodeType === 1) {\n return true;\n }\n }\n\n return false;\n} // Generates a random alphanumeric string with N characters\n\n\nfunction generateRandomString(n) {\n let str = \"\";\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (let i = 0; i < n; i++) {\n str += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return str;\n}\n\n\n\n//# sourceURL=webpack:///./utils/StringHelperFunctions.ts?");
-
-/***/ }),
-/* 13 */
-/*!********************************!*\
- !*** ./src/ui/React/Money.tsx ***!
- \********************************/
-/*! exports provided: Money */
-/*! exports used: Money */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Money; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/numeralFormat */ 3);\n\n\nfunction Money(props) {\n if (props.player !== undefined) {\n if (typeof props.money !== \"number\") throw new Error(\"if player if provided, money should be number, contact dev\");\n if (!props.player.canAfford(props.money)) return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"unbuyable samefont\"\n }, _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__[/* numeralWrapper */ \"a\"].formatMoney(props.money));\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"money-gold samefont\"\n }, typeof props.money === \"number\" ? _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__[/* numeralWrapper */ \"a\"].formatMoney(props.money) : props.money);\n}\n\n//# sourceURL=webpack:///./src/ui/React/Money.tsx?");
-
-/***/ }),
-/* 14 */,
-/* 15 */
-/*!******************************!*\
- !*** ./utils/JSONReviver.js ***!
- \******************************/
-/*! exports provided: Reviver, Generic_toJSON, Generic_fromJSON */
-/*! exports used: Generic_fromJSON, Generic_toJSON, Reviver */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return Reviver; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return Generic_toJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Generic_fromJSON; });\n/* Generic Reviver, toJSON, and fromJSON functions used for saving and loading objects */\n// A generic \"smart reviver\" function.\n// Looks for object values with a `ctor` property and\n// a `data` property. If it finds them, and finds a matching\n// constructor that has a `fromJSON` property on it, it hands\n// off to that `fromJSON` fuunction, passing in the value.\nfunction Reviver(key, value) {\n var ctor;\n\n if (value == null) {\n console.log(\"Reviver WRONGLY called with key: \" + key + \", and value: \" + value);\n return 0;\n }\n\n if (typeof value === \"object\" && typeof value.ctor === \"string\" && typeof value.data !== \"undefined\") {\n // Compatibility for version v0.43.1\n // TODO Remove this eventually\n if (value.ctor === \"AllServersMap\") {\n console.log(\"Converting AllServersMap for v0.43.1\");\n return value.data;\n }\n\n ctor = Reviver.constructors[value.ctor] || window[value.ctor];\n\n if (typeof ctor === \"function\" && typeof ctor.fromJSON === \"function\") {\n return ctor.fromJSON(value);\n }\n }\n\n return value;\n}\n\nReviver.constructors = {}; // A list of constructors the smart reviver should know about\n// A generic \"toJSON\" function that creates the data expected\n// by Reviver.\n// `ctorName` The name of the constructor to use to revive it\n// `obj` The object being serialized\n// `keys` (Optional) Array of the properties to serialize,\n// if not given then all of the objects \"own\" properties\n// that don't have function values will be serialized.\n// (Note: If you list a property in `keys`, it will be serialized\n// regardless of whether it's an \"own\" property.)\n// Returns: The structure (which will then be turned into a string\n// as part of the JSON.stringify algorithm)\n\nfunction Generic_toJSON(ctorName, obj, keys) {\n var data, key;\n\n if (!keys) {\n keys = Object.keys(obj); // Only \"own\" properties are included\n }\n\n data = {};\n\n for (let index = 0; index < keys.length; ++index) {\n key = keys[index];\n data[key] = obj[key];\n }\n\n return {\n ctor: ctorName,\n data: data\n };\n} // A generic \"fromJSON\" function for use with Reviver: Just calls the\n// constructor function with no arguments, then applies all of the\n// key/value pairs from the raw data to the instance. Only useful for\n// constructors that can be reasonably called without arguments!\n// `ctor` The constructor to call\n// `data` The data to apply\n// Returns: The object\n\n\nfunction Generic_fromJSON(ctor, data) {\n var obj, name;\n obj = new ctor();\n\n for (name in data) {\n obj[name] = data[name];\n }\n\n return obj;\n}\n\n\n\n//# sourceURL=webpack:///./utils/JSONReviver.js?");
-
-/***/ }),
-/* 16 */,
-/* 17 */,
-/* 18 */,
-/* 19 */
-/*!***************************************!*\
- !*** ./utils/helpers/getRandomInt.ts ***!
- \***************************************/
-/*! exports provided: getRandomInt */
-/*! exports used: getRandomInt */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getRandomInt; });\n/**\n * Gets a random integer bounded by the values passed in.\n * @param min The minimum value in the range.\n * @param max The maximum value in the range.\n */\nfunction getRandomInt(min, max) {\n const lower = Math.min(min, max);\n const upper = Math.max(min, max);\n return Math.floor(Math.random() * (upper - lower + 1)) + lower;\n}\n\n//# sourceURL=webpack:///./utils/helpers/getRandomInt.ts?");
-
-/***/ }),
-/* 20 */
-/*!**************************************!*\
- !*** ./src/ui/React/createPopup.tsx ***!
- \**************************************/
-/*! exports provided: createPopup, removePopup */
-/*! exports used: createPopup, removePopup */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return createPopup; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return removePopup; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ 119);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Popup */ 643);\n/* harmony import */ var _utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../utils/uiHelpers/createElement */ 116);\n/* harmony import */ var _utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../utils/uiHelpers/removeElementById */ 213);\n/**\n * Create a pop-up dialog box using React.\n *\n * Calling this function with the same ID and React Root Component will trigger a re-render\n *\n * @param id The (hopefully) unique identifier for the popup container\n * @param rootComponent Root React Component for the content (NOT the popup containers themselves)\n */\n\n\n\n\n\nlet gameContainer;\n\n(function () {\n function getGameContainer() {\n const container = document.getElementById(\"entire-game-container\");\n\n if (container == null) {\n throw new Error(`Failed to find game container DOM element`);\n }\n\n gameContainer = container;\n document.removeEventListener(\"DOMContentLoaded\", getGameContainer);\n }\n\n document.addEventListener(\"DOMContentLoaded\", getGameContainer);\n})(); // This variable is used to avoid setting the semi-transparent background\n// several times on top of one another. Sometimes there's several popup at once.\n\n\nlet deepestPopupId = \"\"; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nfunction createPopup(id, rootComponent, props, onClose) {\n let container = document.getElementById(id);\n\n if (container == null) {\n function onClick(event) {\n if (!event.srcElement) return;\n if (!(event.srcElement instanceof HTMLElement)) return;\n const clickedId = event.srcElement.id;\n if (clickedId !== id) return;\n removePopup(id);\n if (onClose) onClose();\n }\n\n const backgroundColor = deepestPopupId === \"\" ? \"rgba(0,0,0,0.5)\" : \"rgba(0,0,0,0)\";\n container = Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_3__[/* createElement */ \"a\"])(\"div\", {\n class: \"popup-box-container\",\n display: \"flex\",\n id: id,\n backgroundColor: backgroundColor,\n mouseDown: onClick\n });\n gameContainer.appendChild(container);\n }\n\n if (deepestPopupId === \"\") deepestPopupId = id;\n react_dom__WEBPACK_IMPORTED_MODULE_1__[\"render\"](react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](_Popup__WEBPACK_IMPORTED_MODULE_2__[/* Popup */ \"a\"], {\n content: rootComponent,\n id: id,\n props: props,\n removePopup: () => {\n removePopup(id);\n if (onClose) onClose();\n }\n }), container);\n return container;\n}\n/**\n * Closes a popup created with the createPopup() function above\n */\n\nfunction removePopup(id) {\n const content = document.getElementById(`${id}`);\n if (content == null) return;\n react_dom__WEBPACK_IMPORTED_MODULE_1__[\"unmountComponentAtNode\"](content);\n Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_4__[/* removeElementById */ \"a\"])(id);\n Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_4__[/* removeElementById */ \"a\"])(`${id}-close`);\n if (id === deepestPopupId) deepestPopupId = \"\";\n}\n\n//# sourceURL=webpack:///./src/ui/React/createPopup.tsx?");
-
-/***/ }),
-/* 21 */
-/*!*******************************************!*\
- !*** ./src/Augmentation/Augmentations.ts ***!
- \*******************************************/
-/*! exports provided: Augmentations */
-/*! exports used: Augmentations */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Augmentations; });\nconst Augmentations = {};\n\n//# sourceURL=webpack:///./src/Augmentation/Augmentations.ts?");
-
-/***/ }),
-/* 22 */
-/*!*****************************************!*\
- !*** ./src/Locations/data/CityNames.ts ***!
- \*****************************************/
-/*! exports provided: CityName */
-/*! exports used: CityName */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return CityName; });\n/**\n * All possible Cities in the game. Names only, not actual \"City\" object\n * Implemented as an enum for typing purposes\n */\nlet CityName;\n\n(function (CityName) {\n CityName[\"Aevum\"] = \"Aevum\";\n CityName[\"Chongqing\"] = \"Chongqing\";\n CityName[\"Ishima\"] = \"Ishima\";\n CityName[\"NewTokyo\"] = \"New Tokyo\";\n CityName[\"Sector12\"] = \"Sector-12\";\n CityName[\"Volhaven\"] = \"Volhaven\";\n})(CityName || (CityName = {}));\n\n//# sourceURL=webpack:///./src/Locations/data/CityNames.ts?");
-
-/***/ }),
-/* 23 */
-/*!*********************************!*\
- !*** ./src/Faction/Factions.ts ***!
- \*********************************/
-/*! exports provided: Factions, loadFactions, AddToFactions, factionExists, initFactions, resetFaction */
-/*! exports used: Factions, factionExists, initFactions, loadFactions */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Factions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return loadFactions; });\n/* unused harmony export AddToFactions */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return factionExists; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initFactions; });\n/* unused harmony export resetFaction */\n/* harmony import */ var _Faction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Faction */ 137);\n/* harmony import */ var _FactionInfo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FactionInfo */ 436);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n/**\n * Initialization and manipulation of the Factions object, which stores data\n * about all Factions in the game\n */\n\n\n\nlet Factions = {};\nfunction loadFactions(saveString) {\n Factions = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_2__[/* Reviver */ \"c\"]);\n}\nfunction AddToFactions(faction) {\n const name = faction.name;\n Factions[name] = faction;\n}\nfunction factionExists(name) {\n return Factions.hasOwnProperty(name);\n}\nfunction initFactions() {\n for (const name in _FactionInfo__WEBPACK_IMPORTED_MODULE_1__[/* FactionInfos */ \"a\"]) {\n resetFaction(new _Faction__WEBPACK_IMPORTED_MODULE_0__[/* Faction */ \"a\"](name));\n }\n} //Resets a faction during (re-)initialization. Saves the favor in the new\n//Faction object and deletes the old Faction Object from \"Factions\". Then\n//reinserts the new Faction object\n\nfunction resetFaction(newFactionObject) {\n if (!(newFactionObject instanceof _Faction__WEBPACK_IMPORTED_MODULE_0__[/* Faction */ \"a\"])) {\n throw new Error(\"Invalid argument 'newFactionObject' passed into resetFaction()\");\n }\n\n const factionName = newFactionObject.name;\n\n if (factionExists(factionName)) {\n newFactionObject.favor = Factions[factionName].favor;\n delete Factions[factionName];\n }\n\n AddToFactions(newFactionObject);\n}\n\n//# sourceURL=webpack:///./src/Faction/Factions.ts?");
-
-/***/ }),
-/* 24 */
-/*!************************************!*\
- !*** ./src/ui/React/StdButton.tsx ***!
- \************************************/
-/*! exports provided: StdButton */
-/*! exports used: StdButton */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return StdButton; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/**\n * Basic stateless button\n * Uses the 'std-button' css class\n */\n\nfunction StdButton(props) {\n const hasTooltip = props.tooltip != null && props.tooltip !== \"\";\n let className = props.disabled ? \"std-button-disabled\" : \"std-button\";\n\n if (hasTooltip) {\n className += \" tooltip\";\n }\n\n if (typeof props.addClasses === \"string\") {\n className += ` ${props.addClasses}`;\n } // Tooltip will be set using inner HTML\n\n\n let tooltip;\n\n if (hasTooltip) {\n if (typeof props.tooltip === \"string\") {\n const tooltipMarkup = {\n __html: props.tooltip\n };\n tooltip = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"tooltiptext\",\n dangerouslySetInnerHTML: tooltipMarkup\n });\n } else {\n tooltip = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"tooltiptext\"\n }, props.tooltip);\n }\n }\n\n return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"button\", {\n className: className,\n id: props.id,\n onClick: props.onClick,\n onKeyUp: props.onKeyUp,\n style: props.style,\n autoFocus: props.autoFocus\n }, props.text, hasTooltip && tooltip);\n}\n\n//# sourceURL=webpack:///./src/ui/React/StdButton.tsx?");
-
-/***/ }),
-/* 25 */
-/*!**************************************************!*\
- !*** ./src/Company/data/companypositionnames.ts ***!
- \**************************************************/
-/*! exports provided: SoftwareCompanyPositions, ITCompanyPositions, SecurityEngineerCompanyPositions, NetworkEngineerCompanyPositions, BusinessCompanyPositions, SecurityCompanyPositions, AgentCompanyPositions, MiscCompanyPositions, SoftwareConsultantCompanyPositions, BusinessConsultantCompanyPositions, PartTimeCompanyPositions */
-/*! exports used: AgentCompanyPositions, BusinessCompanyPositions, BusinessConsultantCompanyPositions, ITCompanyPositions, MiscCompanyPositions, NetworkEngineerCompanyPositions, PartTimeCompanyPositions, SecurityCompanyPositions, SecurityEngineerCompanyPositions, SoftwareCompanyPositions, SoftwareConsultantCompanyPositions */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return SoftwareCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return ITCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return SecurityEngineerCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return NetworkEngineerCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return BusinessCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return SecurityCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AgentCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return MiscCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return SoftwareConsultantCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return BusinessConsultantCompanyPositions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return PartTimeCompanyPositions; });\n// Defs for job titles, stored in arrays and categorized by job \"type\"\nconst SoftwareCompanyPositions = [\"Software Engineering Intern\", \"Junior Software Engineer\", \"Senior Software Engineer\", \"Lead Software Developer\", \"Head of Software\", \"Head of Engineering\", \"Vice President of Technology\", \"Chief Technology Officer\"];\nconst ITCompanyPositions = [\"IT Intern\", \"IT Analyst\", \"IT Manager\", \"Systems Administrator\"];\nconst SecurityEngineerCompanyPositions = [\"Security Engineer\"];\nconst NetworkEngineerCompanyPositions = [\"Network Engineer\", \"Network Administrator\"];\nconst BusinessCompanyPositions = [\"Business Intern\", \"Business Analyst\", \"Business Manager\", \"Operations Manager\", \"Chief Financial Officer\", \"Chief Executive Officer\"];\nconst SecurityCompanyPositions = [\"Police Officer\", \"Police Chief\", \"Security Guard\", \"Security Officer\", \"Security Supervisor\", \"Head of Security\"];\nconst AgentCompanyPositions = [\"Field Agent\", \"Secret Agent\", \"Special Operative\"];\nconst MiscCompanyPositions = [\"Waiter\", \"Employee\"];\nconst SoftwareConsultantCompanyPositions = [\"Software Consultant\", \"Senior Software Consultant\"];\nconst BusinessConsultantCompanyPositions = [\"Business Consultant\", \"Senior Business Consultant\"];\nconst PartTimeCompanyPositions = [\"Part-time Waiter\", \"Part-time Employee\"];\n\n//# sourceURL=webpack:///./src/Company/data/companypositionnames.ts?");
-
-/***/ }),
-/* 26 */
-/*!**************************!*\
- !*** ./src/ui/Router.ts ***!
- \**************************/
-/*! exports provided: Page */
-/*! exports used: Page */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Page; });\n/**\n * The full-screen page the player is currently be on.\n * These pages are mutually exclusive.\n */\nlet Page;\n/**\n * This class keeps track of player navigation/routing within the game.\n */\n\n(function (Page) {\n Page[Page[\"ActiveScripts\"] = 0] = \"ActiveScripts\";\n Page[Page[\"Augmentations\"] = 1] = \"Augmentations\";\n Page[Page[\"BitVerse\"] = 2] = \"BitVerse\";\n Page[Page[\"Bladeburner\"] = 3] = \"Bladeburner\";\n Page[Page[\"City\"] = 4] = \"City\";\n Page[Page[\"Corporation\"] = 5] = \"Corporation\";\n Page[Page[\"CreateProgram\"] = 6] = \"CreateProgram\";\n Page[Page[\"CreateScript\"] = 7] = \"CreateScript\";\n Page[Page[\"DevMenu\"] = 8] = \"DevMenu\";\n Page[Page[\"Faction\"] = 9] = \"Faction\";\n Page[Page[\"Factions\"] = 10] = \"Factions\";\n Page[Page[\"Gang\"] = 11] = \"Gang\";\n Page[Page[\"Hacknet\"] = 12] = \"Hacknet\";\n Page[Page[\"Infiltration\"] = 13] = \"Infiltration\";\n Page[Page[\"Job\"] = 14] = \"Job\";\n Page[Page[\"Milestones\"] = 15] = \"Milestones\";\n Page[Page[\"Options\"] = 16] = \"Options\";\n Page[Page[\"Resleeves\"] = 17] = \"Resleeves\";\n Page[Page[\"Sleeves\"] = 18] = \"Sleeves\";\n Page[Page[\"Stats\"] = 19] = \"Stats\";\n Page[Page[\"StockMarket\"] = 20] = \"StockMarket\";\n Page[Page[\"Terminal\"] = 21] = \"Terminal\";\n Page[Page[\"Travel\"] = 22] = \"Travel\";\n Page[Page[\"Tutorial\"] = 23] = \"Tutorial\";\n Page[Page[\"Work\"] = 24] = \"Work\";\n Page[Page[\"BladeburnerCinematic\"] = 25] = \"BladeburnerCinematic\";\n Page[Page[\"Location\"] = 26] = \"Location\";\n})(Page || (Page = {}));\n\n//# sourceURL=webpack:///./src/ui/Router.ts?");
-
-/***/ }),
-/* 27 */,
-/* 28 */
-/*!*******************************************!*\
- !*** ./src/Augmentation/Augmentation.tsx ***!
- \*******************************************/
-/*! exports provided: Augmentation */
-/*! exports used: Augmentation */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Augmentation; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BitNode/BitNodeMultipliers */ 8);\n/* harmony import */ var _Faction_Factions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Faction/Factions */ 23);\n/* harmony import */ var _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../ui/numeralFormat */ 3);\n/* harmony import */ var _ui_React_Money__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/React/Money */ 13);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\nfunction _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\n// Class definition for a single Augmentation object\n\n\n\n\n\n\n\nfunction generateStatsDescription(mults, programs, startingMoney) {\n const f = (x, decimals = 0) => {\n // look, I don't know how to make a \"smart decimals\"\n // todo, make it smarter\n if (x === 1.0777 - 1) return \"7.77%\";\n if (x === 1.777 - 1) return \"77.7%\";\n return _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_3__[/* numeralWrapper */ \"a\"].formatPercentage(x, decimals);\n };\n\n let desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, \"Effects:\");\n\n if (mults.hacking_mult && mults.hacking_mult == mults.strength_mult && mults.hacking_mult == mults.defense_mult && mults.hacking_mult == mults.dexterity_mult && mults.hacking_mult == mults.agility_mult && mults.hacking_mult == mults.charisma_mult) {\n desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_mult - 1), \" all skills\");\n } else {\n if (mults.hacking_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_mult - 1), \" hacking skill\");\n\n if (mults.strength_mult && mults.strength_mult == mults.defense_mult && mults.strength_mult == mults.dexterity_mult && mults.strength_mult == mults.agility_mult) {\n desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.strength_mult - 1), \" combat skills\");\n } else {\n if (mults.strength_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.strength_mult - 1), \" strength skill\");\n if (mults.defense_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.defense_mult - 1), \" defense skill\");\n if (mults.dexterity_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.dexterity_mult - 1), \" dexterity skill\");\n if (mults.agility_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.agility_mult - 1), \" agility skill\");\n }\n\n if (mults.charisma_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.charisma_mult - 1), \" Charisma skill\");\n }\n\n if (mults.hacking_exp_mult && mults.hacking_exp_mult === mults.strength_exp_mult && mults.hacking_exp_mult === mults.defense_exp_mult && mults.hacking_exp_mult === mults.dexterity_exp_mult && mults.hacking_exp_mult === mults.agility_exp_mult && mults.hacking_exp_mult === mults.charisma_exp_mult) {\n desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_exp_mult - 1), \" exp for all skills\");\n } else {\n if (mults.hacking_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_exp_mult - 1), \" hacking exp\");\n\n if (mults.strength_exp_mult && mults.strength_exp_mult === mults.defense_exp_mult && mults.strength_exp_mult === mults.dexterity_exp_mult && mults.strength_exp_mult === mults.agility_exp_mult) {\n desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.strength_exp_mult - 1), \" combat exp\");\n } else {\n if (mults.strength_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.strength_exp_mult - 1), \" strength exp\");\n if (mults.defense_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.defense_exp_mult - 1), \" defense exp\");\n if (mults.dexterity_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.dexterity_exp_mult - 1), \" dexterity exp\");\n if (mults.agility_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.agility_exp_mult - 1), \" agility exp\");\n }\n\n if (mults.charisma_exp_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.charisma_exp_mult - 1), \" charisma exp\");\n }\n\n if (mults.hacking_speed_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_speed_mult - 1), \" faster hack(), grow(), and weaken()\");\n if (mults.hacking_chance_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_chance_mult - 1), \" hack() success chance\");\n if (mults.hacking_money_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_money_mult - 1), \" hack() power\");\n if (mults.hacking_grow_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacking_grow_mult - 1), \" grow() power\");\n\n if (mults.faction_rep_mult && mults.faction_rep_mult === mults.company_rep_mult) {\n desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.faction_rep_mult - 1), \" reputation from factions and companies\");\n } else {\n if (mults.faction_rep_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.faction_rep_mult - 1), \" reputation from factions\");\n if (mults.company_rep_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.company_rep_mult - 1), \" reputation from companies\");\n }\n\n if (mults.crime_money_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.crime_money_mult - 1), \" crime money\");\n if (mults.crime_success_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.crime_success_mult - 1), \" crime success rate\");\n if (mults.work_money_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.work_money_mult - 1), \" work money\");\n if (mults.hacknet_node_money_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.hacknet_node_money_mult - 1), \" hacknet production\");\n if (mults.hacknet_node_purchase_cost_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"-\", f(-(mults.hacknet_node_purchase_cost_mult - 1)), \" hacknet nodes cost\");\n if (mults.hacknet_node_level_cost_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"-\", f(-(mults.hacknet_node_level_cost_mult - 1)), \" hacknet nodes upgrade cost\");\n if (mults.bladeburner_max_stamina_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.bladeburner_max_stamina_mult - 1), \" Bladeburner Max Stamina\");\n if (mults.bladeburner_stamina_gain_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.bladeburner_stamina_gain_mult - 1), \" Bladeburner Stamina gain\");\n if (mults.bladeburner_analysis_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.bladeburner_analysis_mult - 1), \" Bladeburner Field Analysis effectiveness\");\n if (mults.bladeburner_success_chance_mult) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"+\", f(mults.bladeburner_success_chance_mult - 1), \" Bladeburner Contracts and Operations success chance\");\n if (startingMoney) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"Start with \", react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](_ui_React_Money__WEBPACK_IMPORTED_MODULE_4__[/* Money */ \"a\"], {\n money: startingMoney\n }), \" after installing Augmentations.\");\n if (programs) desc = react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](react__WEBPACK_IMPORTED_MODULE_0__[\"Fragment\"], null, desc, react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"br\", null), \"Start with \", programs.join(\" and \"), \" after installing Augmentations.\");\n return desc;\n}\n\nclass Augmentation {\n // How much money this costs to buy\n // How much faction reputation is required to unlock this\n // Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)\n // Augmentation level - for repeatable Augs like NeuroFlux Governor\n // Name of Augmentation\n // Whether the player owns this Augmentation\n // Array of names of all prerequisites\n // Multipliers given by this Augmentation. Must match the property name in\n // The Player/Person classes\n // Initial cost. Doesn't change when you purchase multiple Augmentation\n constructor(params = {\n info: \"\",\n moneyCost: 0,\n name: \"\",\n repCost: 0\n }) {\n _defineProperty(this, \"baseCost\", 0);\n\n _defineProperty(this, \"baseRepRequirement\", 0);\n\n _defineProperty(this, \"isSpecial\", false);\n\n _defineProperty(this, \"level\", 0);\n\n _defineProperty(this, \"name\", \"\");\n\n _defineProperty(this, \"owned\", false);\n\n _defineProperty(this, \"prereqs\", []);\n\n _defineProperty(this, \"mults\", {});\n\n _defineProperty(this, \"startingCost\", 0);\n\n this.name = params.name;\n this.info = params.info;\n this.prereqs = params.prereqs ? params.prereqs : [];\n this.baseRepRequirement = params.repCost * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].AugmentationRepCost;\n this.baseCost = params.moneyCost * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].AugmentationMoneyCost;\n this.startingCost = this.baseCost;\n\n if (params.isSpecial) {\n this.isSpecial = true;\n }\n\n this.level = 0; // Set multipliers\n\n if (params.hacking_mult) {\n this.mults.hacking_mult = params.hacking_mult;\n }\n\n if (params.strength_mult) {\n this.mults.strength_mult = params.strength_mult;\n }\n\n if (params.defense_mult) {\n this.mults.defense_mult = params.defense_mult;\n }\n\n if (params.dexterity_mult) {\n this.mults.dexterity_mult = params.dexterity_mult;\n }\n\n if (params.agility_mult) {\n this.mults.agility_mult = params.agility_mult;\n }\n\n if (params.charisma_mult) {\n this.mults.charisma_mult = params.charisma_mult;\n }\n\n if (params.hacking_exp_mult) {\n this.mults.hacking_exp_mult = params.hacking_exp_mult;\n }\n\n if (params.strength_exp_mult) {\n this.mults.strength_exp_mult = params.strength_exp_mult;\n }\n\n if (params.defense_exp_mult) {\n this.mults.defense_exp_mult = params.defense_exp_mult;\n }\n\n if (params.dexterity_exp_mult) {\n this.mults.dexterity_exp_mult = params.dexterity_exp_mult;\n }\n\n if (params.agility_exp_mult) {\n this.mults.agility_exp_mult = params.agility_exp_mult;\n }\n\n if (params.charisma_exp_mult) {\n this.mults.charisma_exp_mult = params.charisma_exp_mult;\n }\n\n if (params.hacking_chance_mult) {\n this.mults.hacking_chance_mult = params.hacking_chance_mult;\n }\n\n if (params.hacking_speed_mult) {\n this.mults.hacking_speed_mult = params.hacking_speed_mult;\n }\n\n if (params.hacking_money_mult) {\n this.mults.hacking_money_mult = params.hacking_money_mult;\n }\n\n if (params.hacking_grow_mult) {\n this.mults.hacking_grow_mult = params.hacking_grow_mult;\n }\n\n if (params.company_rep_mult) {\n this.mults.company_rep_mult = params.company_rep_mult;\n }\n\n if (params.faction_rep_mult) {\n this.mults.faction_rep_mult = params.faction_rep_mult;\n }\n\n if (params.crime_money_mult) {\n this.mults.crime_money_mult = params.crime_money_mult;\n }\n\n if (params.crime_success_mult) {\n this.mults.crime_success_mult = params.crime_success_mult;\n }\n\n if (params.work_money_mult) {\n this.mults.work_money_mult = params.work_money_mult;\n }\n\n if (params.hacknet_node_money_mult) {\n this.mults.hacknet_node_money_mult = params.hacknet_node_money_mult;\n }\n\n if (params.hacknet_node_purchase_cost_mult) {\n this.mults.hacknet_node_purchase_cost_mult = params.hacknet_node_purchase_cost_mult;\n }\n\n if (params.hacknet_node_ram_cost_mult) {\n this.mults.hacknet_node_ram_cost_mult = params.hacknet_node_ram_cost_mult;\n }\n\n if (params.hacknet_node_core_cost_mult) {\n this.mults.hacknet_node_core_cost_mult = params.hacknet_node_core_cost_mult;\n }\n\n if (params.hacknet_node_level_cost_mult) {\n this.mults.hacknet_node_level_cost_mult = params.hacknet_node_level_cost_mult;\n }\n\n if (params.bladeburner_max_stamina_mult) {\n this.mults.bladeburner_max_stamina_mult = params.bladeburner_max_stamina_mult;\n }\n\n if (params.bladeburner_stamina_gain_mult) {\n this.mults.bladeburner_stamina_gain_mult = params.bladeburner_stamina_gain_mult;\n }\n\n if (params.bladeburner_analysis_mult) {\n this.mults.bladeburner_analysis_mult = params.bladeburner_analysis_mult;\n }\n\n if (params.bladeburner_success_chance_mult) {\n this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult;\n }\n\n if (params.stats) this.stats = params.stats;else this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);\n } // Adds this Augmentation to the specified Factions\n\n\n addToFactions(factionList) {\n for (let i = 0; i < factionList.length; ++i) {\n const faction = _Faction_Factions__WEBPACK_IMPORTED_MODULE_2__[/* Factions */ \"a\"][factionList[i]];\n\n if (faction == null) {\n console.warn(`In Augmentation.addToFactions(), could not find faction with this name: ${factionList[i]}`);\n continue;\n }\n\n faction.augmentations.push(this.name);\n }\n } // Adds this Augmentation to all Factions\n\n\n addToAllFactions() {\n for (const fac in _Faction_Factions__WEBPACK_IMPORTED_MODULE_2__[/* Factions */ \"a\"]) {\n if (_Faction_Factions__WEBPACK_IMPORTED_MODULE_2__[/* Factions */ \"a\"].hasOwnProperty(fac)) {\n const facObj = _Faction_Factions__WEBPACK_IMPORTED_MODULE_2__[/* Factions */ \"a\"][fac];\n\n if (facObj == null) {\n console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);\n continue;\n }\n\n facObj.augmentations.push(this.name);\n }\n }\n } // Serialize the current object to a JSON save state.\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Generic_toJSON */ \"b\"])(\"Augmentation\", this);\n } // Initiatizes a Augmentation object from a JSON save state.\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Generic_fromJSON */ \"a\"])(Augmentation, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Reviver */ \"c\"].constructors.Augmentation = Augmentation;\n\n//# sourceURL=webpack:///./src/Augmentation/Augmentation.tsx?");
-
-/***/ }),
-/* 29 */
-/*!**********************************!*\
- !*** ./src/Server/AllServers.ts ***!
- \**********************************/
-/*! exports provided: AllServers, ipExists, createUniqueRandomIp, AddToAllServers, initForeignServers, prestigeAllServers, loadAllServers */
-/*! exports used: AddToAllServers, AllServers, createUniqueRandomIp, initForeignServers, ipExists, loadAllServers, prestigeAllServers */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AllServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return ipExists; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return createUniqueRandomIp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AddToAllServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return initForeignServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return prestigeAllServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return loadAllServers; });\n/* harmony import */ var _Server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Server */ 93);\n/* harmony import */ var _SpecialServerIps__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SpecialServerIps */ 51);\n/* harmony import */ var _data_servers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data/servers */ 656);\n/* harmony import */ var _utils_IPAddress__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/IPAddress */ 241);\n/* harmony import */ var _utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/helpers/getRandomInt */ 19);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n\n\n\n\n\n\n/**\n * Map of all Servers that exist in the game\n * Key (string) = IP\n * Value = Server object\n */\n\nlet AllServers = {};\nfunction ipExists(ip) {\n return AllServers[ip] != null;\n}\nfunction createUniqueRandomIp() {\n const ip = Object(_utils_IPAddress__WEBPACK_IMPORTED_MODULE_3__[/* createRandomIp */ \"a\"])(); // If the Ip already exists, recurse to create a new one\n\n if (ipExists(ip)) {\n return Object(_utils_IPAddress__WEBPACK_IMPORTED_MODULE_3__[/* createRandomIp */ \"a\"])();\n }\n\n return ip;\n} // Saftely add a Server to the AllServers map\n\nfunction AddToAllServers(server) {\n const serverIp = server.ip;\n\n if (ipExists(serverIp)) {\n console.warn(`IP of server that's being added: ${serverIp}`);\n console.warn(`Hostname of the server thats being added: ${server.hostname}`);\n console.warn(`The server that already has this IP is: ${AllServers[serverIp].hostname}`);\n throw new Error(\"Error: Trying to add a server with an existing IP\");\n }\n\n AllServers[serverIp] = server;\n}\nfunction initForeignServers(homeComputer) {\n /* Create a randomized network for all the foreign servers */\n //Groupings for creating a randomized network\n const networkLayers = [];\n\n for (let i = 0; i < 15; i++) {\n networkLayers.push([]);\n } // Essentially any property that is of type 'number | IMinMaxRange'\n\n\n const propertiesToPatternMatch = [\"hackDifficulty\", \"moneyAvailable\", \"requiredHackingSkill\", \"serverGrowth\"];\n\n const toNumber = value => {\n switch (typeof value) {\n case \"number\":\n return value;\n\n case \"object\":\n return Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_4__[/* getRandomInt */ \"a\"])(value.min, value.max);\n\n default:\n throw Error(`Do not know how to convert the type '${typeof value}' to a number`);\n }\n };\n\n for (const metadata of _data_servers__WEBPACK_IMPORTED_MODULE_2__[/* serverMetadata */ \"a\"]) {\n const serverParams = {\n hostname: metadata.hostname,\n ip: createUniqueRandomIp(),\n numOpenPortsRequired: metadata.numOpenPortsRequired,\n organizationName: metadata.organizationName\n };\n\n if (metadata.maxRamExponent !== undefined) {\n serverParams.maxRam = Math.pow(2, toNumber(metadata.maxRamExponent));\n }\n\n for (const prop of propertiesToPatternMatch) {\n if (metadata[prop] !== undefined) {\n serverParams[prop] = toNumber(metadata[prop]);\n }\n }\n\n const server = new _Server__WEBPACK_IMPORTED_MODULE_0__[/* Server */ \"a\"](serverParams);\n\n for (const filename of metadata.literature || []) {\n server.messages.push(filename);\n }\n\n if (metadata.specialName !== undefined) {\n _SpecialServerIps__WEBPACK_IMPORTED_MODULE_1__[/* SpecialServerIps */ \"a\"].addIp(metadata.specialName, server.ip);\n }\n\n AddToAllServers(server);\n\n if (metadata.networkLayer !== undefined) {\n networkLayers[toNumber(metadata.networkLayer) - 1].push(server);\n }\n }\n /* Create a randomized network for all the foreign servers */\n\n\n const linkComputers = (server1, server2) => {\n server1.serversOnNetwork.push(server2.ip);\n server2.serversOnNetwork.push(server1.ip);\n };\n\n const getRandomArrayItem = arr => arr[Math.floor(Math.random() * arr.length)];\n\n const linkNetworkLayers = (network1, selectServer) => {\n for (const server of network1) {\n linkComputers(server, selectServer());\n }\n }; // Connect the first tier of servers to the player's home computer\n\n\n linkNetworkLayers(networkLayers[0], () => homeComputer);\n\n for (let i = 1; i < networkLayers.length; i++) {\n linkNetworkLayers(networkLayers[i], () => getRandomArrayItem(networkLayers[i - 1]));\n }\n}\nfunction prestigeAllServers() {\n for (const member in AllServers) {\n delete AllServers[member];\n }\n\n AllServers = {};\n}\nfunction loadAllServers(saveString) {\n AllServers = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Reviver */ \"c\"]);\n}\n\n//# sourceURL=webpack:///./src/Server/AllServers.ts?");
-
-/***/ }),
-/* 30 */,
-/* 31 */,
-/* 32 */
-/*!***************************************!*\
- !*** ./src/Hacknet/data/Constants.ts ***!
- \***************************************/
-/*! exports provided: HacknetNodeConstants, PurchaseMultipliers, HacknetServerConstants */
-/*! exports used: HacknetNodeConstants, HacknetServerConstants, PurchaseMultipliers */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return HacknetNodeConstants; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PurchaseMultipliers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return HacknetServerConstants; });\nconst HacknetNodeConstants = {\n MoneyGainPerLevel: 1.6,\n BaseCost: 1000,\n LevelBaseCost: 1,\n RamBaseCost: 30e3,\n CoreBaseCost: 500e3,\n PurchaseNextMult: 1.85,\n UpgradeLevelMult: 1.04,\n UpgradeRamMult: 1.28,\n UpgradeCoreMult: 1.48,\n MaxLevel: 200,\n MaxRam: 64,\n MaxCores: 16\n};\nconst PurchaseMultipliers = {\n x1: 1,\n x5: 5,\n x10: 10,\n MAX: \"MAX\"\n};\nconst HacknetServerConstants = {\n HashesPerLevel: 0.001,\n BaseCost: 50e3,\n RamBaseCost: 200e3,\n CoreBaseCost: 1e6,\n CacheBaseCost: 10e6,\n PurchaseMult: 3.2,\n UpgradeLevelMult: 1.1,\n UpgradeRamMult: 1.4,\n UpgradeCoreMult: 1.55,\n UpgradeCacheMult: 1.85,\n MaxServers: 20,\n MaxLevel: 300,\n MaxRam: 8192,\n MaxCores: 128,\n MaxCache: 15\n};\n\n//# sourceURL=webpack:///./src/Hacknet/data/Constants.ts?");
-
-/***/ }),
-/* 33 */
-/*!*********************************************!*\
- !*** ./src/Bladeburner/data/ActionTypes.ts ***!
- \*********************************************/
-/*! exports provided: ActionTypes */
-/*! exports used: ActionTypes */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ActionTypes; });\n// Action Identifier enum\nconst ActionTypes = {\n Idle: 1,\n Contract: 2,\n Operation: 3,\n BlackOp: 4,\n BlackOperation: 4,\n Training: 5,\n Recruitment: 6,\n FieldAnalysis: 7,\n \"Field Analysis\": 7,\n Diplomacy: 8,\n \"Hyperbolic Regeneration Chamber\": 9\n};\n\n//# sourceURL=webpack:///./src/Bladeburner/data/ActionTypes.ts?");
-
-/***/ }),
-/* 34 */
-/*!**********************************!*\
- !*** ./src/Settings/Settings.ts ***!
- \**********************************/
-/*! exports provided: Settings */
-/*! exports used: Settings */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Settings; });\n/* harmony import */ var _SettingEnums__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./SettingEnums */ 154);\n\n/**\n * Represents the default settings the player could customize.\n */\n\nconst defaultSettings = {\n AutosaveInterval: 60,\n CodeInstructionRunTime: 50,\n DisableASCIIArt: false,\n DisableHotkeys: false,\n DisableTextEffects: false,\n Locale: \"en\",\n MaxLogCapacity: 50,\n MaxPortCapacity: 50,\n MaxTerminalCapacity: 200,\n SuppressBuyAugmentationConfirmation: false,\n SuppressFactionInvites: false,\n SuppressHospitalizationPopup: false,\n SuppressMessages: false,\n SuppressTravelConfirmation: false,\n SuppressBladeburnerPopup: false\n};\n/**\n * The current options the player has customized to their play style.\n */\n// tslint:disable-next-line:variable-name\n\nconst Settings = {\n AutosaveInterval: defaultSettings.AutosaveInterval,\n CodeInstructionRunTime: 25,\n DisableASCIIArt: defaultSettings.DisableASCIIArt,\n DisableHotkeys: defaultSettings.DisableHotkeys,\n DisableTextEffects: defaultSettings.DisableTextEffects,\n Locale: \"en\",\n MaxLogCapacity: defaultSettings.MaxLogCapacity,\n MaxPortCapacity: defaultSettings.MaxPortCapacity,\n MaxTerminalCapacity: defaultSettings.MaxTerminalCapacity,\n OwnedAugmentationsOrder: _SettingEnums__WEBPACK_IMPORTED_MODULE_0__[/* OwnedAugmentationsOrderSetting */ \"a\"].AcquirementTime,\n PurchaseAugmentationsOrder: _SettingEnums__WEBPACK_IMPORTED_MODULE_0__[/* PurchaseAugmentationsOrderSetting */ \"b\"].Default,\n SuppressBuyAugmentationConfirmation: defaultSettings.SuppressBuyAugmentationConfirmation,\n SuppressFactionInvites: defaultSettings.SuppressFactionInvites,\n SuppressHospitalizationPopup: defaultSettings.SuppressHospitalizationPopup,\n SuppressMessages: defaultSettings.SuppressMessages,\n SuppressTravelConfirmation: defaultSettings.SuppressTravelConfirmation,\n SuppressBladeburnerPopup: defaultSettings.SuppressBladeburnerPopup,\n MonacoTheme: \"vs-dark\",\n MonacoInsertSpaces: false,\n\n init() {\n Object.assign(Settings, defaultSettings);\n },\n\n load(saveString) {\n Object.assign(Settings, JSON.parse(saveString));\n }\n\n};\n\n//# sourceURL=webpack:///./src/Settings/Settings.ts?");
-
-/***/ }),
-/* 35 */
-/*!*******************************************!*\
- !*** ./src/Corporation/data/Constants.ts ***!
- \*******************************************/
-/*! exports provided: CorporationConstants */
-/*! exports used: CorporationConstants */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return CorporationConstants; });\nconst CyclesPerMarketCycle = 50;\nconst AllCorporationStates = [\"START\", \"PURCHASE\", \"PRODUCTION\", \"SALE\", \"EXPORT\"];\nconst CorporationConstants = {\n INITIALSHARES: 1e9,\n //Total number of shares you have at your company\n SHARESPERPRICEUPDATE: 1e6,\n //When selling large number of shares, price is dynamically updated for every batch of this amount\n IssueNewSharesCooldown: 216e3,\n // 12 Hour in terms of game cycles\n SellSharesCooldown: 18e3,\n // 1 Hour in terms of game cycles\n CyclesPerMarketCycle: CyclesPerMarketCycle,\n CyclesPerIndustryStateCycle: CyclesPerMarketCycle / AllCorporationStates.length,\n SecsPerMarketCycle: CyclesPerMarketCycle / 5,\n Cities: [\"Aevum\", \"Chongqing\", \"Sector-12\", \"New Tokyo\", \"Ishima\", \"Volhaven\"],\n WarehouseInitialCost: 5e9,\n //Initial purchase cost of warehouse\n WarehouseInitialSize: 100,\n WarehouseUpgradeBaseCost: 1e9,\n OfficeInitialCost: 4e9,\n OfficeInitialSize: 3,\n OfficeUpgradeBaseCost: 1e9,\n BribeThreshold: 100e12,\n //Money needed to be able to bribe for faction rep\n BribeToRepRatio: 1e9,\n //Bribe Value divided by this = rep gain\n ProductProductionCostRatio: 5,\n //Ratio of material cost of a product to its production cost\n DividendMaxPercentage: 0.5,\n EmployeeSalaryMultiplier: 3,\n // Employee stats multiplied by this to determine initial salary\n CyclesPerEmployeeRaise: 400,\n // All employees get a raise every X market cycles\n EmployeeRaiseAmount: 50,\n // Employee salary increases by this (additive)\n BaseMaxProducts: 3,\n // Initial value for maximum number of products allowed\n AllCorporationStates: AllCorporationStates,\n AllMaterials: [\"Water\", \"Energy\", \"Food\", \"Plants\", \"Metal\", \"Hardware\", \"Chemicals\", \"Drugs\", \"Robots\", \"AI Cores\", \"Real Estate\"]\n};\n\n//# sourceURL=webpack:///./src/Corporation/data/Constants.ts?");
-
-/***/ }),
-/* 36 */
-/*!*************************************!*\
- !*** ./src/Server/ServerHelpers.ts ***!
- \*************************************/
-/*! exports provided: safetlyCreateUniqueServer, numCycleForGrowth, processSingleServerGrowth, prestigeHomeComputer, GetServerByHostname, getServer, getServerOnNetwork, isBackdoorInstalled */
-/*! exports used: GetServerByHostname, getServer, getServerOnNetwork, isBackdoorInstalled, numCycleForGrowth, prestigeHomeComputer, processSingleServerGrowth, safetlyCreateUniqueServer */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return safetlyCreateUniqueServer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return numCycleForGrowth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return processSingleServerGrowth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return prestigeHomeComputer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return GetServerByHostname; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getServer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getServerOnNetwork; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return isBackdoorInstalled; });\n/* harmony import */ var _AllServers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AllServers */ 29);\n/* harmony import */ var _Server__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Server */ 93);\n/* harmony import */ var _formulas_grow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formulas/grow */ 440);\n/* harmony import */ var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BitNode/BitNodeMultipliers */ 8);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Constants */ 5);\n/* harmony import */ var _Programs_Programs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Programs/Programs */ 54);\n/* harmony import */ var _Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Literature/data/LiteratureNames */ 45);\n/* harmony import */ var _utils_helpers_isValidNumber__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/helpers/isValidNumber */ 522);\n/* harmony import */ var _utils_helpers_isValidIPAddress__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../utils/helpers/isValidIPAddress */ 441);\n\n\n\n\n\n\n\n\n\n/**\n * Constructs a new server, while also ensuring that the new server\n * does not have a duplicate hostname/ip.\n */\n\nfunction safetlyCreateUniqueServer(params) {\n if (params.ip != null && Object(_AllServers__WEBPACK_IMPORTED_MODULE_0__[/* ipExists */ \"e\"])(params.ip)) {\n params.ip = Object(_AllServers__WEBPACK_IMPORTED_MODULE_0__[/* createUniqueRandomIp */ \"c\"])();\n }\n\n if (GetServerByHostname(params.hostname) != null) {\n // Use a for loop to ensure that we don't get suck in an infinite loop somehow\n let hostname = params.hostname;\n\n for (let i = 0; i < 200; ++i) {\n hostname = `${params.hostname}-${i}`;\n\n if (GetServerByHostname(hostname) == null) {\n break;\n }\n }\n\n params.hostname = hostname;\n }\n\n return new _Server__WEBPACK_IMPORTED_MODULE_1__[/* Server */ \"a\"](params);\n}\n/**\n * Returns the number of \"growth cycles\" needed to grow the specified server by the\n * specified amount.\n * @param server - Server being grown\n * @param growth - How much the server is being grown by, in DECIMAL form (e.g. 1.5 rather than 50)\n * @param p - Reference to Player object\n * @returns Number of \"growth cycles\" needed\n */\n\nfunction numCycleForGrowth(server, growth, p) {\n let ajdGrowthRate = 1 + (_Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].ServerBaseGrowthRate - 1) / server.hackDifficulty;\n\n if (ajdGrowthRate > _Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].ServerMaxGrowthRate) {\n ajdGrowthRate = _Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].ServerMaxGrowthRate;\n }\n\n const serverGrowthPercentage = server.serverGrowth / 100;\n const cycles = Math.log(growth) / (Math.log(ajdGrowthRate) * p.hacking_grow_mult * serverGrowthPercentage * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__[/* BitNodeMultipliers */ \"a\"].ServerGrowthRate);\n return cycles;\n} //Applied server growth for a single server. Returns the percentage growth\n\nfunction processSingleServerGrowth(server, threads, p, cores = 1) {\n let serverGrowth = Object(_formulas_grow__WEBPACK_IMPORTED_MODULE_2__[/* calculateServerGrowth */ \"a\"])(server, threads, p, cores);\n\n if (serverGrowth < 1) {\n console.warn(\"serverGrowth calculated to be less than 1\");\n serverGrowth = 1;\n }\n\n const oldMoneyAvailable = server.moneyAvailable;\n server.moneyAvailable *= serverGrowth; // in case of data corruption\n\n if (Object(_utils_helpers_isValidNumber__WEBPACK_IMPORTED_MODULE_7__[/* isValidNumber */ \"a\"])(server.moneyMax) && isNaN(server.moneyAvailable)) {\n server.moneyAvailable = server.moneyMax;\n } // cap at max\n\n\n if (Object(_utils_helpers_isValidNumber__WEBPACK_IMPORTED_MODULE_7__[/* isValidNumber */ \"a\"])(server.moneyMax) && server.moneyAvailable > server.moneyMax) {\n server.moneyAvailable = server.moneyMax;\n } // if there was any growth at all, increase security\n\n\n if (oldMoneyAvailable !== server.moneyAvailable) {\n //Growing increases server security twice as much as hacking\n let usedCycles = numCycleForGrowth(server, server.moneyAvailable / oldMoneyAvailable, p);\n usedCycles = Math.max(0, usedCycles);\n server.fortify(2 * _Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].ServerFortifyAmount * Math.ceil(usedCycles));\n }\n\n return server.moneyAvailable / oldMoneyAvailable;\n}\nfunction prestigeHomeComputer(homeComp) {\n const hasBitflume = homeComp.programs.includes(_Programs_Programs__WEBPACK_IMPORTED_MODULE_5__[/* Programs */ \"a\"].BitFlume.name);\n homeComp.programs.length = 0; //Remove programs\n\n homeComp.runningScripts = [];\n homeComp.serversOnNetwork = [];\n homeComp.isConnectedTo = true;\n homeComp.ramUsed = 0;\n homeComp.programs.push(_Programs_Programs__WEBPACK_IMPORTED_MODULE_5__[/* Programs */ \"a\"].NukeProgram.name);\n\n if (hasBitflume) {\n homeComp.programs.push(_Programs_Programs__WEBPACK_IMPORTED_MODULE_5__[/* Programs */ \"a\"].BitFlume.name);\n } //Update RAM usage on all scripts\n\n\n homeComp.scripts.forEach(function (script) {\n script.updateRamUsage(homeComp.scripts);\n });\n homeComp.messages.length = 0; //Remove .lit and .msg files\n\n homeComp.messages.push(_Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_6__[/* LiteratureNames */ \"a\"].HackersStartingHandbook);\n} //Returns server object with corresponding hostname\n// Relatively slow, would rather not use this a lot\n\nfunction GetServerByHostname(hostname) {\n for (const ip in _AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"]) {\n if (_AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"].hasOwnProperty(ip)) {\n if (_AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"][ip].hostname == hostname) {\n return _AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"][ip];\n }\n }\n }\n\n return null;\n} //Get server by IP or hostname. Returns null if invalid\n\nfunction getServer(s) {\n if (!Object(_utils_helpers_isValidIPAddress__WEBPACK_IMPORTED_MODULE_8__[/* isValidIPAddress */ \"a\"])(s)) {\n return GetServerByHostname(s);\n }\n\n if (_AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"][s] !== undefined) {\n return _AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"][s];\n }\n\n return null;\n} // Returns the i-th server on the specified server's network\n// A Server's serverOnNetwork property holds only the IPs. This function returns\n// the actual Server object\n\nfunction getServerOnNetwork(server, i) {\n if (i > server.serversOnNetwork.length) {\n console.error(\"Tried to get server on network that was out of range\");\n return null;\n }\n\n return _AllServers__WEBPACK_IMPORTED_MODULE_0__[/* AllServers */ \"b\"][server.serversOnNetwork[i]];\n}\nfunction isBackdoorInstalled(server) {\n if (\"backdoorInstalled\" in server) {\n return server.backdoorInstalled;\n }\n\n return false;\n}\n\n//# sourceURL=webpack:///./src/Server/ServerHelpers.ts?");
-
-/***/ }),
-/* 37 */
-/*!**********************************************!*\
- !*** ./src/Corporation/EmployeePositions.ts ***!
- \**********************************************/
-/*! exports provided: EmployeePositions */
-/*! exports used: EmployeePositions */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return EmployeePositions; });\nconst EmployeePositions = {\n Operations: \"Operations\",\n Engineer: \"Engineer\",\n Business: \"Business\",\n Management: \"Management\",\n RandD: \"Research & Development\",\n Training: \"Training\",\n Unassigned: \"Unassigned\"\n};\n\n//# sourceURL=webpack:///./src/Corporation/EmployeePositions.ts?");
-
-/***/ }),
-/* 38 */,
-/* 39 */,
-/* 40 */
-/*!***************************!*\
- !*** ./src/ui/Context.ts ***!
- \***************************/
-/*! exports provided: Context, use */
-/*! exports used: Context, use */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Context; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return use; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nconst Context = {\n Player: react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext({}),\n Router: react__WEBPACK_IMPORTED_MODULE_0___default.a.createContext({})\n};\nconst use = {\n Player: () => Object(react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"])(Context.Player),\n Router: () => Object(react__WEBPACK_IMPORTED_MODULE_0__[\"useContext\"])(Context.Router)\n};\n\n//# sourceURL=webpack:///./src/ui/Context.ts?");
-
-/***/ }),
-/* 41 */
-/*!******************************************!*\
- !*** ./src/Corporation/IndustryData.tsx ***!
- \******************************************/
-/*! exports provided: Industries, IndustryStartingCosts, IndustryDescriptions, IndustryResearchTrees, resetIndustryResearchTrees */
-/*! exports used: Industries, IndustryDescriptions, IndustryResearchTrees, IndustryStartingCosts, resetIndustryResearchTrees */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Industries; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return IndustryStartingCosts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return IndustryDescriptions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return IndustryResearchTrees; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return resetIndustryResearchTrees; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data/BaseResearchTree */ 87);\n/* harmony import */ var _ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui/MoneyCost */ 94);\n\n\n\n// Map of official names for each Industry\nconst Industries = {\n Energy: \"Energy\",\n Utilities: \"Water Utilities\",\n Agriculture: \"Agriculture\",\n Fishing: \"Fishing\",\n Mining: \"Mining\",\n Food: \"Food\",\n Tobacco: \"Tobacco\",\n Chemical: \"Chemical\",\n Pharmaceutical: \"Pharmaceutical\",\n Computer: \"Computer Hardware\",\n Robotics: \"Robotics\",\n Software: \"Software\",\n Healthcare: \"Healthcare\",\n RealEstate: \"RealEstate\"\n}; // Map of how much money it takes to start each industry\n\nconst IndustryStartingCosts = {\n Energy: 225e9,\n Utilities: 150e9,\n Agriculture: 40e9,\n Fishing: 80e9,\n Mining: 300e9,\n Food: 10e9,\n Tobacco: 20e9,\n Chemical: 70e9,\n Pharmaceutical: 200e9,\n Computer: 500e9,\n Robotics: 1e12,\n Software: 25e9,\n Healthcare: 750e9,\n RealEstate: 600e9\n}; // Map of description for each industry\n\nconst IndustryDescriptions = {\n Energy: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Engage in the production and distribution of energy.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Energy,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Utilities: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Distribute water and provide wastewater services.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Utilities,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Agriculture: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Cultivate crops and breed livestock to produce food.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Agriculture,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: YES\"),\n Fishing: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Produce food through the breeding and processing of fish and fish products.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Fishing,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Mining: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Extract and process metals from the earth.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Mining,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Food: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Create your own restaurants all around the world.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Food,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: YES\"),\n Tobacco: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Create and distribute tobacco and tobacco-related products.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Tobacco,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: YES\"),\n Chemical: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Produce industrial chemicals.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Chemical,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Pharmaceutical: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Discover, develop, and create new pharmaceutical drugs.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Pharmaceutical,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Computer: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Develop and manufacture new computer hardware and networking infrastructures.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Computer,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Robotics: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Develop and create robots.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Robotics,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n Software: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Develop computer software and create AI Cores.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Software,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: YES\"),\n Healthcare: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Create and manage hospitals.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.Healthcare,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\"),\n RealEstate: corp => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, \"Develop and manage real estate properties.\", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Starting cost: \", react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_ui_MoneyCost__WEBPACK_IMPORTED_MODULE_2__[/* MoneyCost */ \"a\"], {\n money: IndustryStartingCosts.RealEstate,\n corp: corp\n }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"br\", null), \"Recommended starting Industry: NO\")\n}; // Map of available Research for each Industry. This data is held in a\n// ResearchTree object\n\nconst IndustryResearchTrees = {\n Energy: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Utilities: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Agriculture: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Fishing: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Mining: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Food: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Tobacco: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Chemical: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])(),\n Pharmaceutical: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Computer: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Robotics: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Software: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n Healthcare: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])(),\n RealEstate: Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getProductIndustryResearchTreeCopy */ \"b\"])()\n};\nfunction resetIndustryResearchTrees() {\n IndustryResearchTrees.Energy = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Utilities = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Agriculture = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Fishing = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Mining = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Food = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Tobacco = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Chemical = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Pharmaceutical = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Computer = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Robotics = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Software = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.Healthcare = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n IndustryResearchTrees.RealEstate = Object(_data_BaseResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* getBaseResearchTreeCopy */ \"a\"])();\n}\n\n//# sourceURL=webpack:///./src/Corporation/IndustryData.tsx?");
-
-/***/ }),
-/* 42 */
-/*!*******************************************!*\
- !*** ./src/Locations/LocationTypeEnum.ts ***!
- \*******************************************/
-/*! exports provided: LocationType */
-/*! exports used: LocationType */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return LocationType; });\n/**\n * Enum defining the different types of possible locations\n */\nlet LocationType;\n\n(function (LocationType) {\n LocationType[LocationType[\"Company\"] = 0] = \"Company\";\n LocationType[LocationType[\"Gym\"] = 1] = \"Gym\";\n LocationType[LocationType[\"Hospital\"] = 2] = \"Hospital\";\n LocationType[LocationType[\"Slums\"] = 3] = \"Slums\";\n LocationType[LocationType[\"Special\"] = 4] = \"Special\";\n LocationType[LocationType[\"StockMarket\"] = 5] = \"StockMarket\";\n LocationType[LocationType[\"TechVendor\"] = 6] = \"TechVendor\";\n LocationType[LocationType[\"TravelAgency\"] = 7] = \"TravelAgency\";\n LocationType[LocationType[\"University\"] = 8] = \"University\";\n LocationType[LocationType[\"Casino\"] = 9] = \"Casino\";\n})(LocationType || (LocationType = {}));\n\n//# sourceURL=webpack:///./src/Locations/LocationTypeEnum.ts?");
-
-/***/ }),
-/* 43 */,
-/* 44 */
-/*!*******************************************!*\
- !*** ./src/Bladeburner/data/Constants.ts ***!
- \*******************************************/
-/*! exports provided: BladeburnerConstants */
-/*! exports used: BladeburnerConstants */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BladeburnerConstants; });\nconst BladeburnerConstants = {\n CityNames: [\"Aevum\", \"Chongqing\", \"Sector-12\", \"New Tokyo\", \"Ishima\", \"Volhaven\"],\n CyclesPerSecond: 5,\n // Game cycle is 200 ms\n StaminaGainPerSecond: 0.0085,\n BaseStaminaLoss: 0.285,\n // Base stamina loss per action. Increased based on difficulty\n MaxStaminaToGainFactor: 70000,\n // Max Stamina is divided by this to get bonus stamina gain\n DifficultyToTimeFactor: 10,\n // Action Difficulty divided by this to get base action time\n\n /**\n * The difficulty multiplier affects stamina loss and hp loss of an action. Also affects\n * experience gain. Its formula is:\n * difficulty ^ exponentialFactor + difficulty / linearFactor\n */\n DiffMultExponentialFactor: 0.28,\n DiffMultLinearFactor: 650,\n\n /**\n * These factors are used to calculate action time.\n * They affect how much action time is reduced based on your agility and dexterity\n */\n EffAgiLinearFactor: 10e3,\n EffDexLinearFactor: 10e3,\n EffAgiExponentialFactor: 0.04,\n EffDexExponentialFactor: 0.035,\n BaseRecruitmentTimeNeeded: 300,\n // Base time needed (s) to complete a Recruitment action\n PopulationThreshold: 1e9,\n // Population which determines baseline success rate\n PopulationExponent: 0.7,\n // Exponent that influences how different populations affect success rate\n ChaosThreshold: 50,\n // City chaos level after which it starts making tasks harder\n BaseStatGain: 1,\n // Base stat gain per second\n BaseIntGain: 0.003,\n // Base intelligence stat gain\n ActionCountGrowthPeriod: 480,\n // Time (s) it takes for action count to grow by its specified value\n RankToFactionRepFactor: 2,\n // Delta Faction Rep = this * Delta Rank\n RankNeededForFaction: 25,\n ContractSuccessesPerLevel: 3,\n // How many successes you need to level up a contract\n OperationSuccessesPerLevel: 2.5,\n // How many successes you need to level up an op\n RanksPerSkillPoint: 3,\n // How many ranks needed to get 1 Skill Point\n ContractBaseMoneyGain: 250e3,\n // Base Money Gained per contract\n HrcHpGain: 2,\n // HP Gained from Hyperbolic Regeneration chamber\n HrcStaminaGain: 1 // Percentage Stamina gained from Hyperbolic Regeneration Chamber\n\n};\n\n//# sourceURL=webpack:///./src/Bladeburner/data/Constants.ts?");
-
-/***/ }),
-/* 45 */
-/*!************************************************!*\
- !*** ./src/Literature/data/LiteratureNames.ts ***!
- \************************************************/
-/*! exports provided: LiteratureNames */
-/*! exports used: LiteratureNames */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return LiteratureNames; });\nconst LiteratureNames = {\n HackersStartingHandbook: \"hackers-starting-handbook.lit\",\n CorporationManagementHandbook: \"corporation-management-handbook.lit\",\n HistoryOfSynthoids: \"history-of-synthoids.lit\",\n AGreenTomorrow: \"A-Green-Tomorrow.lit\",\n AlphaOmega: \"alpha-omega.lit\",\n SimulatedReality: \"simulated-reality.lit\",\n BeyondMan: \"beyond-man.lit\",\n BrighterThanTheSun: \"brighter-than-the-sun.lit\",\n DemocracyIsDead: \"democracy-is-dead.lit\",\n Sector12Crime: \"sector-12-crime.lit\",\n ManAndMachine: \"man-and-machine.lit\",\n SecretSocieties: \"secret-societies.lit\",\n TheFailedFrontier: \"the-failed-frontier.lit\",\n CodedIntelligence: \"coded-intelligence.lit\",\n SyntheticMuscles: \"synthetic-muscles.lit\",\n TensionsInTechRace: \"tensions-in-tech-race.lit\",\n CostOfImmortality: \"cost-of-immortality.lit\",\n TheHiddenWorld: \"the-hidden-world.lit\",\n TheNewGod: \"the-new-god.lit\",\n NewTriads: \"new-triads.lit\",\n TheSecretWar: \"the-secret-war.lit\"\n};\n\n//# sourceURL=webpack:///./src/Literature/data/LiteratureNames.ts?");
-
-/***/ }),
-/* 46 */
-/*!****************************************!*\
- !*** ./src/Hacknet/HacknetHelpers.tsx ***!
- \****************************************/
-/*! exports provided: hasHacknetServers, purchaseHacknet, hasMaxNumberHacknetServers, getCostOfNextHacknetNode, getCostOfNextHacknetServer, getMaxNumberLevelUpgrades, getMaxNumberRamUpgrades, getMaxNumberCoreUpgrades, getMaxNumberCacheUpgrades, purchaseLevelUpgrade, purchaseRamUpgrade, purchaseCoreUpgrade, purchaseCacheUpgrade, processHacknetEarnings, updateHashManagerCapacity, purchaseHashUpgrade */
-/*! exports used: getCostOfNextHacknetNode, getCostOfNextHacknetServer, getMaxNumberCacheUpgrades, getMaxNumberCoreUpgrades, getMaxNumberLevelUpgrades, getMaxNumberRamUpgrades, hasHacknetServers, hasMaxNumberHacknetServers, processHacknetEarnings, purchaseCacheUpgrade, purchaseCoreUpgrade, purchaseHacknet, purchaseHashUpgrade, purchaseLevelUpgrade, purchaseRamUpgrade, updateHashManagerCapacity */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return hasHacknetServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return purchaseHacknet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return hasMaxNumberHacknetServers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getCostOfNextHacknetNode; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getCostOfNextHacknetServer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return getMaxNumberLevelUpgrades; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return getMaxNumberRamUpgrades; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return getMaxNumberCoreUpgrades; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getMaxNumberCacheUpgrades; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return purchaseLevelUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return purchaseRamUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return purchaseCoreUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return purchaseCacheUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return processHacknetEarnings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return updateHashManagerCapacity; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return purchaseHashUpgrade; });\n/* harmony import */ var _HacknetNode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./HacknetNode */ 249);\n/* harmony import */ var _formulas_HacknetNodes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formulas/HacknetNodes */ 200);\n/* harmony import */ var _formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formulas/HacknetServers */ 182);\n/* harmony import */ var _data_Constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./data/Constants */ 32);\n/* harmony import */ var _HacknetServer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./HacknetServer */ 85);\n/* harmony import */ var _HashManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./HashManager */ 291);\n/* harmony import */ var _HashUpgrades__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./HashUpgrades */ 218);\n/* harmony import */ var _CodingContractGenerator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../CodingContractGenerator */ 292);\n/* harmony import */ var _InteractiveTutorial__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../InteractiveTutorial */ 49);\n/* harmony import */ var _Server_AllServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Server/AllServers */ 29);\n/* harmony import */ var _Server_ServerHelpers__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Server/ServerHelpers */ 36);\n/* harmony import */ var _Server_Server__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Server/Server */ 93);\n/* harmony import */ var _SourceFile_SourceFileFlags__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../SourceFile/SourceFileFlags */ 50);\n/**\n * Generic helper/utility functions for the Hacknet mechanic:\n * - Purchase nodes/upgrades\n * - Calculating maximum number of upgrades\n * - Processing Hacknet earnings\n * - Updating Hash Manager capacity\n * - Purchasing hash upgrades\n *\n * TODO Should probably split the different types of functions into their own modules\n */\n\n\n\n\n\n\n\n\n\n\n\n\n // Returns a boolean indicating whether the player has Hacknet Servers\n// (the upgraded form of Hacknet Nodes)\n\nfunction hasHacknetServers(player) {\n return player.bitNodeN === 9 || _SourceFile_SourceFileFlags__WEBPACK_IMPORTED_MODULE_12__[/* SourceFileFlags */ \"a\"][9] > 0;\n}\nfunction purchaseHacknet(player) {\n /* INTERACTIVE TUTORIAL */\n if (_InteractiveTutorial__WEBPACK_IMPORTED_MODULE_8__[/* ITutorial */ \"a\"].isRunning) {\n if (_InteractiveTutorial__WEBPACK_IMPORTED_MODULE_8__[/* ITutorial */ \"a\"].currStep === _InteractiveTutorial__WEBPACK_IMPORTED_MODULE_8__[/* iTutorialSteps */ \"d\"].HacknetNodesIntroduction) {\n Object(_InteractiveTutorial__WEBPACK_IMPORTED_MODULE_8__[/* iTutorialNextStep */ \"b\"])();\n } else {\n return -1;\n }\n }\n /* END INTERACTIVE TUTORIAL */\n\n\n const numOwned = player.hacknetNodes.length;\n\n if (hasHacknetServers(player)) {\n const cost = getCostOfNextHacknetServer(player);\n\n if (isNaN(cost)) {\n throw new Error(`Calculated cost of purchasing HacknetServer is NaN`);\n }\n\n if (!player.canAfford(cost)) {\n return -1;\n }\n\n player.loseMoney(cost);\n player.createHacknetServer();\n updateHashManagerCapacity(player);\n return numOwned;\n } else {\n const cost = getCostOfNextHacknetNode(player);\n\n if (isNaN(cost)) {\n throw new Error(`Calculated cost of purchasing HacknetNode is NaN`);\n }\n\n if (!player.canAfford(cost)) {\n return -1;\n } // Auto generate a name for the Node\n\n\n const name = \"hacknet-node-\" + numOwned;\n const node = new _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"](name, player.hacknet_node_money_mult);\n player.loseMoney(cost);\n player.hacknetNodes.push(node);\n return numOwned;\n }\n}\nfunction hasMaxNumberHacknetServers(player) {\n return hasHacknetServers(player) && player.hacknetNodes.length >= _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxServers;\n}\nfunction getCostOfNextHacknetNode(player) {\n return Object(_formulas_HacknetNodes__WEBPACK_IMPORTED_MODULE_1__[/* calculateNodeCost */ \"d\"])(player.hacknetNodes.length + 1, player.hacknet_node_purchase_cost_mult);\n}\nfunction getCostOfNextHacknetServer(player) {\n return Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_2__[/* calculateServerCost */ \"f\"])(player.hacknetNodes.length + 1, player.hacknet_node_purchase_cost_mult);\n} // Calculate the maximum number of times the Player can afford to upgrade a Hacknet Node's level\n\nfunction getMaxNumberLevelUpgrades(player, nodeObj, maxLevel) {\n if (maxLevel == null) {\n throw new Error(`getMaxNumberLevelUpgrades() called without maxLevel arg`);\n }\n\n if (player.money.lt(nodeObj.calculateLevelUpgradeCost(1, player.hacknet_node_level_cost_mult))) {\n return 0;\n }\n\n let min = 1;\n let max = maxLevel - 1;\n const levelsToMax = maxLevel - nodeObj.level;\n\n if (player.money.gt(nodeObj.calculateLevelUpgradeCost(levelsToMax, player.hacknet_node_level_cost_mult))) {\n return levelsToMax;\n }\n\n while (min <= max) {\n const curr = (min + max) / 2 | 0;\n\n if (curr !== maxLevel && player.money.gt(nodeObj.calculateLevelUpgradeCost(curr, player.hacknet_node_level_cost_mult)) && player.money.lt(nodeObj.calculateLevelUpgradeCost(curr + 1, player.hacknet_node_level_cost_mult))) {\n return Math.min(levelsToMax, curr);\n } else if (player.money.lt(nodeObj.calculateLevelUpgradeCost(curr, player.hacknet_node_level_cost_mult))) {\n max = curr - 1;\n } else if (player.money.gt(nodeObj.calculateLevelUpgradeCost(curr, player.hacknet_node_level_cost_mult))) {\n min = curr + 1;\n } else {\n return Math.min(levelsToMax, curr);\n }\n }\n\n return 0;\n} // Calculate the maximum number of times the Player can afford to upgrade a Hacknet Node's RAM\n\nfunction getMaxNumberRamUpgrades(player, nodeObj, maxLevel) {\n if (maxLevel == null) {\n throw new Error(`getMaxNumberRamUpgrades() called without maxLevel arg`);\n }\n\n if (player.money.lt(nodeObj.calculateRamUpgradeCost(1, player.hacknet_node_ram_cost_mult))) {\n return 0;\n }\n\n let levelsToMax;\n\n if (nodeObj instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"]) {\n levelsToMax = Math.round(Math.log2(maxLevel / nodeObj.maxRam));\n } else {\n levelsToMax = Math.round(Math.log2(maxLevel / nodeObj.ram));\n }\n\n if (player.money.gt(nodeObj.calculateRamUpgradeCost(levelsToMax, player.hacknet_node_ram_cost_mult))) {\n return levelsToMax;\n } //We'll just loop until we find the max\n\n\n for (let i = levelsToMax - 1; i >= 0; --i) {\n if (player.money.gt(nodeObj.calculateRamUpgradeCost(i, player.hacknet_node_ram_cost_mult))) {\n return i;\n }\n }\n\n return 0;\n} // Calculate the maximum number of times the Player can afford to upgrade a Hacknet Node's cores\n\nfunction getMaxNumberCoreUpgrades(player, nodeObj, maxLevel) {\n if (maxLevel == null) {\n throw new Error(`getMaxNumberCoreUpgrades() called without maxLevel arg`);\n }\n\n if (player.money.lt(nodeObj.calculateCoreUpgradeCost(1, player.hacknet_node_core_cost_mult))) {\n return 0;\n }\n\n let min = 1;\n let max = maxLevel - 1;\n const levelsToMax = maxLevel - nodeObj.cores;\n\n if (player.money.gt(nodeObj.calculateCoreUpgradeCost(levelsToMax, player.hacknet_node_core_cost_mult))) {\n return levelsToMax;\n } // Use a binary search to find the max possible number of upgrades\n\n\n while (min <= max) {\n const curr = (min + max) / 2 | 0;\n\n if (curr != maxLevel && player.money.gt(nodeObj.calculateCoreUpgradeCost(curr, player.hacknet_node_core_cost_mult)) && player.money.lt(nodeObj.calculateCoreUpgradeCost(curr + 1, player.hacknet_node_core_cost_mult))) {\n return Math.min(levelsToMax, curr);\n } else if (player.money.lt(nodeObj.calculateCoreUpgradeCost(curr, player.hacknet_node_core_cost_mult))) {\n max = curr - 1;\n } else if (player.money.gt(nodeObj.calculateCoreUpgradeCost(curr, player.hacknet_node_core_cost_mult))) {\n min = curr + 1;\n } else {\n return Math.min(levelsToMax, curr);\n }\n }\n\n return 0;\n} // Calculate the maximum number of times the Player can afford to upgrade a Hacknet Node's cache\n\nfunction getMaxNumberCacheUpgrades(player, nodeObj, maxLevel) {\n if (maxLevel == null) {\n throw new Error(`getMaxNumberCacheUpgrades() called without maxLevel arg`);\n }\n\n if (!player.canAfford(nodeObj.calculateCacheUpgradeCost(1))) {\n return 0;\n }\n\n let min = 1;\n let max = maxLevel - 1;\n const levelsToMax = maxLevel - nodeObj.cache;\n\n if (player.canAfford(nodeObj.calculateCacheUpgradeCost(levelsToMax))) {\n return levelsToMax;\n } // Use a binary search to find the max possible number of upgrades\n\n\n while (min <= max) {\n const curr = (min + max) / 2 | 0;\n\n if (curr != maxLevel && player.canAfford(nodeObj.calculateCacheUpgradeCost(curr)) && !player.canAfford(nodeObj.calculateCacheUpgradeCost(curr + 1))) {\n return Math.min(levelsToMax, curr);\n } else if (!player.canAfford(nodeObj.calculateCacheUpgradeCost(curr))) {\n max = curr - 1;\n } else if (player.canAfford(nodeObj.calculateCacheUpgradeCost(curr))) {\n min = curr + 1;\n } else {\n return Math.min(levelsToMax, curr);\n }\n }\n\n return 0;\n}\nfunction purchaseLevelUpgrade(player, node, levels = 1) {\n const sanitizedLevels = Math.round(levels);\n const cost = node.calculateLevelUpgradeCost(sanitizedLevels, player.hacknet_node_level_cost_mult);\n\n if (isNaN(cost) || cost <= 0 || sanitizedLevels < 0) {\n return false;\n }\n\n const isServer = node instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"]; // If we're at max level, return false\n\n if (node.level >= (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxLevel : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxLevel)) {\n return false;\n } // If the number of specified upgrades would exceed the max level, calculate\n // the maximum number of upgrades and use that\n\n\n if (node.level + sanitizedLevels > (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxLevel : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxLevel)) {\n const diff = Math.max(0, (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxLevel : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxLevel) - node.level);\n return purchaseLevelUpgrade(player, node, diff);\n }\n\n if (!player.canAfford(cost)) {\n return false;\n }\n\n player.loseMoney(cost);\n node.upgradeLevel(sanitizedLevels, player.hacknet_node_money_mult);\n return true;\n}\nfunction purchaseRamUpgrade(player, node, levels = 1) {\n const sanitizedLevels = Math.round(levels);\n const cost = node.calculateRamUpgradeCost(sanitizedLevels, player.hacknet_node_ram_cost_mult);\n\n if (isNaN(cost) || cost <= 0 || sanitizedLevels < 0) {\n return false;\n }\n\n if (node instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"] && node.maxRam >= _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxRam) {\n return false;\n }\n\n if (node instanceof _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"] && node.ram >= _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxRam) {\n return false;\n } // If the number of specified upgrades would exceed the max RAM, calculate the\n // max possible number of upgrades and use that\n\n\n if (node instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"]) {\n if (node.maxRam * Math.pow(2, sanitizedLevels) > _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxRam) {\n const diff = Math.max(0, Math.log2(Math.round(_data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxRam / node.maxRam)));\n return purchaseRamUpgrade(player, node, diff);\n }\n } else if (node instanceof _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"]) {\n if (node.ram * Math.pow(2, sanitizedLevels) > _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxRam) {\n const diff = Math.max(0, Math.log2(Math.round(_data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxRam / node.ram)));\n return purchaseRamUpgrade(player, node, diff);\n }\n }\n\n if (!player.canAfford(cost)) {\n return false;\n }\n\n player.loseMoney(cost);\n node.upgradeRam(sanitizedLevels, player.hacknet_node_money_mult);\n return true;\n}\nfunction purchaseCoreUpgrade(player, node, levels = 1) {\n const sanitizedLevels = Math.round(levels);\n const cost = node.calculateCoreUpgradeCost(sanitizedLevels, player.hacknet_node_core_cost_mult);\n\n if (isNaN(cost) || cost <= 0 || sanitizedLevels < 0) {\n return false;\n }\n\n const isServer = node instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"]; // Fail if we're already at max\n\n if (node.cores >= (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxCores : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxCores)) {\n return false;\n } // If the specified number of upgrades would exceed the max Cores, calculate\n // the max possible number of upgrades and use that\n\n\n if (node.cores + sanitizedLevels > (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxCores : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxCores)) {\n const diff = Math.max(0, (isServer ? _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxCores : _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetNodeConstants */ \"a\"].MaxCores) - node.cores);\n return purchaseCoreUpgrade(player, node, diff);\n }\n\n if (!player.canAfford(cost)) {\n return false;\n }\n\n player.loseMoney(cost);\n node.upgradeCore(sanitizedLevels, player.hacknet_node_money_mult);\n return true;\n}\nfunction purchaseCacheUpgrade(player, node, levels = 1) {\n const sanitizedLevels = Math.round(levels);\n const cost = node.calculateCacheUpgradeCost(sanitizedLevels);\n\n if (isNaN(cost) || cost <= 0 || sanitizedLevels < 0) {\n return false;\n }\n\n if (!(node instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"])) {\n console.warn(`purchaseCacheUpgrade() called for a non-HacknetNode`);\n return false;\n } // Fail if we're already at max\n\n\n if (node.cache + sanitizedLevels > _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxCache) {\n const diff = Math.max(0, _data_Constants__WEBPACK_IMPORTED_MODULE_3__[/* HacknetServerConstants */ \"b\"].MaxCache - node.cache);\n return purchaseCacheUpgrade(player, node, diff);\n }\n\n if (!player.canAfford(cost)) {\n return false;\n }\n\n player.loseMoney(cost);\n node.upgradeCache(sanitizedLevels);\n return true;\n}\nfunction processHacknetEarnings(player, numCycles) {\n // Determine if player has Hacknet Nodes or Hacknet Servers, then\n // call the appropriate function\n if (player.hacknetNodes.length === 0) {\n return 0;\n }\n\n if (hasHacknetServers(player)) {\n return processAllHacknetServerEarnings(player, numCycles);\n } else if (player.hacknetNodes[0] instanceof _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"]) {\n return processAllHacknetNodeEarnings(player, numCycles);\n } else {\n return 0;\n }\n}\n\nfunction processAllHacknetNodeEarnings(player, numCycles) {\n let total = 0;\n\n for (let i = 0; i < player.hacknetNodes.length; ++i) {\n const node = player.hacknetNodes[i];\n if (typeof node === \"string\") throw new Error(\"player node should not be ip string\");\n total += processSingleHacknetNodeEarnings(player, numCycles, node);\n }\n\n return total;\n}\n\nfunction processSingleHacknetNodeEarnings(player, numCycles, nodeObj) {\n const totalEarnings = nodeObj.process(numCycles);\n player.gainMoney(totalEarnings);\n player.recordMoneySource(totalEarnings, \"hacknetnode\");\n return totalEarnings;\n}\n\nfunction processAllHacknetServerEarnings(player, numCycles) {\n if (!(player.hashManager instanceof _HashManager__WEBPACK_IMPORTED_MODULE_5__[/* HashManager */ \"a\"])) {\n throw new Error(`Player does not have a HashManager (should be in 'hashManager' prop)`);\n }\n\n let hashes = 0;\n\n for (let i = 0; i < player.hacknetNodes.length; ++i) {\n // hacknetNodes array only contains the IP addresses of the servers.\n // Also, update the hash rate before processing\n const ip = player.hacknetNodes[i];\n if (ip instanceof _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"]) throw new Error(`player nodes should not be HacketNode`);\n const hserver = _Server_AllServers__WEBPACK_IMPORTED_MODULE_9__[/* AllServers */ \"b\"][ip];\n if (hserver instanceof _Server_Server__WEBPACK_IMPORTED_MODULE_11__[/* Server */ \"a\"]) throw new Error(`player nodes shoud not be Server`);\n hserver.updateHashRate(player.hacknet_node_money_mult);\n const h = hserver.process(numCycles);\n hserver.totalHashesGenerated += h;\n hashes += h;\n }\n\n player.hashManager.storeHashes(hashes);\n return hashes;\n}\n\nfunction updateHashManagerCapacity(player) {\n if (!(player.hashManager instanceof _HashManager__WEBPACK_IMPORTED_MODULE_5__[/* HashManager */ \"a\"])) {\n console.error(`Player does not have a HashManager`);\n return;\n }\n\n const nodes = player.hacknetNodes;\n\n if (nodes.length === 0) {\n player.hashManager.updateCapacity(0);\n return;\n }\n\n let total = 0;\n\n for (let i = 0; i < nodes.length; ++i) {\n if (typeof nodes[i] !== \"string\") {\n player.hashManager.updateCapacity(0);\n return;\n }\n\n const ip = nodes[i];\n if (ip instanceof _HacknetNode__WEBPACK_IMPORTED_MODULE_0__[/* HacknetNode */ \"a\"]) throw new Error(`player nodes should be string but isn't`);\n const h = _Server_AllServers__WEBPACK_IMPORTED_MODULE_9__[/* AllServers */ \"b\"][ip];\n\n if (!(h instanceof _HacknetServer__WEBPACK_IMPORTED_MODULE_4__[/* HacknetServer */ \"a\"])) {\n player.hashManager.updateCapacity(0);\n return;\n }\n\n total += h.hashCapacity;\n }\n\n player.hashManager.updateCapacity(total);\n}\nfunction purchaseHashUpgrade(player, upgName, upgTarget) {\n if (!(player.hashManager instanceof _HashManager__WEBPACK_IMPORTED_MODULE_5__[/* HashManager */ \"a\"])) {\n console.error(`Player does not have a HashManager`);\n return false;\n } // HashManager handles the transaction. This just needs to actually implement\n // the effects of the upgrade\n\n\n if (player.hashManager.upgrade(upgName)) {\n const upg = _HashUpgrades__WEBPACK_IMPORTED_MODULE_6__[/* HashUpgrades */ \"a\"][upgName];\n\n switch (upgName) {\n case \"Sell for Money\":\n {\n player.gainMoney(upg.value);\n player.recordMoneySource(upg.value, \"hacknetnode\");\n break;\n }\n\n case \"Sell for Corporation Funds\":\n {\n // This will throw if player doesn't have a corporation\n try {\n player.corporation.funds = player.corporation.funds.plus(upg.value);\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Reduce Minimum Security\":\n {\n try {\n const target = Object(_Server_ServerHelpers__WEBPACK_IMPORTED_MODULE_10__[/* GetServerByHostname */ \"a\"])(upgTarget);\n\n if (target == null) {\n console.error(`Invalid target specified in purchaseHashUpgrade(): ${upgTarget}`);\n return false;\n }\n\n if (!(target instanceof _Server_Server__WEBPACK_IMPORTED_MODULE_11__[/* Server */ \"a\"])) throw new Error(`'${upgTarget}' is not a normal server.`);\n target.changeMinimumSecurity(upg.value, true);\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Increase Maximum Money\":\n {\n try {\n const target = Object(_Server_ServerHelpers__WEBPACK_IMPORTED_MODULE_10__[/* GetServerByHostname */ \"a\"])(upgTarget);\n\n if (target == null) {\n console.error(`Invalid target specified in purchaseHashUpgrade(): ${upgTarget}`);\n return false;\n }\n\n if (!(target instanceof _Server_Server__WEBPACK_IMPORTED_MODULE_11__[/* Server */ \"a\"])) throw new Error(`'${upgTarget}' is not a normal server.`);\n target.changeMaximumMoney(upg.value, true);\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Improve Studying\":\n {\n // Multiplier handled by HashManager\n break;\n }\n\n case \"Improve Gym Training\":\n {\n // Multiplier handled by HashManager\n break;\n }\n\n case \"Exchange for Corporation Research\":\n {\n // This will throw if player doesn't have a corporation\n try {\n for (const division of player.corporation.divisions) {\n division.sciResearch.qty += upg.value;\n }\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Exchange for Bladeburner Rank\":\n {\n // This will throw if player isnt in Bladeburner\n try {\n player.bladeburner.changeRank(player, upg.value);\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Exchange for Bladeburner SP\":\n {\n // This will throw if player isn't in Bladeburner\n try {\n // As long as we don't change `Bladeburner.totalSkillPoints`, this\n // shouldn't affect anything else\n player.bladeburner.skillPoints += upg.value;\n } catch (e) {\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n break;\n }\n\n case \"Generate Coding Contract\":\n {\n Object(_CodingContractGenerator__WEBPACK_IMPORTED_MODULE_7__[/* generateRandomContract */ \"b\"])();\n break;\n }\n\n default:\n console.warn(`Unrecognized upgrade name ${upgName}. Upgrade has no effect`);\n player.hashManager.refundUpgrade(upgName);\n return false;\n }\n\n return true;\n }\n\n return false;\n}\n\n//# sourceURL=webpack:///./src/Hacknet/HacknetHelpers.tsx?");
-
-/***/ }),
-/* 47 */
-/*!**********************************!*\
- !*** ./src/Company/Companies.ts ***!
- \**********************************/
-/*! exports provided: Companies, initCompanies, loadCompanies, companyExists */
-/*! exports used: Companies, initCompanies, loadCompanies */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Companies; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initCompanies; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return loadCompanies; });\n/* unused harmony export companyExists */\n/* harmony import */ var _data_CompaniesMetadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./data/CompaniesMetadata */ 648);\n/* harmony import */ var _Company__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Company */ 174);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n// Constructs all CompanyPosition objects using the metadata in data/companypositions.ts\n\n\n\nlet Companies = {};\n\nfunction addCompany(params) {\n if (Companies[params.name] != null) {\n console.warn(`Duplicate Company Position being defined: ${params.name}`);\n }\n\n Companies[params.name] = new _Company__WEBPACK_IMPORTED_MODULE_1__[/* Company */ \"a\"](params);\n} // Used to initialize new Company objects for the Companies map\n// Called when creating new game or after a prestige/reset\n\n\nfunction initCompanies() {\n // Save Old Company data for 'favor'\n const oldCompanies = Companies; // Re-construct all Companies\n\n Companies = {};\n _data_CompaniesMetadata__WEBPACK_IMPORTED_MODULE_0__[/* companiesMetadata */ \"a\"].forEach(e => {\n addCompany(e);\n }); // Reset data\n\n for (const companyName in Companies) {\n const company = Companies[companyName];\n const oldCompany = oldCompanies[companyName];\n\n if (!(oldCompany instanceof _Company__WEBPACK_IMPORTED_MODULE_1__[/* Company */ \"a\"])) {\n // New game, so no OldCompanies data\n company.favor = 0;\n } else {\n company.favor = oldCompanies[companyName].favor;\n\n if (isNaN(company.favor)) {\n company.favor = 0;\n }\n }\n }\n} // Used to load Companies map from a save\n\nfunction loadCompanies(saveString) {\n Companies = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_2__[/* Reviver */ \"c\"]);\n} // Utility function to check if a string is valid company name\n\nfunction companyExists(name) {\n return Companies.hasOwnProperty(name);\n}\n\n//# sourceURL=webpack:///./src/Company/Companies.ts?");
-
-/***/ }),
-/* 48 */,
-/* 49 */
-/*!************************************!*\
- !*** ./src/InteractiveTutorial.js ***!
- \************************************/
-/*! exports provided: iTutorialSteps, iTutorialEnd, iTutorialStart, iTutorialNextStep, ITutorial */
-/*! exports used: ITutorial, iTutorialNextStep, iTutorialStart, iTutorialSteps */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return iTutorialSteps; });\n/* unused harmony export iTutorialEnd */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return iTutorialStart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return iTutorialNextStep; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ITutorial; });\n/* harmony import */ var _engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./engine */ 140);\n/* harmony import */ var _Player__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Player */ 2);\n/* harmony import */ var _Settings_Settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Settings/Settings */ 34);\n/* harmony import */ var _Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Literature/data/LiteratureNames */ 45);\n/* harmony import */ var _utils_uiHelpers_clearEventListeners__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/uiHelpers/clearEventListeners */ 290);\n/* harmony import */ var _utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/uiHelpers/createElement */ 116);\n/* harmony import */ var _utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/uiHelpers/createPopup */ 442);\n/* harmony import */ var _utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/uiHelpers/removeElementById */ 213);\n\n\n\n\n\n\n\n // Ordered array of keys to Interactive Tutorial Steps\n\nconst orderedITutorialSteps = [\"Start\", \"GoToCharacterPage\", // Click on 'Stats' page\n\"CharacterPage\", // Introduction to 'Stats' page\n\"CharacterGoToTerminalPage\", // Go back to Terminal\n\"TerminalIntro\", // Introduction to Terminal\n\"TerminalHelp\", // Using 'help' Terminal command\n\"TerminalLs\", // Using 'ls' Terminal command\n\"TerminalScan\", // Using 'scan' Terminal command\n\"TerminalScanAnalyze1\", // Using 'scan-analyze' Terminal command\n\"TerminalScanAnalyze2\", // Using 'scan-analyze 3' Terminal command\n\"TerminalConnect\", // Connecting to n00dles\n\"TerminalAnalyze\", // Analyzing n00dles\n\"TerminalNuke\", // NUKE n00dles\n\"TerminalManualHack\", // Hack n00dles\n\"TerminalHackingMechanics\", // Explanation of hacking mechanics\n\"TerminalCreateScript\", // Create a script using 'nano'\n\"TerminalTypeScript\", // Script Editor page - Type script and then save & close\n\"TerminalFree\", // Using 'Free' Terminal command\n\"TerminalRunScript\", // Running script using 'run' Terminal command\n\"TerminalGoToActiveScriptsPage\", \"ActiveScriptsPage\", \"ActiveScriptsToTerminal\", \"TerminalTailScript\", \"GoToHacknetNodesPage\", \"HacknetNodesIntroduction\", \"HacknetNodesGoToWorldPage\", \"WorldDescription\", \"TutorialPageInfo\", \"End\"]; // Create an 'enum' for the Steps\n\nconst iTutorialSteps = {};\n\nfor (let i = 0; i < orderedITutorialSteps.length; ++i) {\n iTutorialSteps[orderedITutorialSteps[i]] = i;\n}\n\nconst ITutorial = {\n currStep: 0,\n // iTutorialSteps.Start\n isRunning: false,\n // Keeps track of whether each step has been done\n stepIsDone: {}\n};\n\nfunction iTutorialStart() {\n // Initialize Interactive Tutorial state by settings 'done' for each state to false\n ITutorial.stepIsDone = {};\n\n for (let i = 0; i < orderedITutorialSteps.length; ++i) {\n ITutorial.stepIsDone[i] = false;\n } // Don't autosave during this interactive tutorial\n\n\n _engine__WEBPACK_IMPORTED_MODULE_0__[\"Engine\"].Counters.autoSaveCounter = Infinity;\n ITutorial.currStep = 0;\n ITutorial.isRunning = true;\n document.getElementById(\"interactive-tutorial-container\").style.display = \"block\"; // Exit tutorial button\n\n const exitButton = Object(_utils_uiHelpers_clearEventListeners__WEBPACK_IMPORTED_MODULE_4__[/* clearEventListeners */ \"a\"])(\"interactive-tutorial-exit\");\n exitButton.addEventListener(\"click\", function () {\n iTutorialEnd();\n return false;\n }); // Back button\n\n const backButton = Object(_utils_uiHelpers_clearEventListeners__WEBPACK_IMPORTED_MODULE_4__[/* clearEventListeners */ \"a\"])(\"interactive-tutorial-back\");\n backButton.addEventListener(\"click\", function () {\n iTutorialPrevStep();\n return false;\n }); // Next button\n\n const nextButton = Object(_utils_uiHelpers_clearEventListeners__WEBPACK_IMPORTED_MODULE_4__[/* clearEventListeners */ \"a\"])(\"interactive-tutorial-next\");\n nextButton.addEventListener(\"click\", function () {\n iTutorialNextStep();\n return false;\n });\n iTutorialEvaluateStep();\n}\n\nfunction iTutorialEvaluateStep() {\n if (!ITutorial.isRunning) {\n return;\n } // Disable and clear main menu\n // const terminalMainMenu = clearEventListeners(\"terminal-menu-link\");\n // const statsMainMenu = clearEventListeners(\"stats-menu-link\");\n // const activeScriptsMainMenu = clearEventListeners(\"active-scripts-menu-link\");\n // const hacknetMainMenu = clearEventListeners(\"hacknet-nodes-menu-link\");\n // const cityMainMenu = clearEventListeners(\"city-menu-link\");\n // const tutorialMainMenu = clearEventListeners(\"tutorial-menu-link\");\n // terminalMainMenu.removeAttribute(\"class\");\n // statsMainMenu.removeAttribute(\"class\");\n // activeScriptsMainMenu.removeAttribute(\"class\");\n // hacknetMainMenu.removeAttribute(\"class\");\n // cityMainMenu.removeAttribute(\"class\");\n // tutorialMainMenu.removeAttribute(\"class\");\n // Interactive Tutorial Next button\n\n\n const nextBtn = document.getElementById(\"interactive-tutorial-next\");\n\n switch (ITutorial.currStep) {\n case iTutorialSteps.Start:\n iTutorialSetText(\"Welcome to Bitburner, a cyberpunk-themed incremental RPG! \" + \"The game takes place in a dark, dystopian future... The year is 2077...
\" + \"This tutorial will show you the basics of the game. \" + \"You may skip the tutorial at any time.\");\n nextBtn.style.display = \"inline-block\";\n break;\n\n case iTutorialSteps.GoToCharacterPage:\n iTutorialSetText(\"Let's start by heading to the Stats page. Click the Stats tab on \" + \"the main navigation menu (left-hand side of the screen)\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.CharacterPage:\n iTutorialSetText(\"The Stats page shows a lot of important information about your progress, \" + \"such as your skills, money, and bonuses. \");\n nextBtn.style.display = \"inline-block\";\n break;\n\n case iTutorialSteps.CharacterGoToTerminalPage:\n iTutorialSetText(\"Let's head to your computer's terminal by clicking the Terminal tab on the \" + \"main navigation menu.\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.TerminalIntro:\n iTutorialSetText(\"The Terminal is used to interface with your home computer as well as \" + \"all of the other machines around the world.\");\n nextBtn.style.display = \"inline-block\";\n break;\n\n case iTutorialSteps.TerminalHelp:\n iTutorialSetText(\"Let's try it out. Start by entering the help command into the Terminal \" + \"(Don't forget to press Enter after typing the command)\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalLs:\n iTutorialSetText(\"The help command displays a list of all available Terminal commands, how to use them, \" + \"and a description of what they do.
Let's try another command. Enter the ls command.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalScan:\n iTutorialSetText(\" ls is a basic command that shows files \" + \"on the computer. Right now, it shows that you have a program called NUKE.exe on your computer. \" + \"We'll get to what this does later.
Using your home computer's terminal, you can connect \" + \"to other machines throughout the world. Let's do that now by first entering \" + \"the scan command.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalScanAnalyze1:\n iTutorialSetText(\"The scan command shows all available network connections. In other words, \" + \"it displays a list of all servers that can be connected to from your \" + \"current machine. A server is identified by its hostname.
\" + \"That's great and all, but there's so many servers. Which one should you go to? \" + \"The scan-analyze command gives some more detailed information about servers on the \" + \"network. Try it now!\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalScanAnalyze2:\n iTutorialSetText(\"You just ran scan-analyze with a depth of one. This command shows more detailed \" + \"information about each server that you can connect to (servers that are a distance of \" + \"one node away).
It is also possible to run scan-analyze with \" + \"a higher depth. Let's try a depth of two with the following command: scan-analyze 2.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalConnect:\n iTutorialSetText(\"Now you can see information about all servers that are up to two nodes away, as well \" + \"as figure out how to navigate to those servers through the network. You can only connect to \" + \"a server that is one node away. To connect to a machine, use the connect [hostname] command.
\" + \"From the results of the scan-analyze command, we can see that the n00dles server is \" + \"only one node away. Let's connect so it now using: connect n00dles\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalAnalyze:\n iTutorialSetText(\"You are now connected to another machine! What can you do now? You can hack it!
In the year 2077, currency has \" + \"become digital and decentralized. People and corporations store their money \" + \"on servers and computers. Using your hacking abilities, you can hack servers \" + \"to steal money and gain experience.
\" + \"Before you try to hack a server, you should run diagnostics using the analyze command.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalNuke:\n iTutorialSetText(\"When the analyze command finishes running it will show useful information \" + \"about hacking the server.
For this server, the required hacking skill is only 1, \" + \"which means you can hack it right now. However, in order to hack a server \" + \"you must first gain root access. The NUKE.exe program that we saw earlier on your \" + \"home computer is a virus that will grant you root access to a machine if there are enough \" + \"open ports.
The analyze results shows that there do not need to be any open ports \" + \"on this machine for the NUKE virus to work, so go ahead and run the virus using the \" + \"run NUKE.exe command.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalManualHack:\n iTutorialSetText(\"You now have root access! You can hack the server using the hack command. \" + \"Try doing that now.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalHackingMechanics:\n iTutorialSetText(\"You are now attempting to hack the server. Performing a hack takes time and \" + \"only has a certain percentage chance \" + \"of success. This time and success chance is determined by a variety of factors, including \" + \"your hacking skill and the server's security level.
\" + \"If your attempt to hack the server is successful, you will steal a certain percentage \" + \"of the server's total money. This percentage is affected by your hacking skill and \" + \"the server's security level.
The amount of money on a server is not limitless. So, if \" + \"you constantly hack a server and deplete its money, then you will encounter \" + \"diminishing returns in your hacking.\");\n nextBtn.style.display = \"inline-block\";\n break;\n\n case iTutorialSteps.TerminalCreateScript:\n iTutorialSetText(\"Hacking is the core mechanic of the game and is necessary for progressing. However, \" + \"you don't want to be hacking manually the entire time. You can automate your hacking \" + \"by writing scripts!
To create a new script or edit an existing one, you can use the nano \" + \"command. Scripts must end with the .script extension. Let's make a script now by \" + \"entering nano n00dles.script after the hack command finishes running (Sidenote: Pressing ctrl + c\" + \" will end a command like hack early)\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalTypeScript:\n iTutorialSetText(\"This is the script editor. You can use it to program your scripts. Scripts are \" + \"written in a simplified version of javascript. Copy and paste the following code into the script editor:
\" + \"For anyone with basic programming experience, this code should be straightforward. \" + \"This script will continuously hack the n00dles server.
\" + \"To save and close the script editor, press the button in the bottom left, or press ctrl + b.\");\n nextBtn.style.display = \"none\"; // next step triggered in saveAndCloseScriptEditor() (Script.js)\n\n break;\n\n case iTutorialSteps.TerminalFree:\n iTutorialSetText(\"Now we'll run the script. Scripts require a certain amount of RAM to run, and can be \" + \"run on any machine which you have root access to. Different servers have different \" + \"amounts of RAM. You can also purchase more RAM for your home server.
To check how much \" + \"RAM is available on this machine, enter the free command.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal commmand\n\n break;\n\n case iTutorialSteps.TerminalRunScript:\n iTutorialSetText(\"We have 4GB of free RAM on this machine, which is enough to run our \" + \"script. Let's run our script using run n00dles.script.\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal commmand\n\n break;\n\n case iTutorialSteps.TerminalGoToActiveScriptsPage:\n iTutorialSetText(\"Your script is now running! \" + \"It will continuously run in the background and will automatically stop if \" + \"the code ever completes (the n00dles.script will never complete because it \" + \"runs an infinite loop).
These scripts can passively earn you income and hacking experience. \" + \"Your scripts will also earn money and experience while you are offline, although at a \" + \"slightly slower rate.
\" + \"Let's check out some statistics for our running scripts by clicking the \" + \"Active Scripts link in the main navigation menu.\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.ActiveScriptsPage:\n iTutorialSetText(\"This page displays information about all of your scripts that are \" + \"running across every server. You can use this to gauge how well \" + \"your scripts are doing. Let's go back to the Terminal\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.ActiveScriptsToTerminal:\n iTutorialSetText(\"One last thing about scripts, each active script contains logs that detail \" + \"what it's doing. We can check these logs using the tail command. Do that \" + \"now for the script we just ran by typing tail n00dles.script\");\n nextBtn.style.display = \"none\"; // next step triggered by terminal command\n\n break;\n\n case iTutorialSteps.TerminalTailScript:\n iTutorialSetText(\"The log for this script won't show much right now (it might show nothing at all) because it \" + \"just started running...but check back again in a few minutes!
\" + \"This covers the basics of hacking. To learn more about writing \" + \"scripts, select the Tutorial link in the \" + \"main navigation menu to look at the documentation. \" + \"If you are an experienced JavaScript \" + \"developer, I would highly suggest you check out the section on \" + \"NetscriptJS/Netscript 2.0, it's faster and more powerful.
For now, let's move on to something else!\");\n nextBtn.style.display = \"inline-block\";\n break;\n\n case iTutorialSteps.GoToHacknetNodesPage:\n iTutorialSetText(\"Hacking is not the only way to earn money. One other way to passively \" + \"earn money is by purchasing and upgrading Hacknet Nodes. Let's go to \" + \"the Hacknet page through the main navigation menu now.\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.HacknetNodesIntroduction:\n iTutorialSetText(\"here you can purchase new Hacknet Nodes and upgrade your \" + \"existing ones. Let's purchase a new one now.\");\n nextBtn.style.display = \"none\"; // Next step triggered by purchaseHacknet() (HacknetNode.js)\n\n break;\n\n case iTutorialSteps.HacknetNodesGoToWorldPage:\n iTutorialSetText(\"You just purchased a Hacknet Node! This Hacknet Node will passively \" + \"earn you money over time, both online and offline. When you get enough \" + \" money, you can upgrade \" + \"your newly-purchased Hacknet Node below.
\" + \"Let's go to the City page through the main navigation menu.\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.WorldDescription:\n iTutorialSetText(\"This page lists all of the different locations you can currently \" + \"travel to. Each location has something that you can do. \" + \"There's a lot of content out in the world, make sure \" + \"you explore and discover!
\" + \"Lastly, click on the Tutorial link in the main navigation menu.\");\n nextBtn.style.display = \"none\";\n break;\n\n case iTutorialSteps.TutorialPageInfo:\n iTutorialSetText(\"This page contains a lot of different documentation about the game's \" + \"content and mechanics. I know it's a lot, but I highly suggest you read \" + \"(or at least skim) through this before you start playing. That's the end of the tutorial. \" + \"Hope you enjoy the game!\");\n nextBtn.style.display = \"inline-block\";\n nextBtn.innerHTML = \"Finish Tutorial\";\n break;\n\n case iTutorialSteps.End:\n iTutorialEnd();\n break;\n\n default:\n throw new Error(\"Invalid tutorial step\");\n }\n\n if (ITutorial.stepIsDone[ITutorial.currStep] === true) {\n nextBtn.style.display = \"inline-block\";\n }\n} // Go to the next step and evaluate it\n\n\nfunction iTutorialNextStep() {\n ITutorial.stepIsDone[ITutorial.currStep] = true;\n\n if (ITutorial.currStep < iTutorialSteps.End) {\n ITutorial.currStep += 1;\n }\n\n iTutorialEvaluateStep();\n} // Go to previous step and evaluate\n\n\nfunction iTutorialPrevStep() {\n if (ITutorial.currStep > iTutorialSteps.Start) {\n ITutorial.currStep -= 1;\n }\n\n iTutorialEvaluateStep();\n}\n\nfunction iTutorialEnd() {\n // Re-enable auto save\n if (_Settings_Settings__WEBPACK_IMPORTED_MODULE_2__[/* Settings */ \"a\"].AutosaveInterval === 0) {\n _engine__WEBPACK_IMPORTED_MODULE_0__[\"Engine\"].Counters.autoSaveCounter = Infinity;\n } else {\n _engine__WEBPACK_IMPORTED_MODULE_0__[\"Engine\"].Counters.autoSaveCounter = _Settings_Settings__WEBPACK_IMPORTED_MODULE_2__[/* Settings */ \"a\"].AutosaveInterval * 5;\n }\n\n _engine__WEBPACK_IMPORTED_MODULE_0__[\"Engine\"].init();\n ITutorial.currStep = iTutorialSteps.End;\n ITutorial.isRunning = false;\n document.getElementById(\"interactive-tutorial-container\").style.display = \"none\"; // Create a popup with final introductory stuff\n\n const popupId = \"interactive-tutorial-ending-popup\";\n const txt = Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_5__[/* createElement */ \"a\"])(\"p\", {\n innerHTML: \"If you are new to the game, the following links may be useful for you!
\" + \"The Beginner's Guide to Hacking was added to your home computer! It contains some tips/pointers for starting out with the game. \" + \"To read it, go to Terminal and enter
cat \" + _Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_3__[/* LiteratureNames */ \"a\"].HackersStartingHandbook\n });\n const gotitBtn = Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_5__[/* createElement */ \"a\"])(\"a\", {\n class: \"a-link-button\",\n float: \"right\",\n padding: \"6px\",\n innerText: \"Got it!\",\n clickListener: () => {\n Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_7__[/* removeElementById */ \"a\"])(popupId);\n }\n });\n Object(_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_6__[/* createPopup */ \"a\"])(popupId, [txt, gotitBtn]);\n _Player__WEBPACK_IMPORTED_MODULE_1__[/* Player */ \"a\"].getHomeComputer().messages.push(_Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_3__[/* LiteratureNames */ \"a\"].HackersStartingHandbook);\n}\n\nlet textBox = null;\n\n(function () {\n function set() {\n textBox = document.getElementById(\"interactive-tutorial-text\");\n document.removeEventListener(\"DOMContentLoaded\", set);\n }\n\n document.addEventListener(\"DOMContentLoaded\", set);\n})();\n\nfunction iTutorialSetText(txt) {\n textBox.innerHTML = txt;\n textBox.parentElement.scrollTop = 0; // this resets scroll position\n}\n\n\n\n//# sourceURL=webpack:///./src/InteractiveTutorial.js?");
-
-/***/ }),
-/* 50 */
-/*!*******************************************!*\
- !*** ./src/SourceFile/SourceFileFlags.ts ***!
- \*******************************************/
-/*! exports provided: SourceFileFlags, updateSourceFileFlags */
-/*! exports used: SourceFileFlags, updateSourceFileFlags */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SourceFileFlags; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return updateSourceFileFlags; });\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Constants */ 5);\n// Contains an array containing information about the player's source files\n// Array[n] returns what level the player has of Source-File N.\n\nconst SourceFileFlags = Array(_Constants__WEBPACK_IMPORTED_MODULE_0__[/* CONSTANTS */ \"a\"].TotalNumBitNodes + 1); // Skip index 0\n\nfunction updateSourceFileFlags(p) {\n for (let i = 0; i < SourceFileFlags.length; ++i) {\n SourceFileFlags[i] = 0;\n }\n\n for (let i = 0; i < p.sourceFiles.length; ++i) {\n const sf = p.sourceFiles[i];\n SourceFileFlags[sf.n] = sf.lvl;\n }\n}\n\n//# sourceURL=webpack:///./src/SourceFile/SourceFileFlags.ts?");
-
-/***/ }),
-/* 51 */
-/*!****************************************!*\
- !*** ./src/Server/SpecialServerIps.ts ***!
- \****************************************/
-/*! exports provided: SpecialServerNames, SpecialServerIpsMap, SpecialServerIps, prestigeSpecialServerIps, loadSpecialServerIps, initSpecialServerIps */
-/*! exports used: SpecialServerIps, SpecialServerNames, initSpecialServerIps, loadSpecialServerIps, prestigeSpecialServerIps */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return SpecialServerNames; });\n/* unused harmony export SpecialServerIpsMap */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SpecialServerIps; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return prestigeSpecialServerIps; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return loadSpecialServerIps; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initSpecialServerIps; });\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n\n/* Holds IP of Special Servers */\n\nconst SpecialServerNames = {\n FulcrumSecretTechnologies: \"Fulcrum Secret Technologies Server\",\n CyberSecServer: \"CyberSec Server\",\n NiteSecServer: \"NiteSec Server\",\n TheBlackHandServer: \"The Black Hand Server\",\n BitRunnersServer: \"BitRunners Server\",\n TheDarkArmyServer: \"The Dark Army Server\",\n DaedalusServer: \"Daedalus Server\",\n WorldDaemon: \"w0r1d_d43m0n\"\n};\nclass SpecialServerIpsMap {\n // eslint-disable-next-line @typescript-eslint/ban-types\n addIp(name, ip) {\n this[name] = ip;\n }\n\n getIp(name) {\n return this[name];\n } // Serialize the current object to a JSON save state\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_toJSON */ \"b\"])(\"SpecialServerIpsMap\", this);\n } // Initializes a SpecialServerIpsMap Object from a JSON save state\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_fromJSON */ \"a\"])(SpecialServerIpsMap, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Reviver */ \"c\"].constructors.SpecialServerIpsMap = SpecialServerIpsMap;\nlet SpecialServerIps = new SpecialServerIpsMap();\nfunction prestigeSpecialServerIps() {\n for (const member in SpecialServerIps) {\n delete SpecialServerIps[member];\n }\n\n SpecialServerIps = new SpecialServerIpsMap();\n}\nfunction loadSpecialServerIps(saveString) {\n SpecialServerIps = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Reviver */ \"c\"]);\n}\nfunction initSpecialServerIps() {\n SpecialServerIps = new SpecialServerIpsMap();\n}\n\n//# sourceURL=webpack:///./src/Server/SpecialServerIps.ts?");
-
-/***/ }),
-/* 52 */
-/*!***********************************************!*\
- !*** ./src/StockMarket/data/PositionTypes.ts ***!
- \***********************************************/
-/*! exports provided: PositionTypes */
-/*! exports used: PositionTypes */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return PositionTypes; });\nlet PositionTypes;\n\n(function (PositionTypes) {\n PositionTypes[\"Long\"] = \"L\";\n PositionTypes[\"Short\"] = \"S\";\n})(PositionTypes || (PositionTypes = {}));\n\n//# sourceURL=webpack:///./src/StockMarket/data/PositionTypes.ts?");
-
-/***/ }),
-/* 53 */
-/*!************************************!*\
- !*** ./src/Corporation/Actions.ts ***!
- \************************************/
-/*! exports provided: NewIndustry, NewCity, UnlockUpgrade, LevelUpgrade, IssueDividends, SellMaterial, SellProduct, SetSmartSupply, SetSmartSupplyUseLeftovers, BuyMaterial, AssignJob, UpgradeOfficeSize, ThrowParty, PurchaseWarehouse, UpgradeWarehouse, BuyCoffee, HireAdVert, MakeProduct, Research, ExportMaterial, CancelExportMaterial, LimitProductProduction, SetMaterialMarketTA1, SetMaterialMarketTA2, SetProductMarketTA1, SetProductMarketTA2 */
-/*! exports used: AssignJob, BuyCoffee, BuyMaterial, CancelExportMaterial, ExportMaterial, HireAdVert, IssueDividends, LevelUpgrade, LimitProductProduction, MakeProduct, NewCity, NewIndustry, PurchaseWarehouse, Research, SellMaterial, SellProduct, SetMaterialMarketTA1, SetMaterialMarketTA2, SetProductMarketTA1, SetProductMarketTA2, SetSmartSupply, SetSmartSupplyUseLeftovers, ThrowParty, UnlockUpgrade, UpgradeOfficeSize, UpgradeWarehouse */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return NewIndustry; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return NewCity; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return UnlockUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return LevelUpgrade; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return IssueDividends; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return SellMaterial; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return SellProduct; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return SetSmartSupply; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return SetSmartSupplyUseLeftovers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return BuyMaterial; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AssignJob; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return UpgradeOfficeSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return ThrowParty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return PurchaseWarehouse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return UpgradeWarehouse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return BuyCoffee; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return HireAdVert; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return MakeProduct; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return Research; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return ExportMaterial; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return CancelExportMaterial; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return LimitProductProduction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return SetMaterialMarketTA1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return SetMaterialMarketTA2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return SetProductMarketTA1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return SetProductMarketTA2; });\n/* harmony import */ var _IndustryData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./IndustryData */ 41);\n/* harmony import */ var _Industry__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Industry */ 699);\n/* harmony import */ var _data_Constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data/Constants */ 35);\n/* harmony import */ var _OfficeSpace__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./OfficeSpace */ 293);\n/* harmony import */ var _Product__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Product */ 317);\n/* harmony import */ var _Warehouse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Warehouse */ 177);\n/* harmony import */ var _Locations_Cities__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Locations/Cities */ 106);\n/* harmony import */ var _EmployeePositions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./EmployeePositions */ 37);\n/* harmony import */ var _IndustryUpgrades__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./IndustryUpgrades */ 294);\n/* harmony import */ var _ResearchMap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ResearchMap */ 288);\n\n\n\n\n\n\n\n\n\n\nfunction NewIndustry(corporation, industry, name) {\n for (let i = 0; i < corporation.divisions.length; ++i) {\n if (corporation.divisions[i].name === name) {\n throw new Error(\"This division name is already in use!\");\n return;\n }\n }\n\n const cost = _IndustryData__WEBPACK_IMPORTED_MODULE_0__[/* IndustryStartingCosts */ \"d\"][industry];\n\n if (cost === undefined) {\n throw new Error(`Invalid industry: '${industry}'`);\n }\n\n if (corporation.funds.lt(cost)) {\n throw new Error(\"Not enough money to create a new division in this industry\");\n } else if (name === \"\") {\n throw new Error(\"New division must have a name!\");\n } else {\n corporation.funds = corporation.funds.minus(cost);\n corporation.divisions.push(new _Industry__WEBPACK_IMPORTED_MODULE_1__[/* Industry */ \"a\"]({\n corp: corporation,\n name: name,\n type: industry\n }));\n }\n}\nfunction NewCity(corporation, division, city) {\n if (corporation.funds.lt(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialCost)) {\n throw new Error(\"You don't have enough company funds to open a new office!\");\n } else {\n corporation.funds = corporation.funds.minus(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialCost);\n division.offices[city] = new _OfficeSpace__WEBPACK_IMPORTED_MODULE_3__[/* OfficeSpace */ \"a\"]({\n loc: city,\n size: _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialSize\n });\n }\n}\nfunction UnlockUpgrade(corporation, upgrade) {\n if (corporation.funds.lt(upgrade[1])) {\n throw new Error(\"Insufficient funds\");\n }\n\n corporation.unlock(upgrade);\n}\nfunction LevelUpgrade(corporation, upgrade) {\n const baseCost = upgrade[1];\n const priceMult = upgrade[2];\n const level = corporation.upgrades[upgrade[0]];\n const cost = baseCost * Math.pow(priceMult, level);\n\n if (corporation.funds.lt(cost)) {\n throw new Error(\"Insufficient funds\");\n } else {\n corporation.upgrade(upgrade);\n }\n}\nfunction IssueDividends(corporation, percent) {\n if (isNaN(percent) || percent < 0 || percent > _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].DividendMaxPercentage) {\n throw new Error(`Invalid value. Must be an integer between 0 and ${_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].DividendMaxPercentage}`);\n }\n\n corporation.dividendPercentage = percent * 100;\n}\nfunction SellMaterial(mat, amt, price) {\n if (price === \"\") price = \"0\";\n if (amt === \"\") amt = \"0\";\n let cost = price.replace(/\\s+/g, \"\");\n cost = cost.replace(/[^-()\\d/*+.MP]/g, \"\"); //Sanitize cost\n\n let temp = cost.replace(/MP/g, mat.bCost + \"\");\n\n try {\n temp = eval(temp);\n } catch (e) {\n throw new Error(\"Invalid value or expression for sell price field: \" + e);\n }\n\n if (temp == null || isNaN(parseFloat(temp))) {\n throw new Error(\"Invalid value or expression for sell price field\");\n }\n\n if (cost.includes(\"MP\")) {\n mat.sCost = cost; //Dynamically evaluated\n } else {\n mat.sCost = temp;\n } //Parse quantity\n\n\n if (amt.includes(\"MAX\") || amt.includes(\"PROD\")) {\n let q = amt.replace(/\\s+/g, \"\");\n q = q.replace(/[^-()\\d/*+.MAXPROD]/g, \"\");\n let tempQty = q.replace(/MAX/g, \"1\");\n tempQty = tempQty.replace(/PROD/g, \"1\");\n\n try {\n tempQty = eval(tempQty);\n } catch (e) {\n throw new Error(\"Invalid value or expression for sell price field: \" + e);\n }\n\n if (tempQty == null || isNaN(parseFloat(tempQty))) {\n throw new Error(\"Invalid value or expression for sell price field\");\n }\n\n mat.sllman[0] = true;\n mat.sllman[1] = q; //Use sanitized input\n } else if (isNaN(parseFloat(amt))) {\n throw new Error(\"Invalid value for sell quantity field! Must be numeric or 'MAX'\");\n } else {\n let q = parseFloat(amt);\n\n if (isNaN(q)) {\n q = 0;\n }\n\n if (q === 0) {\n mat.sllman[0] = false;\n mat.sllman[1] = 0;\n } else {\n mat.sllman[0] = true;\n mat.sllman[1] = q;\n }\n }\n}\nfunction SellProduct(product, city, amt, price, all) {\n //Parse price\n if (price.includes(\"MP\")) {\n //Dynamically evaluated quantity. First test to make sure its valid\n //Sanitize input, then replace dynamic variables with arbitrary numbers\n price = price.replace(/\\s+/g, \"\");\n price = price.replace(/[^-()\\d/*+.MP]/g, \"\");\n let temp = price.replace(/MP/g, \"1\");\n\n try {\n temp = eval(temp);\n } catch (e) {\n throw new Error(\"Invalid value or expression for sell quantity field: \" + e);\n }\n\n if (temp == null || isNaN(parseFloat(temp))) {\n throw new Error(\"Invalid value or expression for sell quantity field.\");\n }\n\n product.sCost = price; //Use sanitized price\n } else {\n const cost = parseFloat(price);\n\n if (isNaN(cost)) {\n throw new Error(\"Invalid value for sell price field\");\n }\n\n product.sCost = cost;\n } // Array of all cities. Used later\n\n\n const cities = Object.keys(_Locations_Cities__WEBPACK_IMPORTED_MODULE_6__[/* Cities */ \"a\"]); // Parse quantity\n\n if (amt.includes(\"MAX\") || amt.includes(\"PROD\")) {\n //Dynamically evaluated quantity. First test to make sure its valid\n let qty = amt.replace(/\\s+/g, \"\");\n qty = qty.replace(/[^-()\\d/*+.MAXPROD]/g, \"\");\n let temp = qty.replace(/MAX/g, \"1\");\n temp = temp.replace(/PROD/g, \"1\");\n\n try {\n temp = eval(temp);\n } catch (e) {\n throw new Error(\"Invalid value or expression for sell price field: \" + e);\n }\n\n if (temp == null || isNaN(parseFloat(temp))) {\n throw new Error(\"Invalid value or expression for sell price field\");\n }\n\n if (all) {\n for (let i = 0; i < cities.length; ++i) {\n const tempCity = cities[i];\n product.sllman[tempCity][0] = true;\n product.sllman[tempCity][1] = qty; //Use sanitized input\n }\n } else {\n product.sllman[city][0] = true;\n product.sllman[city][1] = qty; //Use sanitized input\n }\n } else if (isNaN(parseFloat(amt))) {\n throw new Error(\"Invalid value for sell quantity field! Must be numeric\");\n } else {\n let qty = parseFloat(amt);\n\n if (isNaN(qty)) {\n qty = 0;\n }\n\n if (qty === 0) {\n if (all) {\n for (let i = 0; i < cities.length; ++i) {\n const tempCity = cities[i];\n product.sllman[tempCity][0] = false;\n product.sllman[tempCity][1] = \"\";\n }\n } else {\n product.sllman[city][0] = false;\n product.sllman[city][1] = \"\";\n }\n } else {\n if (all) {\n for (let i = 0; i < cities.length; ++i) {\n const tempCity = cities[i];\n product.sllman[tempCity][0] = true;\n product.sllman[tempCity][1] = qty;\n }\n } else {\n product.sllman[city][0] = true;\n product.sllman[city][1] = qty;\n }\n }\n }\n}\nfunction SetSmartSupply(warehouse, smartSupply) {\n warehouse.smartSupplyEnabled = smartSupply;\n}\nfunction SetSmartSupplyUseLeftovers(warehouse, material, useLeftover) {\n if (!Object.keys(warehouse.smartSupplyUseLeftovers).includes(material.name)) throw new Error(`Invalid material '${material.name}'`);\n warehouse.smartSupplyUseLeftovers[material.name] = useLeftover;\n}\nfunction BuyMaterial(material, amt) {\n if (isNaN(amt)) {\n throw new Error(`Invalid amount '${amt}' to buy material '${material.name}'`);\n }\n\n material.buy = amt;\n}\nfunction AssignJob(employee, job) {\n if (!Object.values(_EmployeePositions__WEBPACK_IMPORTED_MODULE_7__[/* EmployeePositions */ \"a\"]).includes(job)) throw new Error(`'${job}' is not a valid job.`);\n employee.pos = job;\n}\nfunction UpgradeOfficeSize(corp, office, size) {\n const initialPriceMult = Math.round(office.size / _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialSize);\n const costMultiplier = 1.09; // Calculate cost to upgrade size by 15 employees\n\n let mult = 0;\n\n for (let i = 0; i < size / _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialSize; ++i) {\n mult += Math.pow(costMultiplier, initialPriceMult + i);\n }\n\n const cost = _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].OfficeInitialCost * mult;\n if (corp.funds.lt(cost)) return;\n office.size += size;\n corp.funds = corp.funds.minus(cost);\n}\nfunction ThrowParty(corp, office, costPerEmployee) {\n const totalCost = costPerEmployee * office.employees.length;\n if (corp.funds.lt(totalCost)) return 0;\n corp.funds = corp.funds.minus(totalCost);\n let mult = 0;\n\n for (let i = 0; i < office.employees.length; ++i) {\n mult = office.employees[i].throwParty(costPerEmployee);\n }\n\n return mult;\n}\nfunction PurchaseWarehouse(corp, division, city) {\n if (corp.funds.lt(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].WarehouseInitialCost)) return;\n if (division.warehouses[city] instanceof _Warehouse__WEBPACK_IMPORTED_MODULE_5__[/* Warehouse */ \"a\"]) return;\n division.warehouses[city] = new _Warehouse__WEBPACK_IMPORTED_MODULE_5__[/* Warehouse */ \"a\"]({\n corp: corp,\n industry: division,\n loc: city,\n size: _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].WarehouseInitialSize\n });\n corp.funds = corp.funds.minus(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].WarehouseInitialCost);\n}\nfunction UpgradeWarehouse(corp, division, warehouse) {\n const sizeUpgradeCost = _data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* CorporationConstants */ \"a\"].WarehouseUpgradeBaseCost * Math.pow(1.07, warehouse.level + 1);\n ++warehouse.level;\n warehouse.updateSize(corp, division);\n corp.funds = corp.funds.minus(sizeUpgradeCost);\n}\nfunction BuyCoffee(corp, division, office) {\n const upgrade = _IndustryUpgrades__WEBPACK_IMPORTED_MODULE_8__[/* IndustryUpgrades */ \"a\"][0];\n const cost = office.employees.length * upgrade[1];\n if (corp.funds.lt(cost)) return;\n corp.funds = corp.funds.minus(cost);\n division.upgrade(upgrade, {\n corporation: corp,\n office: office\n });\n}\nfunction HireAdVert(corp, division, office) {\n const upgrade = _IndustryUpgrades__WEBPACK_IMPORTED_MODULE_8__[/* IndustryUpgrades */ \"a\"][1];\n const cost = upgrade[1] * Math.pow(upgrade[2], division.upgrades[1]);\n if (corp.funds.lt(cost)) return;\n corp.funds = corp.funds.minus(cost);\n division.upgrade(upgrade, {\n corporation: corp,\n office: office\n });\n}\nfunction MakeProduct(corp, division, city, productName, designInvest, marketingInvest) {\n if (designInvest < 0) {\n designInvest = 0;\n }\n\n if (marketingInvest < 0) {\n marketingInvest = 0;\n }\n\n if (productName == null || productName === \"\") {\n throw new Error(\"You must specify a name for your product!\");\n }\n\n if (isNaN(designInvest)) {\n throw new Error(\"Invalid value for design investment\");\n }\n\n if (isNaN(marketingInvest)) {\n throw new Error(\"Invalid value for marketing investment\");\n }\n\n if (corp.funds.lt(designInvest + marketingInvest)) {\n throw new Error(\"You don't have enough company funds to make this large of an investment\");\n }\n\n const product = new _Product__WEBPACK_IMPORTED_MODULE_4__[/* Product */ \"a\"]({\n name: productName.replace(/[<>]/g, \"\"),\n //Sanitize for HTMl elements\n createCity: city,\n designCost: designInvest,\n advCost: marketingInvest\n });\n\n if (division.products[product.name] instanceof _Product__WEBPACK_IMPORTED_MODULE_4__[/* Product */ \"a\"]) {\n throw new Error(`You already have a product with this name!`);\n }\n\n corp.funds = corp.funds.minus(designInvest + marketingInvest);\n division.products[product.name] = product;\n}\nfunction Research(division, researchName) {\n const researchTree = _IndustryData__WEBPACK_IMPORTED_MODULE_0__[/* IndustryResearchTrees */ \"c\"][division.type];\n if (researchTree === undefined) throw new Error(`No research tree for industry '${division.type}'`);\n const allResearch = researchTree.getAllNodes();\n if (!allResearch.includes(researchName)) throw new Error(`No research named '${researchName}'`);\n const research = _ResearchMap__WEBPACK_IMPORTED_MODULE_9__[/* ResearchMap */ \"a\"][researchName];\n if (division.sciResearch.qty < research.cost) throw new Error(`You do not have enough Scientific Research for ${research.name}`);\n division.sciResearch.qty -= research.cost; // Get the Node from the Research Tree and set its 'researched' property\n\n researchTree.research(researchName);\n division.researched[researchName] = true;\n}\nfunction ExportMaterial(divisionName, cityName, material, amt) {\n // Sanitize amt\n let sanitizedAmt = amt.replace(/\\s+/g, \"\");\n sanitizedAmt = sanitizedAmt.replace(/[^-()\\d/*+.MAX]/g, \"\");\n let temp = sanitizedAmt.replace(/MAX/g, \"1\");\n\n try {\n temp = eval(temp);\n } catch (e) {\n throw new Error(\"Invalid expression entered for export amount: \" + e);\n }\n\n const n = parseFloat(temp);\n\n if (n == null || isNaN(n) || n < 0) {\n throw new Error(\"Invalid amount entered for export\");\n }\n\n const exportObj = {\n ind: divisionName,\n city: cityName,\n amt: sanitizedAmt\n };\n material.exp.push(exportObj);\n}\nfunction CancelExportMaterial(divisionName, cityName, material, amt) {\n for (let i = 0; i < material.exp.length; ++i) {\n if (material.exp[i].ind !== divisionName || material.exp[i].city !== cityName || material.exp[i].amt !== amt) continue;\n material.exp.splice(i, 1);\n break;\n }\n}\nfunction LimitProductProduction(product, cityName, qty) {\n if (qty < 0 || isNaN(qty)) {\n product.prdman[cityName][0] = false;\n } else {\n product.prdman[cityName][0] = true;\n product.prdman[cityName][1] = qty;\n }\n}\nfunction SetMaterialMarketTA1(material, on) {\n material.marketTa1 = on;\n}\nfunction SetMaterialMarketTA2(material, on) {\n material.marketTa2 = on;\n}\nfunction SetProductMarketTA1(product, on) {\n product.marketTa1 = on;\n}\nfunction SetProductMarketTA2(product, on) {\n product.marketTa2 = on;\n}\n\n//# sourceURL=webpack:///./src/Corporation/Actions.ts?");
-
-/***/ }),
-/* 54 */
-/*!**********************************!*\
- !*** ./src/Programs/Programs.ts ***!
- \**********************************/
-/*! exports provided: Programs */
-/*! exports used: Programs */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Programs; });\n/* harmony import */ var _Program__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Program */ 651);\n/* harmony import */ var _data_ProgramsMetadata__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data/ProgramsMetadata */ 652);\n\n\nconst Programs = {};\n\nfor (const params of _data_ProgramsMetadata__WEBPACK_IMPORTED_MODULE_1__[/* programsMetadata */ \"a\"]) {\n Programs[params.key] = new _Program__WEBPACK_IMPORTED_MODULE_0__[/* Program */ \"a\"](params.name, params.create, params.run);\n}\n\n//# sourceURL=webpack:///./src/Programs/Programs.ts?");
-
-/***/ }),
-/* 55 */
-/*!*********************************************************!*\
- !*** ./src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts ***!
- \*********************************************************/
-/*! exports provided: SleeveTaskType */
-/*! exports used: SleeveTaskType */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SleeveTaskType; });\n/**\n * Enum for different types of tasks that a Sleeve can perform\n */\nlet SleeveTaskType;\n\n(function (SleeveTaskType) {\n SleeveTaskType[SleeveTaskType[\"Idle\"] = 0] = \"Idle\";\n SleeveTaskType[SleeveTaskType[\"Company\"] = 1] = \"Company\";\n SleeveTaskType[SleeveTaskType[\"Faction\"] = 2] = \"Faction\";\n SleeveTaskType[SleeveTaskType[\"Crime\"] = 3] = \"Crime\";\n SleeveTaskType[SleeveTaskType[\"Class\"] = 4] = \"Class\";\n SleeveTaskType[SleeveTaskType[\"Gym\"] = 5] = \"Gym\";\n SleeveTaskType[SleeveTaskType[\"Recovery\"] = 6] = \"Recovery\";\n SleeveTaskType[SleeveTaskType[\"Synchro\"] = 7] = \"Synchro\";\n})(SleeveTaskType || (SleeveTaskType = {}));\n\n//# sourceURL=webpack:///./src/PersonObjects/Sleeve/SleeveTaskTypesEnum.ts?");
-
-/***/ }),
-/* 56 */,
-/* 57 */,
-/* 58 */,
-/* 59 */
-/*!******************************!*\
- !*** ./src/Gang/AllGangs.ts ***!
- \******************************/
-/*! exports provided: AllGangs, resetGangs, loadAllGangs */
-/*! exports used: AllGangs, loadAllGangs, resetGangs */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AllGangs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return resetGangs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return loadAllGangs; });\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n\nlet AllGangs = {\n \"Slum Snakes\": {\n power: 1,\n territory: 1 / 7\n },\n Tetrads: {\n power: 1,\n territory: 1 / 7\n },\n \"The Syndicate\": {\n power: 1,\n territory: 1 / 7\n },\n \"The Dark Army\": {\n power: 1,\n territory: 1 / 7\n },\n \"Speakers for the Dead\": {\n power: 1,\n territory: 1 / 7\n },\n NiteSec: {\n power: 1,\n territory: 1 / 7\n },\n \"The Black Hand\": {\n power: 1,\n territory: 1 / 7\n }\n};\nfunction resetGangs() {\n AllGangs = {\n \"Slum Snakes\": {\n power: 1,\n territory: 1 / 7\n },\n Tetrads: {\n power: 1,\n territory: 1 / 7\n },\n \"The Syndicate\": {\n power: 1,\n territory: 1 / 7\n },\n \"The Dark Army\": {\n power: 1,\n territory: 1 / 7\n },\n \"Speakers for the Dead\": {\n power: 1,\n territory: 1 / 7\n },\n NiteSec: {\n power: 1,\n territory: 1 / 7\n },\n \"The Black Hand\": {\n power: 1,\n territory: 1 / 7\n }\n };\n}\nfunction loadAllGangs(saveString) {\n AllGangs = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Reviver */ \"c\"]);\n}\n\n//# sourceURL=webpack:///./src/Gang/AllGangs.ts?");
-
-/***/ }),
-/* 60 */,
-/* 61 */
-/*!*****************************!*\
- !*** ./src/Crime/Crimes.ts ***!
- \*****************************/
-/*! exports provided: Crimes */
-/*! exports used: Crimes */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Crimes; });\n/* harmony import */ var _Crime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Crime */ 159);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Constants */ 5);\n\n\nconst Crimes = {\n Shoplift: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Shoplift\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeShoplift, 2e3, 15e3, 1 / 20, 0.1, {\n dexterity_success_weight: 1,\n agility_success_weight: 1,\n dexterity_exp: 2,\n agility_exp: 2\n }),\n RobStore: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Rob Store\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeRobStore, 60e3, 400e3, 1 / 5, 0.5, {\n hacking_exp: 30,\n dexterity_exp: 45,\n agility_exp: 45,\n hacking_success_weight: 0.5,\n dexterity_success_weight: 2,\n agility_success_weight: 1,\n intelligence_exp: 7.5 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n }),\n Mug: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Mug\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeMug, 4e3, 36e3, 1 / 5, 0.25, {\n strength_exp: 3,\n defense_exp: 3,\n dexterity_exp: 3,\n agility_exp: 3,\n strength_success_weight: 1.5,\n defense_success_weight: 0.5,\n dexterity_success_weight: 1.5,\n agility_success_weight: 0.5\n }),\n Larceny: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Larceny\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeLarceny, 90e3, 800e3, 1 / 3, 1.5, {\n hacking_exp: 45,\n dexterity_exp: 60,\n agility_exp: 60,\n hacking_success_weight: 0.5,\n dexterity_success_weight: 1,\n agility_success_weight: 1,\n intelligence_exp: 15 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n }),\n DealDrugs: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Deal Drugs\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeDrugs, 10e3, 120e3, 1, 0.5, {\n dexterity_exp: 5,\n agility_exp: 5,\n charisma_exp: 10,\n charisma_success_weight: 3,\n dexterity_success_weight: 2,\n agility_success_weight: 1\n }),\n BondForgery: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Bond Forgery\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeBondForgery, 300e3, 4.5e6, 1 / 2, 0.1, {\n hacking_exp: 100,\n dexterity_exp: 150,\n charisma_exp: 15,\n hacking_success_weight: 0.05,\n dexterity_success_weight: 1.25,\n intelligence_exp: 60 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n }),\n TraffickArms: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Traffick Arms\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeTraffickArms, 40e3, 600e3, 2, 1, {\n strength_exp: 20,\n defense_exp: 20,\n dexterity_exp: 20,\n agility_exp: 20,\n charisma_exp: 40,\n charisma_success_weight: 1,\n strength_success_weight: 1,\n defense_success_weight: 1,\n dexterity_success_weight: 1,\n agility_success_weight: 1\n }),\n Homicide: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Homicide\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeHomicide, 3e3, 45e3, 1, 3, {\n strength_exp: 2,\n defense_exp: 2,\n dexterity_exp: 2,\n agility_exp: 2,\n strength_success_weight: 2,\n defense_success_weight: 2,\n dexterity_success_weight: 0.5,\n agility_success_weight: 0.5,\n kills: 1\n }),\n GrandTheftAuto: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Grand Theft Auto\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeGrandTheftAuto, 80e3, 1.6e6, 8, 5, {\n strength_exp: 20,\n defense_exp: 20,\n dexterity_exp: 20,\n agility_exp: 80,\n charisma_exp: 40,\n hacking_success_weight: 1,\n strength_success_weight: 1,\n dexterity_success_weight: 4,\n agility_success_weight: 2,\n charisma_success_weight: 2,\n intelligence_exp: 16 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n }),\n Kidnap: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Kidnap\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeKidnap, 120e3, 3.6e6, 5, 6, {\n strength_exp: 80,\n defense_exp: 80,\n dexterity_exp: 80,\n agility_exp: 80,\n charisma_exp: 80,\n charisma_success_weight: 1,\n strength_success_weight: 1,\n dexterity_success_weight: 1,\n agility_success_weight: 1,\n intelligence_exp: 26 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n }),\n Assassination: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Assassination\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeAssassination, 300e3, 12e6, 8, 10, {\n strength_exp: 300,\n defense_exp: 300,\n dexterity_exp: 300,\n agility_exp: 300,\n strength_success_weight: 1,\n dexterity_success_weight: 2,\n agility_success_weight: 1,\n intelligence_exp: 65 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain,\n kills: 1\n }),\n Heist: new _Crime__WEBPACK_IMPORTED_MODULE_0__[/* Crime */ \"a\"](\"Heist\", _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].CrimeHeist, 600e3, 120e6, 18, 15, {\n hacking_exp: 450,\n strength_exp: 450,\n defense_exp: 450,\n dexterity_exp: 450,\n agility_exp: 450,\n charisma_exp: 450,\n hacking_success_weight: 1,\n strength_success_weight: 1,\n defense_success_weight: 1,\n dexterity_success_weight: 1,\n agility_success_weight: 1,\n charisma_success_weight: 1,\n intelligence_exp: 130 * _Constants__WEBPACK_IMPORTED_MODULE_1__[/* CONSTANTS */ \"a\"].IntelligenceCrimeBaseExpGain\n })\n};\n\n//# sourceURL=webpack:///./src/Crime/Crimes.ts?");
-
-/***/ }),
-/* 62 */
-/*!*****************************!*\
- !*** ./src/Casino/utils.ts ***!
- \*****************************/
-/*! exports provided: trusted */
-/*! exports used: trusted */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return trusted; });\nfunction trusted(f) {\n return function (event) {\n if (!event.isTrusted) return;\n f();\n };\n}\n\n//# sourceURL=webpack:///./src/Casino/utils.ts?");
-
-/***/ }),
-/* 63 */
-/*!*****************************************!*\
- !*** ./src/Company/CompanyPositions.ts ***!
- \*****************************************/
-/*! exports provided: CompanyPositions */
-/*! exports used: CompanyPositions */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return CompanyPositions; });\n/* harmony import */ var _data_CompanyPositionsMetadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./data/CompanyPositionsMetadata */ 698);\n/* harmony import */ var _CompanyPosition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CompanyPosition */ 279);\n// Constructs all CompanyPosition objects using the metadata in data/companypositions.ts\n\n\nconst CompanyPositions = {};\n\nfunction addCompanyPosition(params) {\n if (CompanyPositions[params.name] != null) {\n console.warn(`Duplicate Company Position being defined: ${params.name}`);\n }\n\n CompanyPositions[params.name] = new _CompanyPosition__WEBPACK_IMPORTED_MODULE_1__[/* CompanyPosition */ \"a\"](params);\n}\n\n_data_CompanyPositionsMetadata__WEBPACK_IMPORTED_MODULE_0__[/* companyPositionMetadata */ \"a\"].forEach(e => {\n addCompanyPosition(e);\n});\n\n//# sourceURL=webpack:///./src/Company/CompanyPositions.ts?");
-
-/***/ }),
-/* 64 */,
-/* 65 */,
-/* 66 */,
-/* 67 */,
-/* 68 */,
-/* 69 */
-/*!************************************!*\
- !*** ./src/Fconf/FconfSettings.ts ***!
- \************************************/
-/*! exports provided: FconfSettings */
-/*! exports used: FconfSettings */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return FconfSettings; });\nconst FconfSettings = {\n ENABLE_BASH_HOTKEYS: false,\n ENABLE_TIMESTAMPS: false,\n MAIN_MENU_STYLE: \"default\",\n THEME_BACKGROUND_COLOR: \"#000000\",\n THEME_FONT_COLOR: \"#66ff33\",\n THEME_HIGHLIGHT_COLOR: \"#ffffff\",\n THEME_PROMPT_COLOR: \"#f92672\",\n WRAP_INPUT: false\n};\n\n//# sourceURL=webpack:///./src/Fconf/FconfSettings.ts?");
-
-/***/ }),
-/* 70 */
-/*!**********************************************!*\
- !*** ./src/StockMarket/data/StockSymbols.ts ***!
- \**********************************************/
-/*! exports provided: StockSymbols */
-/*! exports used: StockSymbols */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return StockSymbols; });\n/* harmony import */ var _Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../Locations/data/LocationNames */ 9);\n\nconst StockSymbols = {}; // Stocks for companies at which you can work\n\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumECorp] = \"ECP\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12MegaCorp] = \"MGCP\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12BladeIndustries] = \"BLD\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumClarkeIncorporated] = \"CLRK\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenOmniTekIncorporated] = \"OMTK\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12FourSigma] = \"FSIG\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].ChongqingKuaiGongInternational] = \"KGI\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumFulcrumTechnologies] = \"FLCM\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].IshimaStormTechnologies] = \"STM\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].NewTokyoDefComm] = \"DCOMM\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenHeliosLabs] = \"HLS\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].NewTokyoVitaLife] = \"VITA\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12IcarusMicrosystems] = \"ICRS\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12UniversalEnergy] = \"UNV\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumAeroCorp] = \"AERO\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenOmniaCybersystems] = \"OMN\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].ChongqingSolarisSpaceSystems] = \"SLRS\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].NewTokyoGlobalPharmaceuticals] = \"GPH\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].IshimaNovaMedical] = \"NVMD\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumWatchdogSecurity] = \"WDS\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenLexoCorp] = \"LXO\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumRhoConstruction] = \"RHOC\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12AlphaEnterprises] = \"APHE\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenSysCoreSecurities] = \"SYSC\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].VolhavenCompuTek] = \"CTK\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].AevumNetLinkTechnologies] = \"NTLK\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].IshimaOmegaSoftware] = \"OMGA\";\nStockSymbols[_Locations_data_LocationNames__WEBPACK_IMPORTED_MODULE_0__[/* LocationName */ \"a\"].Sector12FoodNStuff] = \"FNS\"; // Stocks for other companies\n\nStockSymbols[\"Sigma Cosmetics\"] = \"SGC\";\nStockSymbols[\"Joes Guns\"] = \"JGN\";\nStockSymbols[\"Catalyst Ventures\"] = \"CTYS\";\nStockSymbols[\"Microdyne Technologies\"] = \"MDYN\";\nStockSymbols[\"Titan Laboratories\"] = \"TITN\";\n\n//# sourceURL=webpack:///./src/StockMarket/data/StockSymbols.ts?");
-
-/***/ }),
-/* 71 */,
-/* 72 */,
-/* 73 */,
-/* 74 */
-/*!*****************************************!*\
- !*** ./src/StockMarket/StockMarket.tsx ***!
- \*****************************************/
-/*! exports provided: StockMarket, SymbolToStockMap, placeOrder, cancelOrder, loadStockMarket, deleteStockMarket, initStockMarket, initSymbolToStockMap, stockMarketCycle, processStockPrices, initStockMarketFnForReact, eventEmitterForUiReset */
-/*! exports used: StockMarket, SymbolToStockMap, cancelOrder, deleteStockMarket, eventEmitterForUiReset, initStockMarket, initStockMarketFnForReact, initSymbolToStockMap, loadStockMarket, placeOrder, processStockPrices */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return StockMarket; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return SymbolToStockMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return placeOrder; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return cancelOrder; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return loadStockMarket; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return deleteStockMarket; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return initStockMarket; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return initSymbolToStockMap; });\n/* unused harmony export stockMarketCycle */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return processStockPrices; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return initStockMarketFnForReact; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return eventEmitterForUiReset; });\n/* harmony import */ var _Order__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Order */ 528);\n/* harmony import */ var _OrderProcessing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./OrderProcessing */ 254);\n/* harmony import */ var _Stock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Stock */ 105);\n/* harmony import */ var _StockMarketConstants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./StockMarketConstants */ 478);\n/* harmony import */ var _data_InitStockMetadata__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./data/InitStockMetadata */ 706);\n/* harmony import */ var _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./data/OrderTypes */ 81);\n/* harmony import */ var _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./data/PositionTypes */ 52);\n/* harmony import */ var _data_StockSymbols__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./data/StockSymbols */ 70);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Constants */ 5);\n/* harmony import */ var _utils_EventEmitter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/EventEmitter */ 347);\n/* harmony import */ var _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! .././ui/numeralFormat */ 3);\n/* harmony import */ var _utils_DialogBox__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../utils/DialogBox */ 10);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet StockMarket = {\n lastUpdate: 0,\n Orders: {},\n storedCycles: 0,\n ticksUntilCycle: 0\n}; // Maps full stock name -> Stock object\n\nconst SymbolToStockMap = {}; // Maps symbol -> Stock object\n\nfunction placeOrder(stock, shares, price, type, position, workerScript = null) {\n if (!(stock instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"])) {\n if (workerScript) {\n workerScript.log(\"placeOrder\", `Invalid stock: '${stock}'`);\n } else {\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_11__[/* dialogBoxCreate */ \"a\"])(`ERROR: Invalid stock passed to placeOrder() function`);\n }\n\n return false;\n }\n\n if (typeof shares !== \"number\" || typeof price !== \"number\") {\n if (workerScript) {\n workerScript.log(\"placeOrder\", `Invalid arguments: shares='${shares}' price='${price}'`);\n } else {\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_11__[/* dialogBoxCreate */ \"a\"])(\"ERROR: Invalid numeric value provided for either 'shares' or 'price' argument\");\n }\n\n return false;\n }\n\n const order = new _Order__WEBPACK_IMPORTED_MODULE_0__[/* Order */ \"a\"](stock.symbol, shares, price, type, position);\n\n if (StockMarket[\"Orders\"] == null) {\n const orders = {};\n\n for (const name in StockMarket) {\n const stk = StockMarket[name];\n\n if (!(stk instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"])) {\n continue;\n }\n\n orders[stk.symbol] = [];\n }\n\n StockMarket[\"Orders\"] = orders;\n }\n\n StockMarket[\"Orders\"][stock.symbol].push(order); // Process to see if it should be executed immediately\n\n const processOrderRefs = {\n stockMarket: StockMarket,\n symbolToStockMap: SymbolToStockMap\n };\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, order.type, order.pos, processOrderRefs);\n return true;\n} // Returns true if successfully cancels an order, false otherwise\n\nfunction cancelOrder(params, workerScript = null) {\n if (StockMarket[\"Orders\"] == null) {\n return false;\n }\n\n if (params.order && params.order instanceof _Order__WEBPACK_IMPORTED_MODULE_0__[/* Order */ \"a\"]) {\n const order = params.order; // An 'Order' object is passed in\n\n const stockOrders = StockMarket[\"Orders\"][order.stockSymbol];\n\n for (let i = 0; i < stockOrders.length; ++i) {\n if (order == stockOrders[i]) {\n stockOrders.splice(i, 1);\n return true;\n }\n }\n\n return false;\n } else if (params.stock && params.shares && params.price && params.type && params.pos && params.stock instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"]) {\n // Order properties are passed in. Need to look for the order\n const stockOrders = StockMarket[\"Orders\"][params.stock.symbol];\n const orderTxt = params.stock.symbol + \" - \" + params.shares + \" @ \" + _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_10__[/* numeralWrapper */ \"a\"].formatMoney(params.price);\n\n for (let i = 0; i < stockOrders.length; ++i) {\n const order = stockOrders[i];\n\n if (params.shares === order.shares && params.price === order.price && params.type === order.type && params.pos === order.pos) {\n stockOrders.splice(i, 1);\n\n if (workerScript) {\n workerScript.scriptRef.log(\"Successfully cancelled order: \" + orderTxt);\n }\n\n return true;\n }\n }\n\n if (workerScript) {\n workerScript.scriptRef.log(\"Failed to cancel order: \" + orderTxt);\n }\n\n return false;\n }\n\n return false;\n}\nfunction loadStockMarket(saveString) {\n if (saveString === \"\") {\n StockMarket = {\n lastUpdate: 0,\n Orders: {},\n storedCycles: 0,\n ticksUntilCycle: 0\n };\n } else {\n StockMarket = JSON.parse(saveString, _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_12__[/* Reviver */ \"c\"]);\n }\n}\nfunction deleteStockMarket() {\n StockMarket = {\n lastUpdate: 0,\n Orders: {},\n storedCycles: 0,\n ticksUntilCycle: 0\n };\n}\nfunction initStockMarket() {\n for (const stk in StockMarket) {\n if (StockMarket.hasOwnProperty(stk)) {\n delete StockMarket[stk];\n }\n }\n\n for (const metadata of _data_InitStockMetadata__WEBPACK_IMPORTED_MODULE_4__[/* InitStockMetadata */ \"a\"]) {\n const name = metadata.name;\n StockMarket[name] = new _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"](metadata);\n }\n\n const orders = {};\n\n for (const name in StockMarket) {\n const stock = StockMarket[name];\n\n if (!(stock instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"])) {\n continue;\n }\n\n orders[stock.symbol] = [];\n }\n\n StockMarket[\"Orders\"] = orders;\n StockMarket.storedCycles = 0;\n StockMarket.lastUpdate = 0;\n StockMarket.ticksUntilCycle = _StockMarketConstants__WEBPACK_IMPORTED_MODULE_3__[/* TicksPerCycle */ \"a\"];\n}\nfunction initSymbolToStockMap() {\n for (const name in _data_StockSymbols__WEBPACK_IMPORTED_MODULE_7__[/* StockSymbols */ \"a\"]) {\n if (_data_StockSymbols__WEBPACK_IMPORTED_MODULE_7__[/* StockSymbols */ \"a\"].hasOwnProperty(name)) {\n const stock = StockMarket[name];\n\n if (stock == null) {\n console.error(`Could not find Stock for ${name}`);\n continue;\n }\n\n const symbol = _data_StockSymbols__WEBPACK_IMPORTED_MODULE_7__[/* StockSymbols */ \"a\"][name];\n SymbolToStockMap[symbol] = stock;\n }\n }\n}\nfunction stockMarketCycle() {\n for (const name in StockMarket) {\n const stock = StockMarket[name];\n\n if (!(stock instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"])) {\n continue;\n }\n\n const roll = Math.random();\n\n if (roll < 0.45) {\n stock.b = !stock.b;\n stock.flipForecastForecast();\n }\n\n StockMarket.ticksUntilCycle = _StockMarketConstants__WEBPACK_IMPORTED_MODULE_3__[/* TicksPerCycle */ \"a\"];\n }\n} // Stock prices updated every 6 seconds\n\nconst msPerStockUpdate = 6e3;\nconst cyclesPerStockUpdate = msPerStockUpdate / _Constants__WEBPACK_IMPORTED_MODULE_8__[/* CONSTANTS */ \"a\"].MilliPerCycle;\nfunction processStockPrices(numCycles = 1) {\n if (StockMarket.storedCycles == null || isNaN(StockMarket.storedCycles)) {\n StockMarket.storedCycles = 0;\n }\n\n StockMarket.storedCycles += numCycles;\n\n if (StockMarket.storedCycles < cyclesPerStockUpdate) {\n return;\n } // We can process the update every 4 seconds as long as there are enough\n // stored cycles. This lets us account for offline time\n\n\n const timeNow = new Date().getTime();\n\n if (timeNow - StockMarket.lastUpdate < 4e3) {\n return;\n }\n\n StockMarket.lastUpdate = timeNow;\n StockMarket.storedCycles -= cyclesPerStockUpdate; // Cycle\n\n if (StockMarket.ticksUntilCycle == null || typeof StockMarket.ticksUntilCycle !== \"number\") {\n StockMarket.ticksUntilCycle = _StockMarketConstants__WEBPACK_IMPORTED_MODULE_3__[/* TicksPerCycle */ \"a\"];\n }\n\n --StockMarket.ticksUntilCycle;\n\n if (StockMarket.ticksUntilCycle <= 0) {\n stockMarketCycle();\n }\n\n const v = Math.random();\n\n for (const name in StockMarket) {\n const stock = StockMarket[name];\n\n if (!(stock instanceof _Stock__WEBPACK_IMPORTED_MODULE_2__[/* Stock */ \"a\"])) {\n continue;\n }\n\n let av = v * stock.mv / 100;\n\n if (isNaN(av)) {\n av = 0.02;\n }\n\n let chc = 50;\n\n if (stock.b) {\n chc = (chc + stock.otlkMag) / 100;\n } else {\n chc = (chc - stock.otlkMag) / 100;\n }\n\n if (stock.price >= stock.cap) {\n chc = 0.1; // \"Soft Limit\" on stock price. It could still go up but its unlikely\n\n stock.b = false;\n }\n\n if (isNaN(chc)) {\n chc = 0.5;\n }\n\n const c = Math.random();\n const processOrderRefs = {\n stockMarket: StockMarket,\n symbolToStockMap: SymbolToStockMap\n };\n\n if (c < chc) {\n stock.changePrice(stock.price * (1 + av));\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].LimitBuy, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Short, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].LimitSell, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Long, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].StopBuy, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Long, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].StopSell, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Short, processOrderRefs);\n } else {\n stock.changePrice(stock.price / (1 + av));\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].LimitBuy, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Long, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].LimitSell, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Short, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].StopBuy, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Short, processOrderRefs);\n Object(_OrderProcessing__WEBPACK_IMPORTED_MODULE_1__[/* processOrders */ \"a\"])(stock, _data_OrderTypes__WEBPACK_IMPORTED_MODULE_5__[/* OrderTypes */ \"a\"].StopSell, _data_PositionTypes__WEBPACK_IMPORTED_MODULE_6__[/* PositionTypes */ \"a\"].Long, processOrderRefs);\n }\n\n let otlkMagChange = stock.otlkMag * av;\n\n if (stock.otlkMag < 5) {\n if (stock.otlkMag <= 1) {\n otlkMagChange = 1;\n } else {\n otlkMagChange *= 10;\n }\n }\n\n stock.cycleForecast(otlkMagChange);\n stock.cycleForecastForecast(otlkMagChange / 2); // Shares required for price movement gradually approaches max over time\n\n stock.shareTxUntilMovement = Math.min(stock.shareTxUntilMovement + 10, stock.shareTxForMovement);\n }\n}\nfunction initStockMarketFnForReact() {\n initStockMarket();\n initSymbolToStockMap();\n}\nconst eventEmitterForUiReset = new _utils_EventEmitter__WEBPACK_IMPORTED_MODULE_9__[/* EventEmitter */ \"a\"]();\n\n//# sourceURL=webpack:///./src/StockMarket/StockMarket.tsx?");
-
-/***/ }),
-/* 75 */
-/*!***********************************!*\
- !*** ./utils/helpers/keyCodes.ts ***!
- \***********************************/
-/*! exports provided: KEY */
-/*! exports used: KEY */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return KEY; });\n/**\n * Keyboard key codes\n */\nconst KEY = {\n CTRL: 17,\n DOWNARROW: 40,\n ENTER: 13,\n ESC: 27,\n TAB: 9,\n UPARROW: 38,\n \"0\": 48,\n \"1\": 49,\n \"2\": 50,\n \"3\": 51,\n \"4\": 52,\n \"5\": 53,\n \"6\": 54,\n \"7\": 55,\n \"8\": 56,\n \"9\": 57,\n A: 65,\n B: 66,\n C: 67,\n D: 68,\n E: 69,\n F: 70,\n G: 71,\n H: 72,\n I: 73,\n J: 74,\n K: 75,\n L: 76,\n M: 77,\n N: 78,\n O: 79,\n P: 80,\n Q: 81,\n R: 82,\n S: 83,\n T: 84,\n U: 85,\n V: 86,\n W: 87,\n X: 88,\n Y: 89,\n Z: 90\n};\n\n//# sourceURL=webpack:///./utils/helpers/keyCodes.ts?");
-
-/***/ }),
-/* 76 */,
-/* 77 */
-/*!*************************************!*\
- !*** ./src/ui/React/Reputation.tsx ***!
- \*************************************/
-/*! exports provided: Reputation */
-/*! exports used: Reputation */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Reputation; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/numeralFormat */ 3);\n\n\nfunction Reputation(reputation) {\n return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"reputation samefont\"\n }, typeof reputation === \"number\" ? _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__[/* numeralWrapper */ \"a\"].formatReputation(reputation) : reputation);\n}\n\n//# sourceURL=webpack:///./src/ui/React/Reputation.tsx?");
-
-/***/ }),
-/* 78 */,
-/* 79 */,
-/* 80 */
-/*!********************************!*\
- !*** ./src/CodingContracts.ts ***!
- \********************************/
-/*! exports provided: CodingContractType, CodingContractTypes, CodingContractRewardType, CodingContractResult, CodingContract */
-/*! exports used: CodingContract, CodingContractResult, CodingContractRewardType, CodingContractTypes */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* unused harmony export CodingContractType */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return CodingContractTypes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return CodingContractRewardType; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CodingContractResult; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return CodingContract; });\n/* harmony import */ var _data_codingcontracttypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./data/codingcontracttypes */ 653);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/JSONReviver */ 15);\n/* harmony import */ var _ui_React_createPopup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui/React/createPopup */ 20);\n/* harmony import */ var _ui_React_CodingContractPopup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ui/React/CodingContractPopup */ 654);\nfunction _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\n\n\n\n\n/* tslint:disable:no-magic-numbers completed-docs max-classes-per-file no-console */\n\n/* Represents different types of problems that a Coding Contract can have */\n\nclass CodingContractType {\n /**\n * Function that generates a description of the problem\n */\n\n /**\n * Number that generally represents the problem's difficulty. Bigger numbers = harder\n */\n\n /**\n * A function that randomly generates a valid 'data' for the problem\n */\n\n /**\n * Name of the type of problem\n */\n\n /**\n * The maximum number of tries the player gets on this kind of problem before it self-destructs\n */\n\n /**\n * Stores a function that checks if the provided answer is correct\n */\n constructor(name, desc, gen, solver, diff, numTries) {\n this.name = name;\n this.desc = desc;\n this.generate = gen;\n this.solver = solver;\n this.difficulty = diff;\n this.numTries = numTries;\n }\n\n}\n/* Contract Types */\n// tslint:disable-next-line\n\nconst CodingContractTypes = {};\n\nfor (const md of _data_codingcontracttypes__WEBPACK_IMPORTED_MODULE_0__[/* codingContractTypesMetadata */ \"a\"]) {\n // tslint:disable-next-line\n CodingContractTypes[md.name] = new CodingContractType(md.name, md.desc, md.gen, md.solver, md.difficulty, md.numTries);\n}\n/**\n * Enum representing the different types of rewards a Coding Contract can give\n */\n\n\nlet CodingContractRewardType;\n/**\n * Enum representing the result when trying to solve the Contract\n */\n\n(function (CodingContractRewardType) {\n CodingContractRewardType[CodingContractRewardType[\"FactionReputation\"] = 0] = \"FactionReputation\";\n CodingContractRewardType[CodingContractRewardType[\"FactionReputationAll\"] = 1] = \"FactionReputationAll\";\n CodingContractRewardType[CodingContractRewardType[\"CompanyReputation\"] = 2] = \"CompanyReputation\";\n CodingContractRewardType[CodingContractRewardType[\"Money\"] = 3] = \"Money\";\n})(CodingContractRewardType || (CodingContractRewardType = {}));\n\nlet CodingContractResult;\n/**\n * A class that represents the type of reward a contract gives\n */\n\n(function (CodingContractResult) {\n CodingContractResult[CodingContractResult[\"Success\"] = 0] = \"Success\";\n CodingContractResult[CodingContractResult[\"Failure\"] = 1] = \"Failure\";\n CodingContractResult[CodingContractResult[\"Cancelled\"] = 2] = \"Cancelled\";\n})(CodingContractResult || (CodingContractResult = {}));\n\n/**\n * A Coding Contract is a file that poses a programming-related problem to the Player.\n * The player receives a reward if the problem is solved correctly\n */\nclass CodingContract {\n /* Relevant data for the contract's problem */\n\n /* Contract's filename */\n\n /* Describes the reward given if this Contract is solved. The reward is actually\n processed outside of this file */\n\n /* Number of times the Contract has been attempted */\n constructor(fn = \"\", type = \"Find Largest Prime Factor\", reward = null) {\n _defineProperty(this, \"tries\", 0);\n\n this.fn = fn;\n\n if (!this.fn.endsWith(\".cct\")) {\n this.fn += \".cct\";\n } // tslint:disable-next-line\n\n\n if (CodingContractTypes[type] == null) {\n throw new Error(`Error: invalid contract type: ${type} please contact developer`);\n }\n\n this.type = type;\n this.data = CodingContractTypes[type].generate();\n this.reward = reward;\n }\n\n getData() {\n return this.data;\n }\n\n getDescription() {\n return CodingContractTypes[this.type].desc(this.data);\n }\n\n getDifficulty() {\n return CodingContractTypes[this.type].difficulty;\n }\n\n getMaxNumTries() {\n return CodingContractTypes[this.type].numTries;\n }\n\n getType() {\n return CodingContractTypes[this.type].name;\n }\n\n isSolution(solution) {\n return CodingContractTypes[this.type].solver(this.data, solution);\n }\n /**\n * Creates a popup to prompt the player to solve the problem\n */\n\n\n async prompt() {\n const popupId = `coding-contract-prompt-popup-${this.fn}`;\n return new Promise(resolve => {\n Object(_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_2__[/* createPopup */ \"a\"])(popupId, _ui_React_CodingContractPopup__WEBPACK_IMPORTED_MODULE_3__[/* CodingContractPopup */ \"a\"], {\n c: this,\n popupId: popupId,\n onClose: () => {\n resolve(CodingContractResult.Cancelled);\n Object(_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_2__[/* removePopup */ \"b\"])(popupId);\n },\n onAttempt: val => {\n if (this.isSolution(val)) {\n resolve(CodingContractResult.Success);\n } else {\n resolve(CodingContractResult.Failure);\n }\n\n Object(_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_2__[/* removePopup */ \"b\"])(popupId);\n }\n }, () => resolve(CodingContractResult.Cancelled));\n });\n }\n /**\n * Serialize the current file to a JSON save state.\n */\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Generic_toJSON */ \"b\"])(\"CodingContract\", this);\n }\n /**\n * Initiatizes a CodingContract from a JSON save state.\n */\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Generic_fromJSON */ \"a\"])(CodingContract, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Reviver */ \"c\"].constructors.CodingContract = CodingContract;\n\n//# sourceURL=webpack:///./src/CodingContracts.ts?");
-
-/***/ }),
-/* 81 */
-/*!********************************************!*\
- !*** ./src/StockMarket/data/OrderTypes.ts ***!
- \********************************************/
-/*! exports provided: OrderTypes */
-/*! exports used: OrderTypes */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return OrderTypes; });\nlet OrderTypes;\n\n(function (OrderTypes) {\n OrderTypes[\"LimitBuy\"] = \"Limit Buy Order\";\n OrderTypes[\"LimitSell\"] = \"Limit Sell Order\";\n OrderTypes[\"StopBuy\"] = \"Stop Buy Order\";\n OrderTypes[\"StopSell\"] = \"Stop Sell Order\";\n})(OrderTypes || (OrderTypes = {}));\n\n//# sourceURL=webpack:///./src/StockMarket/data/OrderTypes.ts?");
-
-/***/ }),
-/* 82 */
-/*!************************!*\
- !*** ./src/Hacking.ts ***!
- \************************/
-/*! exports provided: calculateHackingChance, calculateHackingExpGain, calculatePercentMoneyHacked, calculateHackingTime, calculateGrowTime, calculateWeakenTime */
-/*! exports used: calculateGrowTime, calculateHackingChance, calculateHackingExpGain, calculateHackingTime, calculatePercentMoneyHacked, calculateWeakenTime */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return calculateHackingChance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return calculateHackingExpGain; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return calculatePercentMoneyHacked; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return calculateHackingTime; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return calculateGrowTime; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return calculateWeakenTime; });\n/* harmony import */ var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BitNode/BitNodeMultipliers */ 8);\n/* harmony import */ var _PersonObjects_formulas_intelligence__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PersonObjects/formulas/intelligence */ 315);\n\n\n\n/**\n * Returns the chance the player has to successfully hack a server\n */\nfunction calculateHackingChance(server, player) {\n const hackFactor = 1.75;\n const difficultyMult = (100 - server.hackDifficulty) / 100;\n const skillMult = hackFactor * player.hacking_skill;\n const skillChance = (skillMult - server.requiredHackingSkill) / skillMult;\n const chance = skillChance * difficultyMult * player.hacking_chance_mult * Object(_PersonObjects_formulas_intelligence__WEBPACK_IMPORTED_MODULE_1__[/* calculateIntelligenceBonus */ \"a\"])(player.intelligence, 1);\n\n if (chance > 1) {\n return 1;\n }\n\n if (chance < 0) {\n return 0;\n }\n\n return chance;\n}\n/**\n * Returns the amount of hacking experience the player will gain upon\n * successfully hacking a server\n */\n\nfunction calculateHackingExpGain(server, player) {\n const baseExpGain = 3;\n const diffFactor = 0.3;\n\n if (server.baseDifficulty == null) {\n server.baseDifficulty = server.hackDifficulty;\n }\n\n let expGain = baseExpGain;\n expGain += server.baseDifficulty * player.hacking_exp_mult * diffFactor;\n return expGain * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_0__[/* BitNodeMultipliers */ \"a\"].HackExpGain;\n}\n/**\n * Returns the percentage of money that will be stolen from a server if\n * it is successfully hacked (returns the decimal form, not the actual percent value)\n */\n\nfunction calculatePercentMoneyHacked(server, player) {\n // Adjust if needed for balancing. This is the divisor for the final calculation\n const balanceFactor = 240;\n const difficultyMult = (100 - server.hackDifficulty) / 100;\n const skillMult = (player.hacking_skill - (server.requiredHackingSkill - 1)) / player.hacking_skill;\n const percentMoneyHacked = difficultyMult * skillMult * player.hacking_money_mult / balanceFactor;\n\n if (percentMoneyHacked < 0) {\n return 0;\n }\n\n if (percentMoneyHacked > 1) {\n return 1;\n }\n\n return percentMoneyHacked * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_0__[/* BitNodeMultipliers */ \"a\"].ScriptHackMoney;\n}\n/**\n * Returns time it takes to complete a hack on a server, in seconds\n */\n\nfunction calculateHackingTime(server, player) {\n const difficultyMult = server.requiredHackingSkill * server.hackDifficulty;\n const baseDiff = 500;\n const baseSkill = 50;\n const diffFactor = 2.5;\n let skillFactor = diffFactor * difficultyMult + baseDiff; // tslint:disable-next-line\n\n skillFactor /= player.hacking_skill + baseSkill;\n const hackTimeMultiplier = 5;\n const hackingTime = hackTimeMultiplier * skillFactor / (player.hacking_speed_mult * Object(_PersonObjects_formulas_intelligence__WEBPACK_IMPORTED_MODULE_1__[/* calculateIntelligenceBonus */ \"a\"])(player.intelligence, 1));\n return hackingTime;\n}\n/**\n * Returns time it takes to complete a grow operation on a server, in seconds\n */\n\nfunction calculateGrowTime(server, player) {\n const growTimeMultiplier = 3.2; // Relative to hacking time. 16/5 = 3.2\n\n return growTimeMultiplier * calculateHackingTime(server, player);\n}\n/**\n * Returns time it takes to complete a weaken operation on a server, in seconds\n */\n\nfunction calculateWeakenTime(server, player) {\n const weakenTimeMultiplier = 4; // Relative to hacking time\n\n return weakenTimeMultiplier * calculateHackingTime(server, player);\n}\n\n//# sourceURL=webpack:///./src/Hacking.ts?");
-
-/***/ }),
-/* 83 */
-/*!***********************************!*\
- !*** ./utils/helpers/isString.ts ***!
- \***********************************/
-/*! exports provided: isString */
-/*! exports used: isString */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isString; });\n/**\n * Checks whether the value passed in can be considered a string.\n * @param value The value to check if it is a string.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction isString(value) {\n return typeof value === \"string\" || value instanceof String;\n}\n\n//# sourceURL=webpack:///./utils/helpers/isString.ts?");
-
-/***/ }),
-/* 84 */
-/*!***************************************!*\
- !*** ./src/Script/ScriptHelpersTS.ts ***!
- \***************************************/
-/*! exports provided: isScriptFilename */
-/*! exports used: isScriptFilename */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isScriptFilename; });\n// Script helper functions\nfunction isScriptFilename(f) {\n return f.endsWith(\".js\") || f.endsWith(\".script\") || f.endsWith(\".ns\");\n}\n\n//# sourceURL=webpack:///./src/Script/ScriptHelpersTS.ts?");
-
-/***/ }),
-/* 85 */
-/*!**************************************!*\
- !*** ./src/Hacknet/HacknetServer.ts ***!
- \**************************************/
-/*! exports provided: HacknetServer */
-/*! exports used: HacknetServer */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return HacknetServer; });\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Constants */ 5);\n/* harmony import */ var _Server_BaseServer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Server/BaseServer */ 438);\n/* harmony import */ var _data_Constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data/Constants */ 32);\n/* harmony import */ var _formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./formulas/HacknetServers */ 182);\n/* harmony import */ var _utils_IPAddress__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/IPAddress */ 241);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\nfunction _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\n/**\n * Hacknet Servers - Reworked Hacknet Node mechanic for BitNode-9\n */\n\n\n\n\n\n\nclass HacknetServer extends _Server_BaseServer__WEBPACK_IMPORTED_MODULE_1__[/* BaseServer */ \"a\"] {\n // Cache level. Affects hash Capacity\n // Number of cores. Improves hash production\n // Number of hashes that can be stored by this Hacknet Server\n // Hashes produced per second\n // Similar to Node level. Improves hash production\n // How long this HacknetServer has existed, in seconds\n // Total number of hashes earned by this server\n constructor(params = {\n hostname: \"\",\n ip: Object(_utils_IPAddress__WEBPACK_IMPORTED_MODULE_4__[/* createRandomIp */ \"a\"])()\n }) {\n super(params);\n\n _defineProperty(this, \"cache\", 1);\n\n _defineProperty(this, \"cores\", 1);\n\n _defineProperty(this, \"hashCapacity\", 0);\n\n _defineProperty(this, \"hashRate\", 0);\n\n _defineProperty(this, \"level\", 1);\n\n _defineProperty(this, \"onlineTimeSeconds\", 0);\n\n _defineProperty(this, \"totalHashesGenerated\", 0);\n\n this.maxRam = 1;\n this.updateHashCapacity();\n }\n\n calculateCacheUpgradeCost(levels) {\n return Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__[/* calculateCacheUpgradeCost */ \"a\"])(this.cache, levels);\n }\n\n calculateCoreUpgradeCost(levels, costMult) {\n return Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__[/* calculateCoreUpgradeCost */ \"b\"])(this.cores, levels, costMult);\n }\n\n calculateLevelUpgradeCost(levels, costMult) {\n return Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__[/* calculateLevelUpgradeCost */ \"d\"])(this.level, levels, costMult);\n }\n\n calculateRamUpgradeCost(levels, costMult) {\n return Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__[/* calculateRamUpgradeCost */ \"e\"])(this.maxRam, levels, costMult);\n } // Process this Hacknet Server in the game loop. Returns the number of hashes generated\n\n\n process(numCycles = 1) {\n const seconds = numCycles * _Constants__WEBPACK_IMPORTED_MODULE_0__[/* CONSTANTS */ \"a\"].MilliPerCycle / 1000;\n return this.hashRate * seconds;\n }\n\n upgradeCache(levels) {\n this.cache = Math.min(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* HacknetServerConstants */ \"b\"].MaxCache, Math.round(this.cache + levels));\n this.updateHashCapacity();\n }\n\n upgradeCore(levels, prodMult) {\n this.cores = Math.min(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* HacknetServerConstants */ \"b\"].MaxCores, Math.round(this.cores + levels));\n this.updateHashRate(prodMult);\n }\n\n upgradeLevel(levels, prodMult) {\n this.level = Math.min(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* HacknetServerConstants */ \"b\"].MaxLevel, Math.round(this.level + levels));\n this.updateHashRate(prodMult);\n }\n\n upgradeRam(levels, prodMult) {\n for (let i = 0; i < levels; ++i) {\n this.maxRam *= 2;\n }\n\n this.maxRam = Math.min(_data_Constants__WEBPACK_IMPORTED_MODULE_2__[/* HacknetServerConstants */ \"b\"].MaxRam, Math.round(this.maxRam));\n this.updateHashRate(prodMult);\n return true;\n } // Whenever a script is run, we must update this server's hash rate\n\n\n runScript(script, prodMult) {\n super.runScript(script);\n\n if (prodMult != null && typeof prodMult === \"number\") {\n this.updateHashRate(prodMult);\n }\n }\n\n updateHashCapacity() {\n this.hashCapacity = 32 * Math.pow(2, this.cache);\n }\n\n updateHashRate(prodMult) {\n this.hashRate = Object(_formulas_HacknetServers__WEBPACK_IMPORTED_MODULE_3__[/* calculateHashGainRate */ \"c\"])(this.level, this.ramUsed, this.maxRam, this.cores, prodMult);\n\n if (isNaN(this.hashRate)) {\n this.hashRate = 0;\n console.error(`Error calculating Hacknet Server hash production. This is a bug. Please report to game dev`, false);\n }\n } // Serialize the current object to a JSON save state\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Generic_toJSON */ \"b\"])(\"HacknetServer\", this);\n } // Initializes a HacknetServer Object from a JSON save state\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Generic_fromJSON */ \"a\"])(HacknetServer, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_5__[/* Reviver */ \"c\"].constructors.HacknetServer = HacknetServer;\n\n//# sourceURL=webpack:///./src/Hacknet/HacknetServer.ts?");
-
-/***/ }),
-/* 86 */
-/*!********************************!*\
- !*** ./src/ui/React/Table.tsx ***!
- \********************************/
-/*! exports provided: TableCell, Table */
-/*! exports used: Table, TableCell */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return TableCell; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Table; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ 60);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ 378);\n/* harmony import */ var _mui_styles_makeStyles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/styles/makeStyles */ 162);\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\n\n\n\nconst useStyles = Object(_mui_styles_makeStyles__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"])({\n root: {\n borderBottom: \"none\"\n },\n small: {\n width: \"1px\"\n }\n});\nconst TableCell = props => {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"], _extends({}, props, {\n classes: {\n root: useStyles().root,\n ...props.classes\n }\n }));\n};\nconst Table = props => {\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"], _extends({}, props, {\n classes: {\n root: useStyles().small,\n ...props.classes\n }\n }));\n};\n\n//# sourceURL=webpack:///./src/ui/React/Table.tsx?");
-
-/***/ }),
-/* 87 */
-/*!**************************************************!*\
- !*** ./src/Corporation/data/BaseResearchTree.ts ***!
- \**************************************************/
-/*! exports provided: getBaseResearchTreeCopy, getProductIndustryResearchTreeCopy */
-/*! exports used: getBaseResearchTreeCopy, getProductIndustryResearchTreeCopy */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getBaseResearchTreeCopy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return getProductIndustryResearchTreeCopy; });\n/* harmony import */ var _ResearchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ResearchMap */ 288);\n/* harmony import */ var _ResearchTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ResearchTree */ 476);\n// Defines the ResearchTree that is common to all Corporation Industries\n// i.e. all Industries have these types of Research available to unlock\n\n\n\nfunction makeNode(name) {\n const research = _ResearchMap__WEBPACK_IMPORTED_MODULE_0__[/* ResearchMap */ \"a\"][name];\n\n if (research == null) {\n throw new Error(`Invalid research name: ${name}`);\n }\n\n return new _ResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* Node */ \"a\"]({\n text: research.name,\n cost: research.cost\n });\n} // Creates the Nodes for the BaseResearchTree.\n// Return the Root Node\n\n\nfunction createBaseResearchTreeNodes() {\n const rootNode = makeNode(\"Hi-Tech R&D Laboratory\");\n const autoBrew = makeNode(\"AutoBrew\");\n const autoParty = makeNode(\"AutoPartyManager\");\n const autoDrugs = makeNode(\"Automatic Drug Administration\");\n const bulkPurchasing = makeNode(\"Bulk Purchasing\");\n const cph4 = makeNode(\"CPH4 Injections\");\n const drones = makeNode(\"Drones\");\n const dronesAssembly = makeNode(\"Drones - Assembly\");\n const dronesTransport = makeNode(\"Drones - Transport\");\n const goJuice = makeNode(\"Go-Juice\");\n const hrRecruitment = makeNode(\"HRBuddy-Recruitment\");\n const hrTraining = makeNode(\"HRBuddy-Training\");\n const joywire = makeNode(\"JoyWire\");\n const marketta1 = makeNode(\"Market-TA.I\");\n const marketta2 = makeNode(\"Market-TA.II\");\n const overclock = makeNode(\"Overclock\");\n const scAssemblers = makeNode(\"Self-Correcting Assemblers\");\n const stimu = makeNode(\"Sti.mu\");\n autoDrugs.addChild(goJuice);\n autoDrugs.addChild(cph4);\n drones.addChild(dronesAssembly);\n drones.addChild(dronesTransport);\n hrRecruitment.addChild(hrTraining);\n marketta1.addChild(marketta2);\n overclock.addChild(stimu);\n rootNode.addChild(autoBrew);\n rootNode.addChild(autoParty);\n rootNode.addChild(autoDrugs);\n rootNode.addChild(bulkPurchasing);\n rootNode.addChild(drones);\n rootNode.addChild(hrRecruitment);\n rootNode.addChild(joywire);\n rootNode.addChild(marketta1);\n rootNode.addChild(overclock);\n rootNode.addChild(scAssemblers);\n return rootNode;\n}\n\nfunction getBaseResearchTreeCopy() {\n const baseResearchTree = new _ResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* ResearchTree */ \"b\"]();\n baseResearchTree.setRoot(createBaseResearchTreeNodes());\n return baseResearchTree;\n} // Base Research Tree for Industry's that make products\n\nfunction getProductIndustryResearchTreeCopy() {\n const researchTree = new _ResearchTree__WEBPACK_IMPORTED_MODULE_1__[/* ResearchTree */ \"b\"]();\n const root = createBaseResearchTreeNodes();\n const upgradeFulcrum = makeNode(\"uPgrade: Fulcrum\");\n const upgradeCapacity1 = makeNode(\"uPgrade: Capacity.I\");\n const upgradeCapacity2 = makeNode(\"uPgrade: Capacity.II\");\n const upgradeDashboard = makeNode(\"uPgrade: Dashboard\");\n upgradeCapacity1.addChild(upgradeCapacity2);\n upgradeFulcrum.addChild(upgradeCapacity1);\n upgradeFulcrum.addChild(upgradeDashboard);\n root.addChild(upgradeFulcrum);\n researchTree.setRoot(root);\n return researchTree;\n}\n\n//# sourceURL=webpack:///./src/Corporation/data/BaseResearchTree.ts?");
-
-/***/ }),
-/* 88 */
-/*!******************************************!*\
- !*** ./src/Terminal/DirectoryHelpers.ts ***!
- \******************************************/
-/*! exports provided: removeLeadingSlash, removeTrailingSlash, isValidFilename, isValidDirectoryName, isValidDirectoryPath, isValidFilePath, getFirstParentDirectory, getAllParentDirectories, isInRootDirectory, evaluateDirectoryPath, evaluateFilePath */
-/*! exports used: evaluateDirectoryPath, evaluateFilePath, getAllParentDirectories, getFirstParentDirectory, isInRootDirectory, isValidDirectoryPath, isValidFilePath, removeLeadingSlash, removeTrailingSlash */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return removeLeadingSlash; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return removeTrailingSlash; });\n/* unused harmony export isValidFilename */\n/* unused harmony export isValidDirectoryName */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return isValidDirectoryPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return isValidFilePath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return getFirstParentDirectory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getAllParentDirectories; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return isInRootDirectory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return evaluateDirectoryPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return evaluateFilePath; });\n/**\n * Helper functions that implement \"directory\" functionality in the Terminal.\n * These aren't \"real\" directories, it's more of a pseudo-directory implementation\n * that uses mainly string manipulation.\n *\n * This file contains functions that deal only with that string manipulation.\n * Functions that need to access/process Server-related things can be\n * found in ./DirectoryServerHelpers.ts\n */\n\n/**\n * Removes leading forward slash (\"/\") from a string.\n */\nfunction removeLeadingSlash(s) {\n if (s.startsWith(\"/\")) {\n return s.slice(1);\n }\n\n return s;\n}\n/**\n * Removes trailing forward slash (\"/\") from a string.\n * Note that this will also remove the slash if it is the leading slash (i.e. if s = \"/\")\n */\n\nfunction removeTrailingSlash(s) {\n if (s.endsWith(\"/\")) {\n return s.slice(0, -1);\n }\n\n return s;\n}\n/**\n * Checks whether a string is a valid filename. Only used for the filename itself,\n * not the entire filepath\n */\n\nfunction isValidFilename(filename) {\n // Allows alphanumerics, hyphens, underscores, and percentage signs\n // Must have a file extension\n const regex = /^[.a-zA-Z0-9_-]+[.][a-zA-Z0-9]+(?:-\\d+(?:\\.\\d*)?%-INC)?$/; // match() returns null if no match is found\n\n return filename.match(regex) != null;\n}\n/**\n * Checks whether a string is a valid directory name. Only used for the directory itself,\n * not an entire path\n */\n\nfunction isValidDirectoryName(name) {\n // Allows alphanumerics, hyphens, underscores, and percentage signs.\n // Name can begin with a single period, but otherwise cannot have any\n const regex = /^.?[a-zA-Z0-9_-]+$/; // match() returns null if no match is found\n\n return name.match(regex) != null;\n}\n/**\n * Checks whether a string is a valid directory path.\n * This only checks if it has the proper formatting. It does NOT check\n * if the directories actually exist on Terminal\n */\n\nfunction isValidDirectoryPath(path) {\n let t_path = path;\n\n if (t_path.length === 0) {\n return false;\n }\n\n if (t_path.length === 1) {\n return t_path === \"/\";\n } // A full path must have a leading slash, but we'll ignore it for the checks\n\n\n if (t_path.startsWith(\"/\")) {\n t_path = t_path.slice(1);\n } else {\n return false;\n } // Trailing slash does not matter\n\n\n t_path = removeTrailingSlash(t_path); // Check that every section of the path is a valid directory name\n\n const dirs = t_path.split(\"/\");\n\n for (const dir of dirs) {\n // Special case, \".\" and \"..\" are valid for path\n if (dir === \".\" || dir === \"..\") {\n continue;\n }\n\n if (!isValidDirectoryName(dir)) {\n return false;\n }\n }\n\n return true;\n}\n/**\n * Checks whether a string is a valid file path. This only checks if it has the\n * proper formatting. It dose NOT check if the file actually exists on Terminal\n */\n\nfunction isValidFilePath(path) {\n if (path == null || typeof path !== \"string\") {\n return false;\n }\n\n const t_path = path; // Impossible for filename to have less than length of 3\n\n if (t_path.length < 3) {\n return false;\n } // Full filepath can't end with trailing slash because it must be a file\n\n\n if (t_path.endsWith(\"/\")) {\n return false;\n } // Everything after the last forward slash is the filename. Everything before\n // it is the file path\n\n\n const fnSeparator = t_path.lastIndexOf(\"/\");\n\n if (fnSeparator === -1) {\n return isValidFilename(t_path);\n }\n\n const fn = t_path.slice(fnSeparator + 1);\n const dirPath = t_path.slice(0, fnSeparator + 1);\n return isValidDirectoryPath(dirPath) && isValidFilename(fn);\n}\n/**\n * Returns a formatted string for the first parent directory in a filepath. For example:\n * /home/var/test/ -> home/\n * If there is no first parent directory, then it returns \"/\" for root\n */\n\nfunction getFirstParentDirectory(path) {\n let t_path = path;\n t_path = removeLeadingSlash(t_path);\n t_path = removeTrailingSlash(t_path);\n\n if (t_path.lastIndexOf(\"/\") === -1) {\n return \"/\";\n }\n\n const dirs = t_path.split(\"/\");\n\n if (dirs.length === 0) {\n return \"/\";\n }\n\n return dirs[0] + \"/\";\n}\n/**\n * Given a filepath, returns a formatted string for all of the parent directories\n * in that filepath. For example:\n * /home/var/tes -> home/var/\n * /home/var/test/ -> home/var/test/\n * If there are no parent directories, it returns the empty string\n */\n\nfunction getAllParentDirectories(path) {\n const t_path = path;\n const lastSlash = t_path.lastIndexOf(\"/\");\n\n if (lastSlash === -1) {\n return \"\";\n }\n\n return t_path.slice(0, lastSlash + 1);\n}\n/**\n * Checks if a file path refers to a file in the root directory.\n */\n\nfunction isInRootDirectory(path) {\n if (!isValidFilePath(path)) {\n return false;\n }\n\n if (path == null || path.length === 0) {\n return false;\n }\n\n return path.lastIndexOf(\"/\") <= 0;\n}\n/**\n * Evaluates a directory path, including the processing of linux dots.\n * Returns the full, proper path, or null if an invalid path is passed in\n */\n\nfunction evaluateDirectoryPath(path, currPath) {\n let t_path = path; // If the path begins with a slash, then its an absolute path. Otherwise its relative\n // For relative paths, we need to prepend the current directory\n\n if (!t_path.startsWith(\"/\") && currPath != null) {\n t_path = currPath + (currPath.endsWith(\"/\") ? \"\" : \"/\") + t_path;\n }\n\n if (!isValidDirectoryPath(t_path)) {\n return null;\n } // Trim leading/trailing slashes\n\n\n t_path = removeLeadingSlash(t_path);\n t_path = removeTrailingSlash(t_path);\n const dirs = t_path.split(\"/\");\n const reconstructedPath = [];\n\n for (const dir of dirs) {\n if (dir === \".\") {\n // Current directory, do nothing\n continue;\n } else if (dir === \"..\") {\n // Parent directory\n const res = reconstructedPath.pop();\n\n if (res == null) {\n return null; // Array was empty, invalid path\n }\n } else {\n reconstructedPath.push(dir);\n }\n }\n\n return \"/\" + reconstructedPath.join(\"/\");\n}\n/**\n * Evaluates a file path, including the processing of linux dots.\n * Returns the full, proper path, or null if an invalid path is passed in\n */\n\nfunction evaluateFilePath(path, currPath) {\n let t_path = path; // If the path begins with a slash, then its an absolute path. Otherwise its relative\n // For relative paths, we need to prepend the current directory\n\n if (!t_path.startsWith(\"/\") && currPath != null) {\n t_path = currPath + (currPath.endsWith(\"/\") ? \"\" : \"/\") + t_path;\n }\n\n if (!isValidFilePath(t_path)) {\n return null;\n } // Trim leading/trailing slashes\n\n\n t_path = removeLeadingSlash(t_path);\n const dirs = t_path.split(\"/\");\n const reconstructedPath = [];\n\n for (const dir of dirs) {\n if (dir === \".\") {\n // Current directory, do nothing\n continue;\n } else if (dir === \"..\") {\n // Parent directory\n const res = reconstructedPath.pop();\n\n if (res == null) {\n return null; // Array was empty, invalid path\n }\n } else {\n reconstructedPath.push(dir);\n }\n }\n\n return \"/\" + reconstructedPath.join(\"/\");\n}\n\n//# sourceURL=webpack:///./src/Terminal/DirectoryHelpers.ts?");
-
-/***/ }),
-/* 89 */
-/*!**********************!*\
- !*** ./src/Alias.ts ***!
- \**********************/
-/*! exports provided: Aliases, GlobalAliases, loadAliases, loadGlobalAliases, printAliases, parseAliasDeclaration, removeAlias, substituteAliases */
-/*! exports used: Aliases, GlobalAliases, loadAliases, loadGlobalAliases, parseAliasDeclaration, printAliases, removeAlias, substituteAliases */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Aliases; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return GlobalAliases; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return loadAliases; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return loadGlobalAliases; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return printAliases; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return parseAliasDeclaration; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return removeAlias; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return substituteAliases; });\n/* harmony import */ var _Terminal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Terminal */ 90);\n\nlet Aliases = {};\nlet GlobalAliases = {};\nfunction loadAliases(saveString) {\n if (saveString === \"\") {\n Aliases = {};\n } else {\n Aliases = JSON.parse(saveString);\n }\n}\nfunction loadGlobalAliases(saveString) {\n if (saveString === \"\") {\n GlobalAliases = {};\n } else {\n GlobalAliases = JSON.parse(saveString);\n }\n} // Prints all aliases to terminal\n\nfunction printAliases() {\n for (const name in Aliases) {\n if (Aliases.hasOwnProperty(name)) {\n _Terminal__WEBPACK_IMPORTED_MODULE_0__[/* Terminal */ \"a\"].print(\"alias \" + name + \"=\" + Aliases[name]);\n }\n }\n\n for (const name in GlobalAliases) {\n if (GlobalAliases.hasOwnProperty(name)) {\n _Terminal__WEBPACK_IMPORTED_MODULE_0__[/* Terminal */ \"a\"].print(\"global alias \" + name + \"=\" + GlobalAliases[name]);\n }\n }\n} // Returns true if successful, false otherwise\n\nfunction parseAliasDeclaration(dec, global = false) {\n const re = /^([_|\\w|!|%|,|@]+)=\"(.+)\"$/;\n const matches = dec.match(re);\n\n if (matches == null || matches.length != 3) {\n return false;\n }\n\n if (global) {\n addGlobalAlias(matches[1], matches[2]);\n } else {\n addAlias(matches[1], matches[2]);\n }\n\n return true;\n}\n\nfunction addAlias(name, value) {\n if (name in GlobalAliases) {\n delete GlobalAliases[name];\n }\n\n Aliases[name] = value.trim();\n}\n\nfunction addGlobalAlias(name, value) {\n if (name in Aliases) {\n delete Aliases[name];\n }\n\n GlobalAliases[name] = value.trim();\n}\n\nfunction getAlias(name) {\n if (Aliases.hasOwnProperty(name)) {\n return Aliases[name];\n }\n\n return null;\n}\n\nfunction getGlobalAlias(name) {\n if (GlobalAliases.hasOwnProperty(name)) {\n return GlobalAliases[name];\n }\n\n return null;\n}\n\nfunction removeAlias(name) {\n if (Aliases.hasOwnProperty(name)) {\n delete Aliases[name];\n return true;\n }\n\n if (GlobalAliases.hasOwnProperty(name)) {\n delete GlobalAliases[name];\n return true;\n }\n\n return false;\n}\n/**\n * Returns the original string with any aliases substituted in.\n * Aliases are only applied to \"whole words\", one level deep\n */\n\nfunction substituteAliases(origCommand) {\n const commandArray = origCommand.split(\" \");\n\n if (commandArray.length > 0) {\n // For the alias and unalias commands, dont substite\n if (commandArray[0] === \"unalias\" || commandArray[0] === \"alias\") {\n return commandArray.join(\" \");\n }\n\n let somethingSubstituted = true;\n let depth = 0;\n\n while (somethingSubstituted && depth < 10) {\n var _getAlias;\n\n depth++;\n somethingSubstituted = false;\n const alias = (_getAlias = getAlias(commandArray[0])) === null || _getAlias === void 0 ? void 0 : _getAlias.split(\" \");\n\n if (alias != null) {\n somethingSubstituted = true;\n commandArray.splice(0, 1, ...alias); //commandArray[0] = alias;\n }\n\n for (let i = 0; i < commandArray.length; ++i) {\n var _getGlobalAlias;\n\n const alias = (_getGlobalAlias = getGlobalAlias(commandArray[i])) === null || _getGlobalAlias === void 0 ? void 0 : _getGlobalAlias.split(\" \");\n\n if (alias != null) {\n somethingSubstituted = true;\n commandArray.splice(i, 1, ...alias);\n i += alias.length - 1; //commandArray[i] = alias;\n }\n }\n }\n }\n\n return commandArray.join(\" \");\n}\n\n//# sourceURL=webpack:///./src/Alias.ts?");
-
-/***/ }),
-/* 90 */
-/*!**************************!*\
- !*** ./src/Terminal.jsx ***!
- \**************************/
-/*! exports provided: Terminal */
-/*! exports used: Terminal */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Terminal; });\n/* harmony import */ var _Terminal_Terminal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Terminal/Terminal */ 662);\n\nconst Terminal = new _Terminal_Terminal__WEBPACK_IMPORTED_MODULE_0__[/* Terminal */ \"a\"]();\n\n//# sourceURL=webpack:///./src/Terminal.jsx?");
-
-/***/ }),
-/* 91 */,
-/* 92 */
-/*!****************************************!*\
- !*** ./src/Faction/FactionHelpers.jsx ***!
- \****************************************/
-/*! exports provided: inviteToFaction, joinFaction, startHackingMission, hasAugmentationPrereqs, purchaseAugmentation, getNextNeurofluxLevel, processPassiveFactionRepGain */
-/*! exports used: getNextNeurofluxLevel, hasAugmentationPrereqs, inviteToFaction, joinFaction, processPassiveFactionRepGain, purchaseAugmentation, startHackingMission */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return inviteToFaction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return joinFaction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return startHackingMission; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return hasAugmentationPrereqs; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return purchaseAugmentation; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getNextNeurofluxLevel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return processPassiveFactionRepGain; });\n/* harmony import */ var _Augmentation_Augmentations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Augmentation/Augmentations */ 21);\n/* harmony import */ var _Augmentation_PlayerOwnedAugmentation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Augmentation/PlayerOwnedAugmentation */ 277);\n/* harmony import */ var _Augmentation_data_AugmentationNames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Augmentation/data/AugmentationNames */ 6);\n/* harmony import */ var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BitNode/BitNodeMultipliers */ 8);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Constants */ 5);\n/* harmony import */ var _Faction__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Faction */ 137);\n/* harmony import */ var _Factions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Factions */ 23);\n/* harmony import */ var _Missions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Missions */ 121);\n/* harmony import */ var _Player__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Player */ 2);\n/* harmony import */ var _Settings_Settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Settings/Settings */ 34);\n/* harmony import */ var _PersonObjects_formulas_reputation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../PersonObjects/formulas/reputation */ 189);\n/* harmony import */ var _SourceFile_SourceFileFlags__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../SourceFile/SourceFileFlags */ 50);\n/* harmony import */ var _utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../utils/DialogBox */ 10);\n/* harmony import */ var _ui_React_createPopup__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/React/createPopup */ 20);\n/* harmony import */ var _ui_InvitationPopup__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./ui/InvitationPopup */ 658);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction inviteToFaction(faction) {\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factionInvitations.push(faction.name);\n faction.alreadyInvited = true;\n\n if (!_Settings_Settings__WEBPACK_IMPORTED_MODULE_9__[/* Settings */ \"a\"].SuppressFactionInvites) {\n const popupId = \"faction-invitation\";\n Object(_ui_React_createPopup__WEBPACK_IMPORTED_MODULE_13__[/* createPopup */ \"a\"])(popupId, _ui_InvitationPopup__WEBPACK_IMPORTED_MODULE_14__[/* InvitationPopup */ \"a\"], {\n player: _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"],\n faction: faction,\n popupId: popupId\n });\n }\n}\nfunction joinFaction(faction) {\n if (faction.isMember) return;\n faction.isMember = true;\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factions.push(faction.name);\n const factionInfo = faction.getInfo(); //Determine what factions you are banned from now that you have joined this faction\n\n for (const i in factionInfo.enemies) {\n const enemy = factionInfo.enemies[i];\n\n if (_Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"][enemy] instanceof _Faction__WEBPACK_IMPORTED_MODULE_5__[/* Faction */ \"a\"]) {\n _Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"][enemy].isBanned = true;\n }\n }\n\n for (var i = 0; i < _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factionInvitations.length; ++i) {\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factionInvitations[i] == faction.name || _Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"][_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factionInvitations[i]].isBanned) {\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].factionInvitations.splice(i, 1);\n i--;\n }\n }\n}\nfunction startHackingMission(faction) {\n const mission = new _Missions__WEBPACK_IMPORTED_MODULE_7__[/* HackingMission */ \"a\"](faction.playerReputation, faction);\n Object(_Missions__WEBPACK_IMPORTED_MODULE_7__[/* setInMission */ \"d\"])(true, mission); //Sets inMission flag to true\n\n mission.init();\n} //Returns a boolean indicating whether the player has the prerequisites for the\n//specified Augmentation\n\nfunction hasAugmentationPrereqs(aug) {\n let hasPrereqs = true;\n\n if (aug.prereqs && aug.prereqs.length > 0) {\n for (let i = 0; i < aug.prereqs.length; ++i) {\n const prereqAug = _Augmentation_Augmentations__WEBPACK_IMPORTED_MODULE_0__[/* Augmentations */ \"a\"][aug.prereqs[i]];\n\n if (prereqAug == null) {\n console.error(`Invalid prereq Augmentation ${aug.prereqs[i]}`);\n continue;\n }\n\n if (prereqAug.owned === false) {\n hasPrereqs = false; // Check if the aug is purchased\n\n for (let j = 0; j < _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations.length; ++j) {\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations[j].name === prereqAug.name) {\n hasPrereqs = true;\n break;\n }\n }\n }\n }\n }\n\n return hasPrereqs;\n}\nfunction purchaseAugmentation(aug, fac, sing = false) {\n const factionInfo = fac.getInfo();\n var hasPrereqs = hasAugmentationPrereqs(aug);\n\n if (!hasPrereqs) {\n var txt = \"You must first purchase or install \" + aug.prereqs.join(\",\") + \" before you can \" + \"purchase this one.\";\n\n if (sing) {\n return txt;\n } else {\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__[/* dialogBoxCreate */ \"a\"])(txt);\n }\n } else if (aug.baseCost !== 0 && _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].money.lt(aug.baseCost * factionInfo.augmentationPriceMult)) {\n let txt = \"You don't have enough money to purchase \" + aug.name;\n\n if (sing) {\n return txt;\n }\n\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__[/* dialogBoxCreate */ \"a\"])(txt);\n } else if (fac.playerReputation < aug.baseRepRequirement) {\n let txt = \"You don't have enough faction reputation to purchase \" + aug.name;\n\n if (sing) {\n return txt;\n }\n\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__[/* dialogBoxCreate */ \"a\"])(txt);\n } else if (aug.baseCost === 0 || _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].money.gte(aug.baseCost * factionInfo.augmentationPriceMult)) {\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].firstAugPurchased === false) {\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].firstAugPurchased = true;\n document.getElementById(\"augmentations-tab\").style.display = \"list-item\";\n document.getElementById(\"character-menu-header\").click();\n document.getElementById(\"character-menu-header\").click();\n }\n\n var queuedAugmentation = new _Augmentation_PlayerOwnedAugmentation__WEBPACK_IMPORTED_MODULE_1__[/* PlayerOwnedAugmentation */ \"a\"](aug.name);\n\n if (aug.name == _Augmentation_data_AugmentationNames__WEBPACK_IMPORTED_MODULE_2__[/* AugmentationNames */ \"a\"].NeuroFluxGovernor) {\n queuedAugmentation.level = getNextNeurofluxLevel();\n }\n\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations.push(queuedAugmentation);\n _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].loseMoney(aug.baseCost * factionInfo.augmentationPriceMult); // If you just purchased Neuroflux Governor, recalculate the cost\n\n if (aug.name == _Augmentation_data_AugmentationNames__WEBPACK_IMPORTED_MODULE_2__[/* AugmentationNames */ \"a\"].NeuroFluxGovernor) {\n var nextLevel = getNextNeurofluxLevel();\n --nextLevel;\n var mult = Math.pow(_Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].NeuroFluxGovernorLevelMult, nextLevel);\n aug.baseRepRequirement = 500 * mult * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__[/* BitNodeMultipliers */ \"a\"].AugmentationRepCost;\n aug.baseCost = 750e3 * mult * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__[/* BitNodeMultipliers */ \"a\"].AugmentationMoneyCost;\n\n for (var i = 0; i < _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations.length - 1; ++i) {\n aug.baseCost *= _Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][_SourceFile_SourceFileFlags__WEBPACK_IMPORTED_MODULE_11__[/* SourceFileFlags */ \"a\"][11]];\n }\n }\n\n for (var name in _Augmentation_Augmentations__WEBPACK_IMPORTED_MODULE_0__[/* Augmentations */ \"a\"]) {\n if (_Augmentation_Augmentations__WEBPACK_IMPORTED_MODULE_0__[/* Augmentations */ \"a\"].hasOwnProperty(name)) {\n _Augmentation_Augmentations__WEBPACK_IMPORTED_MODULE_0__[/* Augmentations */ \"a\"][name].baseCost *= _Constants__WEBPACK_IMPORTED_MODULE_4__[/* CONSTANTS */ \"a\"].MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][_SourceFile_SourceFileFlags__WEBPACK_IMPORTED_MODULE_11__[/* SourceFileFlags */ \"a\"][11]];\n }\n }\n\n if (sing) {\n return \"You purchased \" + aug.name;\n } else {\n if (!_Settings_Settings__WEBPACK_IMPORTED_MODULE_9__[/* Settings */ \"a\"].SuppressBuyAugmentationConfirmation) {\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__[/* dialogBoxCreate */ \"a\"])(\"You purchased \" + aug.name + \". It's enhancements will not take \" + \"effect until they are installed. To install your augmentations, go to the \" + \"'Augmentations' tab on the left-hand navigation menu. Purchasing additional \" + \"augmentations will now be more expensive.\");\n }\n }\n } else {\n Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_12__[/* dialogBoxCreate */ \"a\"])(\"Hmm, something went wrong when trying to purchase an Augmentation. \" + \"Please report this to the game developer with an explanation of how to \" + \"reproduce this.\");\n }\n}\nfunction getNextNeurofluxLevel() {\n // Get current Neuroflux level based on Player's augmentations\n let currLevel = 0;\n\n for (var i = 0; i < _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].augmentations.length; ++i) {\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].augmentations[i].name === _Augmentation_data_AugmentationNames__WEBPACK_IMPORTED_MODULE_2__[/* AugmentationNames */ \"a\"].NeuroFluxGovernor) {\n currLevel = _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].augmentations[i].level;\n }\n } // Account for purchased but uninstalled Augmentations\n\n\n for (var i = 0; i < _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations.length; ++i) {\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].queuedAugmentations[i].name == _Augmentation_data_AugmentationNames__WEBPACK_IMPORTED_MODULE_2__[/* AugmentationNames */ \"a\"].NeuroFluxGovernor) {\n ++currLevel;\n }\n }\n\n return currLevel + 1;\n}\nfunction processPassiveFactionRepGain(numCycles) {\n for (const name in _Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"]) {\n if (name === _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].currentWorkFactionName) continue;\n if (!_Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"].hasOwnProperty(name)) continue;\n const faction = _Factions__WEBPACK_IMPORTED_MODULE_6__[/* Factions */ \"a\"][name];\n if (!faction.isMember) continue; // No passive rep for special factions\n\n const info = faction.getInfo();\n if (!info.offersWork()) continue; // No passive rep for gangs.\n\n if (_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].getGangName() === name) continue; // 0 favor = 1%/s\n // 50 favor = 6%/s\n // 100 favor = 11%/s\n\n const favorMult = Math.min(0.1, faction.favor / 1000 + 0.01); // Find the best of all possible favor gain, minimum 1 rep / 2 minute.\n\n const hRep = Object(_PersonObjects_formulas_reputation__WEBPACK_IMPORTED_MODULE_10__[/* getHackingWorkRepGain */ \"c\"])(_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"], faction);\n const sRep = Object(_PersonObjects_formulas_reputation__WEBPACK_IMPORTED_MODULE_10__[/* getFactionSecurityWorkRepGain */ \"b\"])(_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"], faction);\n const fRep = Object(_PersonObjects_formulas_reputation__WEBPACK_IMPORTED_MODULE_10__[/* getFactionFieldWorkRepGain */ \"a\"])(_Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"], faction);\n const rate = Math.max(hRep * favorMult, sRep * favorMult, fRep * favorMult, 1 / 120);\n faction.playerReputation += rate * numCycles * _Player__WEBPACK_IMPORTED_MODULE_8__[/* Player */ \"a\"].faction_rep_mult * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_3__[/* BitNodeMultipliers */ \"a\"].FactionPassiveRepGain;\n }\n}\n\n//# sourceURL=webpack:///./src/Faction/FactionHelpers.jsx?");
-
-/***/ }),
-/* 93 */
-/*!******************************!*\
- !*** ./src/Server/Server.ts ***!
- \******************************/
-/*! exports provided: Server */
-/*! exports used: Server */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Server; });\n/* harmony import */ var _BaseServer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseServer */ 438);\n/* harmony import */ var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BitNode/BitNodeMultipliers */ 8);\n/* harmony import */ var _utils_helpers_createRandomString__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/helpers/createRandomString */ 655);\n/* harmony import */ var _utils_IPAddress__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/IPAddress */ 241);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\nfunction _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\n// Class representing a single hackable Server\n\n\n\n\n\nclass Server extends _BaseServer__WEBPACK_IMPORTED_MODULE_0__[/* BaseServer */ \"a\"] {\n // Flag indicating whether this server has a backdoor installed by a player\n // Initial server security level\n // (i.e. security level when the server was created)\n // Server Security Level\n // Minimum server security level that this server can be weakened to\n // How much money currently resides on the server and can be hacked\n // Maximum amount of money that this server can hold\n // Number of open ports required in order to gain admin/root access\n // How many ports are currently opened on the server\n // Flag indicating wehther this is a purchased server\n // Hacking level required to hack this server\n // Parameter that affects how effectively this server's money can\n // be increased using the grow() Netscript function\n constructor(params = {\n hostname: \"\",\n ip: Object(_utils_IPAddress__WEBPACK_IMPORTED_MODULE_3__[/* createRandomIp */ \"a\"])()\n }) {\n super(params); // \"hacknet-node-X\" hostnames are reserved for Hacknet Servers\n\n _defineProperty(this, \"backdoorInstalled\", false);\n\n _defineProperty(this, \"baseDifficulty\", 1);\n\n _defineProperty(this, \"hackDifficulty\", 1);\n\n _defineProperty(this, \"minDifficulty\", 1);\n\n _defineProperty(this, \"moneyAvailable\", 0);\n\n _defineProperty(this, \"moneyMax\", 0);\n\n _defineProperty(this, \"numOpenPortsRequired\", 5);\n\n _defineProperty(this, \"openPortCount\", 0);\n\n _defineProperty(this, \"purchasedByPlayer\", false);\n\n _defineProperty(this, \"requiredHackingSkill\", 1);\n\n _defineProperty(this, \"serverGrowth\", 1);\n\n if (this.hostname.startsWith(\"hacknet-node-\")) {\n this.hostname = Object(_utils_helpers_createRandomString__WEBPACK_IMPORTED_MODULE_2__[/* createRandomString */ \"a\"])(10);\n }\n\n this.purchasedByPlayer = params.purchasedByPlayer != null ? params.purchasedByPlayer : false; //RAM, CPU speed and Scripts\n\n this.maxRam = params.maxRam != null ? params.maxRam : 0; //GB\n\n /* Hacking information (only valid for \"foreign\" aka non-purchased servers) */\n\n this.requiredHackingSkill = params.requiredHackingSkill != null ? params.requiredHackingSkill : 1;\n this.moneyAvailable = params.moneyAvailable != null ? params.moneyAvailable * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].ServerStartingMoney : 0;\n this.moneyMax = 25 * this.moneyAvailable * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].ServerMaxMoney; //Hack Difficulty is synonymous with server security. Base Difficulty = Starting difficulty\n\n this.hackDifficulty = params.hackDifficulty != null ? params.hackDifficulty * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].ServerStartingSecurity : 1;\n this.baseDifficulty = this.hackDifficulty;\n this.minDifficulty = Math.max(1, Math.round(this.hackDifficulty / 3));\n this.serverGrowth = params.serverGrowth != null ? params.serverGrowth : 1; //Integer from 0 to 100. Affects money increase from grow()\n //Port information, required for porthacking servers to get admin rights\n\n this.numOpenPortsRequired = params.numOpenPortsRequired != null ? params.numOpenPortsRequired : 5;\n }\n /**\n * Ensures that the server's difficulty (server security) doesn't get too high\n */\n\n\n capDifficulty() {\n if (this.hackDifficulty < this.minDifficulty) {\n this.hackDifficulty = this.minDifficulty;\n }\n\n if (this.hackDifficulty < 1) {\n this.hackDifficulty = 1;\n } // Place some arbitrarily limit that realistically should never happen unless someone is\n // screwing around with the game\n\n\n if (this.hackDifficulty > 100) {\n this.hackDifficulty = 100;\n }\n }\n /**\n * Change this server's minimum security\n * @param n - Value by which to increase/decrease the server's minimum security\n * @param perc - Whether it should be changed by a percentage, or a flat value\n */\n\n\n changeMinimumSecurity(n, perc = false) {\n if (perc) {\n this.minDifficulty *= n;\n } else {\n this.minDifficulty += n;\n } // Server security cannot go below 1\n\n\n this.minDifficulty = Math.max(1, this.minDifficulty);\n }\n /**\n * Change this server's maximum money\n * @param n - Value by which to change the server's maximum money\n * @param perc - Whether it should be changed by a percentage, or a flat value\n */\n\n\n changeMaximumMoney(n, perc = false) {\n if (perc) {\n this.moneyMax *= n;\n } else {\n this.moneyMax += n;\n }\n }\n /**\n * Strengthens a server's security level (difficulty) by the specified amount\n */\n\n\n fortify(amt) {\n this.hackDifficulty += amt;\n this.capDifficulty();\n }\n /**\n * Lowers the server's security level (difficulty) by the specified amount)\n */\n\n\n weaken(amt) {\n this.hackDifficulty -= amt * _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_1__[/* BitNodeMultipliers */ \"a\"].ServerWeakenRate;\n this.capDifficulty();\n }\n /**\n * Serialize the current object to a JSON save state\n */\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_4__[/* Generic_toJSON */ \"b\"])(\"Server\", this);\n } // Initializes a Server Object from a JSON save state\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_4__[/* Generic_fromJSON */ \"a\"])(Server, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_4__[/* Reviver */ \"c\"].constructors.Server = Server;\n\n//# sourceURL=webpack:///./src/Server/Server.ts?");
-
-/***/ }),
-/* 94 */
-/*!******************************************!*\
- !*** ./src/Corporation/ui/MoneyCost.tsx ***!
- \******************************************/
-/*! exports provided: MoneyCost */
-/*! exports used: MoneyCost */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return MoneyCost; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../ui/numeralFormat */ 3);\n\n\nfunction MoneyCost(props) {\n if (!props.corp.funds.gt(props.money)) return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"unbuyable samefont\"\n }, _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__[/* numeralWrapper */ \"a\"].formatMoney(props.money));\n return react__WEBPACK_IMPORTED_MODULE_0__[\"createElement\"](\"span\", {\n className: \"money-gold samefont\"\n }, _ui_numeralFormat__WEBPACK_IMPORTED_MODULE_1__[/* numeralWrapper */ \"a\"].formatMoney(props.money));\n}\n\n//# sourceURL=webpack:///./src/Corporation/ui/MoneyCost.tsx?");
-
-/***/ }),
-/* 95 */,
-/* 96 */,
-/* 97 */,
-/* 98 */
-/*!********************************!*\
- !*** ./src/Message/Message.ts ***!
- \********************************/
-/*! exports provided: Message */
-/*! exports used: Message */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Message; });\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\nfunction _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\n\nclass Message {\n // Name of Message file\n // The text contains in the Message\n // Flag indicating whether this Message has been received by the player\n constructor(filename = \"\", msg = \"\") {\n _defineProperty(this, \"filename\", \"\");\n\n _defineProperty(this, \"msg\", \"\");\n\n _defineProperty(this, \"recvd\", false);\n\n this.filename = filename;\n this.msg = msg;\n this.recvd = false;\n } // Serialize the current object to a JSON save state\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_toJSON */ \"b\"])(\"Message\", this);\n } // Initializes a Message Object from a JSON save state\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_fromJSON */ \"a\"])(Message, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Reviver */ \"c\"].constructors.Message = Message;\n\n//# sourceURL=webpack:///./src/Message/Message.ts?");
-
-/***/ }),
-/* 99 */,
-/* 100 */
-/*!*******************************************!*\
- !*** ./src/Bladeburner/BlackOperation.ts ***!
- \*******************************************/
-/*! exports provided: BlackOperation */
-/*! exports used: BlackOperation */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BlackOperation; });\n/* harmony import */ var _Operation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Operation */ 264);\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n\n\nclass BlackOperation extends _Operation__WEBPACK_IMPORTED_MODULE_0__[/* Operation */ \"a\"] {\n constructor(params = null) {\n super(params);\n this.count = 1;\n } // To be implemented by subtypes\n\n\n getActionTimePenalty() {\n return 1.5;\n }\n\n getChaosCompetencePenalty() {\n return 1;\n }\n\n getChaosDifficultyBonus() {\n return 1;\n }\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Generic_toJSON */ \"b\"])(\"BlackOperation\", this);\n } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Generic_fromJSON */ \"a\"])(BlackOperation, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_1__[/* Reviver */ \"c\"].constructors.BlackOperation = BlackOperation;\n\n//# sourceURL=webpack:///./src/Bladeburner/BlackOperation.ts?");
-
-/***/ }),
-/* 101 */
-/*!********************************************!*\
- !*** ./src/Bladeburner/data/SkillNames.ts ***!
- \********************************************/
-/*! exports provided: SkillNames */
-/*! exports used: SkillNames */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SkillNames; });\nconst SkillNames = {\n BladesIntuition: \"Blade's Intuition\",\n Cloak: \"Cloak\",\n Marksman: \"Marksman\",\n WeaponProficiency: \"Weapon Proficiency\",\n ShortCircuit: \"Short-Circuit\",\n DigitalObserver: \"Digital Observer\",\n Tracer: \"Tracer\",\n Overclock: \"Overclock\",\n Reaper: \"Reaper\",\n EvasiveSystem: \"Evasive System\",\n Datamancer: \"Datamancer\",\n CybersEdge: \"Cyber's Edge\",\n HandsOfMidas: \"Hands of Midas\",\n Hyperdrive: \"Hyperdrive\"\n};\n\n//# sourceURL=webpack:///./src/Bladeburner/data/SkillNames.ts?");
-
-/***/ }),
-/* 102 */,
-/* 103 */,
-/* 104 */
-/*!*******************************************!*\
- !*** ./src/Netscript/killWorkerScript.ts ***!
- \*******************************************/
-/*! exports provided: killWorkerScript */
-/*! exports used: killWorkerScript */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return killWorkerScript; });\n/* harmony import */ var _WorkerScript__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./WorkerScript */ 250);\n/* harmony import */ var _WorkerScripts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./WorkerScripts */ 155);\n/* harmony import */ var _WorkerScriptStartStopEventEmitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./WorkerScriptStartStopEventEmitter */ 214);\n/* harmony import */ var _Script_RunningScript__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../Script/RunningScript */ 280);\n/* harmony import */ var _Server_AllServers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Server/AllServers */ 29);\n/* harmony import */ var _utils_helpers_compareArrays__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils/helpers/compareArrays */ 242);\n/* harmony import */ var _utils_helpers_roundToTwo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/helpers/roundToTwo */ 314);\n/**\n * Stops an actively-running script (represented by a WorkerScript object)\n * and removes it from the global pool of active scripts.\n */\n\n\n\n\n\n\n\nfunction killWorkerScript(script, serverIp, rerenderUi) {\n if (rerenderUi == null || typeof rerenderUi !== \"boolean\") {\n rerenderUi = true;\n }\n\n if (script instanceof _WorkerScript__WEBPACK_IMPORTED_MODULE_0__[/* WorkerScript */ \"a\"]) {\n stopAndCleanUpWorkerScript(script);\n return true;\n } else if (script instanceof _Script_RunningScript__WEBPACK_IMPORTED_MODULE_3__[/* RunningScript */ \"a\"] && typeof serverIp === \"string\") {\n // Try to kill by PID\n const res = killWorkerScriptByPid(script.pid, rerenderUi);\n\n if (res) {\n return res;\n } // If for some reason that doesn't work, we'll try the old way\n\n\n for (const ws of _WorkerScripts__WEBPACK_IMPORTED_MODULE_1__[/* workerScripts */ \"a\"].values()) {\n if (ws.name == script.filename && ws.serverIp == serverIp && Object(_utils_helpers_compareArrays__WEBPACK_IMPORTED_MODULE_5__[/* compareArrays */ \"a\"])(ws.args, script.args)) {\n stopAndCleanUpWorkerScript(ws, rerenderUi);\n return true;\n }\n }\n\n return false;\n } else if (typeof script === \"number\") {\n return killWorkerScriptByPid(script, rerenderUi);\n } else {\n console.error(`killWorkerScript() called with invalid argument:`);\n console.error(script);\n return false;\n }\n}\n\nfunction killWorkerScriptByPid(pid, rerenderUi = true) {\n const ws = _WorkerScripts__WEBPACK_IMPORTED_MODULE_1__[/* workerScripts */ \"a\"].get(pid);\n\n if (ws instanceof _WorkerScript__WEBPACK_IMPORTED_MODULE_0__[/* WorkerScript */ \"a\"]) {\n stopAndCleanUpWorkerScript(ws, rerenderUi);\n return true;\n }\n\n return false;\n}\n\nfunction stopAndCleanUpWorkerScript(workerScript, rerenderUi = true) {\n workerScript.env.stopFlag = true;\n killNetscriptDelay(workerScript);\n removeWorkerScript(workerScript, rerenderUi);\n}\n/**\n * Helper function that removes the script being killed from the global pool.\n * Also handles other cleanup-time operations\n *\n * @param {WorkerScript | number} - Identifier for WorkerScript. Either the object itself, or\n * its index in the global workerScripts array\n */\n\n\nfunction removeWorkerScript(workerScript, rerenderUi = true) {\n if (workerScript instanceof _WorkerScript__WEBPACK_IMPORTED_MODULE_0__[/* WorkerScript */ \"a\"]) {\n const ip = workerScript.serverIp;\n const name = workerScript.name; // Get the server on which the script runs\n\n const server = _Server_AllServers__WEBPACK_IMPORTED_MODULE_4__[/* AllServers */ \"b\"][ip];\n\n if (server == null) {\n console.error(`Could not find server on which this script is running: ${ip}`);\n return;\n } // Recalculate ram used on that server\n\n\n server.ramUsed = Object(_utils_helpers_roundToTwo__WEBPACK_IMPORTED_MODULE_6__[/* roundToTwo */ \"a\"])(server.ramUsed - workerScript.ramUsage);\n\n if (server.ramUsed < 0) {\n console.warn(`Server (${server.hostname}) RAM usage went negative (if it's due to floating pt imprecision, it's okay): ${server.ramUsed}`);\n server.ramUsed = 0;\n } // Delete the RunningScript object from that server\n\n\n for (let i = 0; i < server.runningScripts.length; ++i) {\n const runningScript = server.runningScripts[i];\n\n if (runningScript.filename === name && Object(_utils_helpers_compareArrays__WEBPACK_IMPORTED_MODULE_5__[/* compareArrays */ \"a\"])(runningScript.args, workerScript.args)) {\n server.runningScripts.splice(i, 1);\n break;\n }\n } // Delete script from global pool (workerScripts)\n\n\n const res = _WorkerScripts__WEBPACK_IMPORTED_MODULE_1__[/* workerScripts */ \"a\"].delete(workerScript.pid);\n\n if (!res) {\n console.warn(`removeWorkerScript() called with WorkerScript that wasn't in the global map:`);\n console.warn(workerScript);\n }\n\n if (rerenderUi) {\n _WorkerScriptStartStopEventEmitter__WEBPACK_IMPORTED_MODULE_2__[/* WorkerScriptStartStopEventEmitter */ \"a\"].emitEvent();\n }\n } else {\n console.error(`Invalid argument passed into removeWorkerScript():`);\n console.error(workerScript);\n return;\n }\n}\n/**\n * Helper function that interrupts a script's delay if it is in the middle of a\n * timed, blocked operation (like hack(), sleep(), etc.). This allows scripts to\n * be killed immediately even if they're in the middle of one of those long operations\n */\n\n\nfunction killNetscriptDelay(workerScript) {\n if (workerScript instanceof _WorkerScript__WEBPACK_IMPORTED_MODULE_0__[/* WorkerScript */ \"a\"]) {\n if (workerScript.delay) {\n clearTimeout(workerScript.delay);\n\n if (workerScript.delayResolve) {\n workerScript.delayResolve();\n }\n }\n }\n}\n\n//# sourceURL=webpack:///./src/Netscript/killWorkerScript.ts?");
-
-/***/ }),
-/* 105 */
-/*!**********************************!*\
- !*** ./src/StockMarket/Stock.ts ***!
- \**********************************/
-/*! exports provided: StockForecastInfluenceLimit, Stock */
-/*! exports used: Stock */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* unused harmony export StockForecastInfluenceLimit */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Stock; });\n/* harmony import */ var _utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/JSONReviver */ 15);\n/* harmony import */ var _utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/helpers/getRandomInt */ 19);\n\n\nconst StockForecastInfluenceLimit = 5;\nconst defaultConstructorParams = {\n b: true,\n initPrice: 10e3,\n marketCap: 1e12,\n mv: 1,\n name: \"\",\n otlkMag: 0,\n spreadPerc: 0,\n shareTxForMovement: 1e6,\n symbol: \"\"\n}; // Helper function that convert a IMinMaxRange to a number\n\nfunction toNumber(n) {\n let value;\n\n switch (typeof n) {\n case \"number\":\n {\n return n;\n }\n\n case \"object\":\n {\n const range = n;\n value = Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_1__[/* getRandomInt */ \"a\"])(range.min, range.max);\n break;\n }\n\n default:\n throw Error(`Do not know how to convert the type '${typeof n}' to a number`);\n }\n\n if (typeof n === \"object\" && typeof n.divisor === \"number\") {\n return value / n.divisor;\n }\n\n return value;\n}\n/**\n * Represents the valuation of a company in the World Stock Exchange.\n */\n\n\nclass Stock {\n /**\n * Bear or bull (more likely to go up or down, based on otlkMag)\n */\n\n /**\n * Maximum price of a stock (per share)\n */\n\n /**\n * Stocks previous share price\n */\n\n /**\n * Maximum number of shares that player can own (both long and short combined)\n */\n\n /**\n * Maximum volatility\n */\n\n /**\n * Name of the company that the stock is for\n */\n\n /**\n * Outlook magnitude. Represents the stock's forecast and likelihood\n * of increasing/decreasing (based on whether its in bear or bull mode)\n */\n\n /**\n * Forecast of outlook magnitude. Essentially a second-order forecast.\n * Unlike 'otlkMag', this number is on an absolute scale from 0-100 (rather than 0-50)\n */\n\n /**\n * Average price of stocks that the player owns in the LONG position\n */\n\n /**\n * Average price of stocks that the player owns in the SHORT position\n */\n\n /**\n * Number of shares the player owns in the LONG position\n */\n\n /**\n * Number of shares the player owns in the SHORT position\n */\n\n /**\n * Stock's share price\n */\n\n /**\n * How many shares need to be transacted in order to trigger a price movement\n */\n\n /**\n * How many share transactions remaining until a price movement occurs\n * (separately tracked for upward and downward movements)\n */\n\n /**\n * Spread percentage. The bid/ask prices for this stock are N% above or below\n * the \"real price\" to emulate spread.\n */\n\n /**\n * The stock's ticker symbol\n */\n\n /**\n * Total number of shares of this stock\n * This is different than maxShares, as this is like authorized stock while\n * maxShares is outstanding stock.\n */\n constructor(p = defaultConstructorParams) {\n this.name = p.name;\n this.symbol = p.symbol;\n this.price = toNumber(p.initPrice);\n this.lastPrice = this.price;\n this.playerShares = 0;\n this.playerAvgPx = 0;\n this.playerShortShares = 0;\n this.playerAvgShortPx = 0;\n this.mv = toNumber(p.mv);\n this.b = p.b;\n this.otlkMag = p.otlkMag;\n this.otlkMagForecast = this.getAbsoluteForecast();\n this.cap = Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_1__[/* getRandomInt */ \"a\"])(this.price * 1e3, this.price * 25e3);\n this.spreadPerc = toNumber(p.spreadPerc);\n this.shareTxForMovement = toNumber(p.shareTxForMovement);\n this.shareTxUntilMovement = this.shareTxForMovement; // Total shares is determined by market cap, and is rounded to nearest 100k\n\n const totalSharesUnrounded = p.marketCap / this.price;\n this.totalShares = Math.round(totalSharesUnrounded / 1e5) * 1e5; // Max Shares (Outstanding shares) is a percentage of total shares\n\n const outstandingSharePercentage = 0.2;\n this.maxShares = Math.round(this.totalShares * outstandingSharePercentage / 1e5) * 1e5;\n }\n /**\n * Safely set the stock's second-order forecast to a new value\n */\n\n\n changeForecastForecast(newff) {\n this.otlkMagForecast = newff;\n\n if (this.otlkMagForecast > 100) {\n this.otlkMagForecast = 100;\n } else if (this.otlkMagForecast < 0) {\n this.otlkMagForecast = 0;\n }\n }\n /**\n * Set the stock to a new price. Also updates the stock's previous price tracker\n */\n\n\n changePrice(newPrice) {\n this.lastPrice = this.price;\n this.price = newPrice;\n }\n /**\n * Change the stock's forecast during a stock market 'tick'.\n * The way a stock's forecast changes depends on various internal properties,\n * but is ultimately determined by RNG\n */\n\n\n cycleForecast(changeAmt = 0.1) {\n const increaseChance = this.getForecastIncreaseChance();\n\n if (Math.random() < increaseChance) {\n // Forecast increases\n if (this.b) {\n this.otlkMag += changeAmt;\n } else {\n this.otlkMag -= changeAmt;\n }\n } else {\n // Forecast decreases\n if (this.b) {\n this.otlkMag -= changeAmt;\n } else {\n this.otlkMag += changeAmt;\n }\n }\n\n this.otlkMag = Math.min(this.otlkMag, 50);\n\n if (this.otlkMag < 0) {\n this.otlkMag *= -1;\n this.b = !this.b;\n }\n }\n /**\n * Change's the stock's second-order forecast during a stock market 'tick'.\n * The change for the second-order forecast to increase is 50/50\n */\n\n\n cycleForecastForecast(changeAmt = 0.1) {\n if (Math.random() < 0.5) {\n this.changeForecastForecast(this.otlkMagForecast + changeAmt);\n } else {\n this.changeForecastForecast(this.otlkMagForecast - changeAmt);\n }\n }\n /**\n * \"Flip\" the stock's second-order forecast. This can occur during a\n * stock market \"cycle\" (determined by RNG). It is used to simulate\n * RL stock market cycles and introduce volatility\n */\n\n\n flipForecastForecast() {\n const diff = this.otlkMagForecast - 50;\n this.otlkMagForecast = 50 + -1 * diff;\n }\n /**\n * Returns the stock's absolute forecast, which is a number between 0-100\n */\n\n\n getAbsoluteForecast() {\n return this.b ? 50 + this.otlkMag : 50 - this.otlkMag;\n }\n /**\n * Return the price at which YOUR stock is bought (market ask price). Accounts for spread\n */\n\n\n getAskPrice() {\n return this.price * (1 + this.spreadPerc / 100);\n }\n /**\n * Return the price at which YOUR stock is sold (market bid price). Accounts for spread\n */\n\n\n getBidPrice() {\n return this.price * (1 - this.spreadPerc / 100);\n }\n /**\n * Returns the chance (0-1 decimal) that a stock has of having its forecast increase\n */\n\n\n getForecastIncreaseChance() {\n const diff = this.otlkMagForecast - this.getAbsoluteForecast();\n return (50 + Math.min(Math.max(diff, -45), 45)) / 100;\n }\n /**\n * Changes a stock's forecast. This is used when the stock is influenced\n * by a transaction. The stock's forecast always goes towards 50, but the\n * movement is capped by a certain threshold/limit\n */\n\n\n influenceForecast(change) {\n if (this.otlkMag > StockForecastInfluenceLimit) {\n this.otlkMag = Math.max(StockForecastInfluenceLimit, this.otlkMag - change);\n }\n }\n /**\n * Changes a stock's second-order forecast. This is used when the stock is\n * influenced by a transaction. The stock's second-order forecast always\n * goes towards 50.\n */\n\n\n influenceForecastForecast(change) {\n if (this.otlkMagForecast > 50) {\n this.otlkMagForecast -= change;\n this.otlkMagForecast = Math.max(50, this.otlkMagForecast);\n } else if (this.otlkMagForecast < 50) {\n this.otlkMagForecast += change;\n this.otlkMagForecast = Math.min(50, this.otlkMagForecast);\n }\n }\n /**\n * Serialize the Stock to a JSON save state.\n */\n\n\n toJSON() {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_toJSON */ \"b\"])(\"Stock\", this);\n }\n /**\n * Initializes a Stock from a JSON save state\n */\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n static fromJSON(value) {\n return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Generic_fromJSON */ \"a\"])(Stock, value.data);\n }\n\n}\n_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_0__[/* Reviver */ \"c\"].constructors.Stock = Stock;\n\n//# sourceURL=webpack:///./src/StockMarket/Stock.ts?");
-
-/***/ }),
-/* 106 */
-/*!*********************************!*\
- !*** ./src/Locations/Cities.ts ***!
- \*********************************/
-/*! exports provided: Cities */
-/*! exports used: Cities */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Cities; });\n/**\n * Map of all Cities in the game\n * Key = City Name, Value = City object\n */\nconst Cities = {};\n\n//# sourceURL=webpack:///./src/Locations/Cities.ts?");
-
-/***/ }),
-/* 107 */,
-/* 108 */,
-/* 109 */
-/*!*************************************!*\
- !*** ./src/DevMenu/ui/Adjuster.tsx ***!
- \*************************************/
-/*! exports provided: Adjuster */
-/*! exports used: Adjuster */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Adjuster; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_icons_material_Add__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/icons-material/Add */ 832);\n/* harmony import */ var _mui_icons_material_Add__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_mui_icons_material_Add__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_icons_material_Remove__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/icons-material/Remove */ 833);\n/* harmony import */ var _mui_icons_material_Remove__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_mui_icons_material_Remove__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material_IconButton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material/IconButton */ 113);\n/* harmony import */ var _mui_icons_material_Clear__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/icons-material/Clear */ 462);\n/* harmony import */ var _mui_icons_material_Clear__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_mui_icons_material_Clear__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _mui_icons_material_DoubleArrow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/icons-material/DoubleArrow */ 454);\n/* harmony import */ var _mui_icons_material_DoubleArrow__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_mui_icons_material_DoubleArrow__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _mui_material_TextField__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material/TextField */ 377);\n/* harmony import */ var _mui_material_Tooltip__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material/Tooltip */ 103);\n\n\n\n\n\n\n\n\nfunction Adjuster(props) {\n const [value, setValue] = Object(react__WEBPACK_IMPORTED_MODULE_0__[\"useState\"])(\"\");\n\n function onChange(event) {\n if (event.target.value === \"\") setValue(\"\");else setValue(parseFloat(event.target.value));\n }\n\n const {\n label,\n placeholder,\n add,\n subtract,\n reset,\n tons\n } = props;\n return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_TextField__WEBPACK_IMPORTED_MODULE_6__[/* default */ \"a\"], {\n label: label,\n value: value,\n onChange: onChange,\n placeholder: placeholder,\n type: \"number\",\n InputProps: {\n startAdornment: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_Tooltip__WEBPACK_IMPORTED_MODULE_7__[/* default */ \"a\"], {\n title: \"Add a lot\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_IconButton__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n onClick: tons,\n size: \"large\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_icons_material_DoubleArrow__WEBPACK_IMPORTED_MODULE_5___default.a, {\n style: {\n transform: \"rotate(-90deg)\"\n }\n }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_Tooltip__WEBPACK_IMPORTED_MODULE_7__[/* default */ \"a\"], {\n title: \"Add\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_IconButton__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n onClick: () => add(typeof value !== \"string\" ? value : 0),\n size: \"large\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_icons_material_Add__WEBPACK_IMPORTED_MODULE_1___default.a, null)))),\n endAdornment: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_Tooltip__WEBPACK_IMPORTED_MODULE_7__[/* default */ \"a\"], {\n title: \"Remove\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_IconButton__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n onClick: () => subtract(typeof value !== \"string\" ? value : 0),\n size: \"large\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_icons_material_Remove__WEBPACK_IMPORTED_MODULE_2___default.a, null))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_Tooltip__WEBPACK_IMPORTED_MODULE_7__[/* default */ \"a\"], {\n title: \"Reset\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_material_IconButton__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n onClick: reset,\n size: \"large\"\n }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_mui_icons_material_Clear__WEBPACK_IMPORTED_MODULE_4___default.a, null))))\n }\n }));\n}\n\n//# sourceURL=webpack:///./src/DevMenu/ui/Adjuster.tsx?");
-
-/***/ }),
-/* 110 */,
-/* 111 */
-/*!***********************************!*\
- !*** ./src/NetscriptEvaluator.js ***!
- \***********************************/
-/*! exports provided: netscriptDelay, makeRuntimeRejectMsg, resolveNetscriptRequestedThreads, getErrorLineNumber, isScriptErrorMessage */
-/*! exports used: isScriptErrorMessage, makeRuntimeRejectMsg, netscriptDelay, resolveNetscriptRequestedThreads */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return netscriptDelay; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return makeRuntimeRejectMsg; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return resolveNetscriptRequestedThreads; });\n/* unused harmony export getErrorLineNumber */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isScriptErrorMessage; });\n/* harmony import */ var _utils_SetTimeoutRef__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/SetTimeoutRef */ 131);\n/* harmony import */ var _utils_helpers_isString__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/helpers/isString */ 83);\n/* harmony import */ var _Server_AllServers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Server/AllServers */ 29);\n\n\n\nfunction netscriptDelay(time, workerScript) {\n return new Promise(function (resolve) {\n workerScript.delay = Object(_utils_SetTimeoutRef__WEBPACK_IMPORTED_MODULE_0__[/* setTimeoutRef */ \"a\"])(() => {\n workerScript.delay = null;\n resolve();\n }, time);\n workerScript.delayResolve = resolve;\n });\n}\nfunction makeRuntimeRejectMsg(workerScript, msg, exp = null) {\n var lineNum = \"\";\n\n if (exp != null) {\n var num = getErrorLineNumber(exp, workerScript);\n lineNum = \" (Line \" + num + \")\";\n }\n\n const server = _Server_AllServers__WEBPACK_IMPORTED_MODULE_2__[/* AllServers */ \"b\"][workerScript.serverIp];\n\n if (server == null) {\n throw new Error(`WorkerScript constructed with invalid server ip: ${this.serverIp}`);\n }\n\n return \"|\" + server.hostname + \"|\" + workerScript.name + \"|\" + msg + lineNum;\n}\nfunction resolveNetscriptRequestedThreads(workerScript, functionName, requestedThreads) {\n const threads = workerScript.scriptRef.threads;\n\n if (!requestedThreads) {\n return isNaN(threads) || threads < 1 ? 1 : threads;\n }\n\n const requestedThreadsAsInt = requestedThreads | 0;\n\n if (isNaN(requestedThreads) || requestedThreadsAsInt < 1) {\n throw makeRuntimeRejectMsg(workerScript, `Invalid thread count passed to ${functionName}: ${requestedThreads}. Threads must be a positive number.`);\n }\n\n if (requestedThreads > threads) {\n throw makeRuntimeRejectMsg(workerScript, `Too many threads requested by ${functionName}. Requested: ${requestedThreads}. Has: ${threads}.`);\n }\n\n return requestedThreadsAsInt;\n}\nfunction getErrorLineNumber(exp, workerScript) {\n var code = workerScript.scriptRef.codeCode(); //Split code up to the start of the node\n\n try {\n code = code.substring(0, exp.start);\n return (code.match(/\\n/g) || []).length + 1;\n } catch (e) {\n return -1;\n }\n}\nfunction isScriptErrorMessage(msg) {\n if (!Object(_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_1__[/* isString */ \"a\"])(msg)) {\n return false;\n }\n\n let splitMsg = msg.split(\"|\");\n\n if (splitMsg.length != 4) {\n return false;\n }\n\n return true;\n}\n\n//# sourceURL=webpack:///./src/NetscriptEvaluator.js?");
-
-/***/ }),
-/* 112 */
-/*!**************************************!*\
- !*** ./src/Literature/Literature.ts ***!
- \**************************************/
-/*! exports provided: Literature */
-/*! exports used: Literature */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Literature; });\n/**\n * Lore / world building literature files that can be found on servers.\n * These files can be read by the player\n */\nclass Literature {\n constructor(title, filename, txt) {\n this.title = title;\n this.fn = filename;\n this.txt = txt;\n }\n\n}\n\n//# sourceURL=webpack:///./src/Literature/Literature.ts?");
-
-/***/ }),
-/* 113 */,
-/* 114 */,
-/* 115 */,
-/* 116 */
-/*!******************************************!*\
- !*** ./utils/uiHelpers/createElement.ts ***!
- \******************************************/
-/*! exports provided: createElement */
-/*! exports used: createElement */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return createElement; });\n/**\n * Options specific to creating an anchor (\"\") element.\n */\n\n/**\n * Options specific to creating an input (\"\") element.\n */\n\n/**\n * Options specific to creating a label (\"