{"ctor":"BitburnerSaveObject","data":{"PlayerSave":"{\"ctor\":\"PlayerObject\",\"data\":{\"hp\":{\"current\":10,\"max\":10},\"skills\":{\"hacking\":336,\"strength\":1,\"defense\":1,\"dexterity\":1,\"agility\":1,\"charisma\":39,\"intelligence\":0},\"exp\":{\"hacking\":1787801.1729671764,\"strength\":0,\"defense\":0,\"dexterity\":0,\"agility\":0,\"charisma\":801.1559230867945,\"intelligence\":0},\"mults\":{\"hacking_chance\":1.29156618768144,\"hacking_speed\":1.29156618768144,\"hacking_money\":1.29156618768144,\"hacking_grow\":1.29156618768144,\"hacking\":1.29156618768144,\"hacking_exp\":1.29156618768144,\"strength\":1.29156618768144,\"strength_exp\":1.29156618768144,\"defense\":1.29156618768144,\"defense_exp\":1.29156618768144,\"dexterity\":1.29156618768144,\"dexterity_exp\":1.29156618768144,\"agility\":1.29156618768144,\"agility_exp\":1.29156618768144,\"charisma\":1.29156618768144,\"charisma_exp\":1.29156618768144,\"hacknet_node_money\":1.29156618768144,\"hacknet_node_purchase_cost\":0.7742468094733391,\"hacknet_node_ram_cost\":0.7742468094733391,\"hacknet_node_core_cost\":0.7742468094733391,\"hacknet_node_level_cost\":0.7742468094733391,\"company_rep\":1.29156618768144,\"faction_rep\":1.29156618768144,\"work_money\":1.29156618768144,\"crime_success\":1.29156618768144,\"crime_money\":1.29156618768144,\"bladeburner_max_stamina\":1,\"bladeburner_stamina_gain\":1,\"bladeburner_analysis\":1,\"bladeburner_success_chance\":1},\"augmentations\":[],\"queuedAugmentations\":[{\"level\":1,\"name\":\"Hacknet Node Core Direct-Neural Interface\"},{\"level\":1,\"name\":\"Hacknet Node Kernel Direct-Neural Interface\"},{\"level\":1,\"name\":\"Hacknet Node CPU Architecture Neural-Upload\"},{\"level\":1,\"name\":\"Hacknet Node Cache Architecture Neural-Upload\"},{\"level\":1,\"name\":\"Hacknet Node NIC Architecture Neural-Upload\"},{\"level\":1,\"name\":\"NeuroFlux Governor\"},{\"level\":2,\"name\":\"NeuroFlux Governor\"},{\"level\":3,\"name\":\"NeuroFlux Governor\"}],\"city\":\"New Tokyo\",\"bitNodeN\":4,\"corporation\":null,\"gang\":null,\"bladeburner\":null,\"currentServer\":\"home\",\"factions\":[\"NiteSec\",\"Netburners\",\"CyberSec\"],\"factionInvitations\":[\"Aevum\",\"Tian Di Hui\",\"New Tokyo\"],\"hacknetNodes\":[{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":66249.99999959696,\"ram\":64,\"totalMoneyGenerated\":17566154.933821883,\"name\":\"hacknet-node-0\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":66248.99999959697,\"ram\":64,\"totalMoneyGenerated\":17472645.625972334,\"name\":\"hacknet-node-1\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":66245.99999959701,\"ram\":64,\"totalMoneyGenerated\":17357409.683347356,\"name\":\"hacknet-node-2\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":66129.9999995987,\"ram\":64,\"totalMoneyGenerated\":17310104.54965122,\"name\":\"hacknet-node-3\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":65981.19999960087,\"ram\":64,\"totalMoneyGenerated\":17265310.51637839,\"name\":\"hacknet-node-4\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":65502.599999607824,\"ram\":64,\"totalMoneyGenerated\":17212602.2377169,\"name\":\"hacknet-node-5\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":64335.19999962481,\"ram\":64,\"totalMoneyGenerated\":17153119.60885114,\"name\":\"hacknet-node-6\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":62981.199999644516,\"ram\":64,\"totalMoneyGenerated\":17070596.06188144,\"name\":\"hacknet-node-7\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":60157.19999968561,\"ram\":64,\"totalMoneyGenerated\":17002320.265712734,\"name\":\"hacknet-node-8\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":57499.399999724286,\"ram\":64,\"totalMoneyGenerated\":16934508.785004593,\"name\":\"hacknet-node-9\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":54832.1999997631,\"ram\":64,\"totalMoneyGenerated\":16864751.321418278,\"name\":\"hacknet-node-10\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":51292.99999981458,\"ram\":64,\"totalMoneyGenerated\":16730825.057217132,\"name\":\"hacknet-node-11\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":48204.3999998595,\"ram\":64,\"totalMoneyGenerated\":16629712.65498506,\"name\":\"hacknet-node-12\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":39438.39999998708,\"ram\":64,\"totalMoneyGenerated\":16278994.48587731,\"name\":\"hacknet-node-13\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":37247.80000001896,\"ram\":64,\"totalMoneyGenerated\":16118863.0828081,\"name\":\"hacknet-node-14\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":33927.600000067265,\"ram\":64,\"totalMoneyGenerated\":15755011.43479471,\"name\":\"hacknet-node-15\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":31789.200000080575,\"ram\":64,\"totalMoneyGenerated\":15209998.777396511,\"name\":\"hacknet-node-16\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":29001.600000070433,\"ram\":64,\"totalMoneyGenerated\":14102603.953131672,\"name\":\"hacknet-node-17\"}},{\"ctor\":\"HacknetNode\",\"data\":{\"cores\":13,\"level\":200,\"moneyGainRatePerSecond\":507.65798039398055,\"onlineTimeSeconds\":22939.00000004839,\"ram\":64,\"totalMoneyGenerated\":11399831.398921477,\"name\":\"hacknet-node-18\"}}],\"has4SData\":false,\"has4SDataTixApi\":false,\"hashManager\":{\"ctor\":\"HashManager\",\"data\":{\"capacity\":0,\"hashes\":0,\"upgrades\":{\"Sell for Money\":0,\"Sell for Corporation Funds\":0,\"Reduce Minimum Security\":0,\"Increase Maximum Money\":0,\"Improve Studying\":0,\"Improve Gym Training\":0,\"Exchange for Corporation Research\":0,\"Exchange for Bladeburner Rank\":0,\"Exchange for Bladeburner SP\":0,\"Generate Coding Contract\":0,\"Company Favor\":0}}},\"hasTixApiAccess\":false,\"hasWseAccount\":false,\"jobs\":{\"ECorp\":\"IT Intern\"},\"karma\":0,\"numPeopleKilled\":0,\"location\":\"Noodle Bar\",\"money\":18066119.76420434,\"moneySourceA\":{\"ctor\":\"MoneySourceTracker\",\"data\":{\"bladeburner\":0,\"casino\":0,\"class\":-6366208,\"codingcontract\":0,\"corporation\":0,\"crime\":0,\"gang\":0,\"hacking\":2961220810.340747,\"hacknet\":311435364.41103476,\"hacknet_expenses\":-2333841970.462571,\"hospitalization\":0,\"infiltration\":0,\"sleeves\":0,\"stock\":0,\"total\":18065006.7642041,\"work\":416601.08000471396,\"servers\":-211200000,\"other\":-285599991.454424,\"augmentations\":-417999599.15532994}},\"moneySourceB\":{\"ctor\":\"MoneySourceTracker\",\"data\":{\"bladeburner\":0,\"casino\":0,\"class\":-6366208,\"codingcontract\":0,\"corporation\":0,\"crime\":0,\"gang\":0,\"hacking\":2961220810.340747,\"hacknet\":311435364.41103476,\"hacknet_expenses\":-2333841970.462571,\"hospitalization\":0,\"infiltration\":0,\"sleeves\":0,\"stock\":0,\"total\":18065006.7642041,\"work\":416601.08000471396,\"servers\":-211200000,\"other\":-285599991.454424,\"augmentations\":-417999599.15532994}},\"playtimeSinceLastAug\":69435400,\"playtimeSinceLastBitnode\":69435400,\"lastAugReset\":1694633659224,\"lastNodeReset\":1694633659224,\"purchasedServers\":[\"home-0\",\"home-1\",\"home-2\",\"home-3\",\"home-4\",\"home-5\",\"home-6\",\"home-7\",\"home-8\",\"home-9\",\"home-10\",\"home-11\",\"home-12\",\"home-13\",\"home-14\",\"home-15\",\"home-16\",\"home-17\",\"home-18\",\"home-19\",\"home-20\",\"home-21\",\"home-22\",\"home-23\",\"home-24\"],\"scriptProdSinceLastAug\":2961220810.340747,\"sleeves\":[],\"sleevesFromCovenant\":0,\"sourceFiles\":{\"ctor\":\"JSONMap\",\"data\":[[1,3]]},\"exploits\":[\"N00dles\",\"UndocumentedFunctionCall\",\"Bypass\",\"Unclickable\",\"RealityAlteration\",\"INeedARainbow\",\"TimeCompression\",\"PrototypeTampering\",\"YoureNotMeantToAccessThis\"],\"achievements\":[{\"ID\":\"NS2\",\"unlockedOn\":1662595895471},{\"ID\":\"FIRST_HACKNET_NODE\",\"unlockedOn\":1662596015477},{\"ID\":\"FROZE\",\"unlockedOn\":1662606229026},{\"ID\":\"BRUTESSH.EXE\",\"unlockedOn\":1662608449026},{\"ID\":\"FTPCRACK.EXE\",\"unlockedOn\":1662632539212},{\"ID\":\"CYBERSEC\",\"unlockedOn\":1662654522875},{\"ID\":\"WORKOUT\",\"unlockedOn\":1662654762877},{\"ID\":\"HACKNET_NODE_10M\",\"unlockedOn\":1662699713290},{\"ID\":\"INSTALL_1\",\"unlockedOn\":1662736673277},{\"ID\":\"NITESEC\",\"unlockedOn\":1662820759873},{\"ID\":\"TOR\",\"unlockedOn\":1662827397785},{\"ID\":\"HOSPITALIZED\",\"unlockedOn\":1662832140786},{\"ID\":\"RELAYSMTP.EXE\",\"unlockedOn\":1662845880787},{\"ID\":\"HTTPWORM.EXE\",\"unlockedOn\":1662845880789},{\"ID\":\"TRAVEL\",\"unlockedOn\":1662862621580},{\"ID\":\"MAX_HACKNET_NODE\",\"unlockedOn\":1662949451779},{\"ID\":\"SQLINJECT.EXE\",\"unlockedOn\":1662949691784},{\"ID\":\"THE_BLACK_HAND\",\"unlockedOn\":1662965892986},{\"ID\":\"FORMULAS.EXE\",\"unlockedOn\":1663053707392},{\"ID\":\"BITRUNNERS\",\"unlockedOn\":1663226317042},{\"ID\":\"DONATION\",\"unlockedOn\":1663453433269},{\"ID\":\"DRAIN_SERVER\",\"unlockedOn\":1663459433299},{\"ID\":\"REPUTATION_10M\",\"unlockedOn\":1664194330396},{\"ID\":\"DAEDALUS\",\"unlockedOn\":1664194510488},{\"ID\":\"SF1.1\",\"unlockedOn\":1693265834474},{\"ID\":\"N00DLES\",\"unlockedOn\":1693405977626},{\"ID\":\"UNDOCUMENTEDFUNCTIONCALL\",\"unlockedOn\":1693571157628},{\"ID\":\"BYPASS\",\"unlockedOn\":1693571277636},{\"ID\":\"UNCLICKABLE\",\"unlockedOn\":1693781222084},{\"ID\":\"REALITYALTERATION\",\"unlockedOn\":1693781368207},{\"ID\":\"RAINBOW\",\"unlockedOn\":1693781668091},{\"ID\":\"30_HACKNET_NODE\",\"unlockedOn\":1693857951209},{\"ID\":\"SCRIPTS_30\",\"unlockedOn\":1693932536531},{\"ID\":\"CHALLENGE_BN1\",\"unlockedOn\":1693983797302},{\"ID\":\"TIMECOMPRESSION\",\"unlockedOn\":1693993857819},{\"ID\":\"PROTOTYPETAMPERING\",\"unlockedOn\":1693993917823},{\"ID\":\"SCRIPT_32GB\",\"unlockedOn\":1694016662331},{\"ID\":\"DEVMENU\",\"unlockedOn\":1694017429670},{\"ID\":\"UNACHIEVABLE\",\"unlockedOn\":1694017491631}],\"terminalCommandHistory\":[\"backdoor4BitRunners \",\"connect hong-fang-tea; connect nectar-net; connect neo-net; connect crush-fitness; connect I.I.I.I; connect aevum-police; connect global-pharm; connect unitalife; connect solaris; connect nova-med; connect run4theh111z; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"backdoor5TheCave \",\"connect hong-fang-tea; connect nectar-net; connect omega-net; connect the-hub; connect rothman-uni; connect millenium-fitness; connect galactic-cyber; connect deltaone; connect univ-energy; connect taiyang-digital; connect titan-labs; connect stormtech; connect 4sigma; connect b-and-a; connect The-Cave; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"backdoor6WorldDaemon \",\"connect hong-fang-tea; connect nectar-net; connect omega-net; connect the-hub; connect rothman-uni; connect millenium-fitness; connect galactic-cyber; connect deltaone; connect univ-energy; connect taiyang-digital; connect titan-labs; connect stormtech; connect 4sigma; connect b-and-a; connect The-Cave; connect w0r1d_d43m0n; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"analyze\",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"startAll \",\"ls\",\"cat INFO.txt \",\"flight \",\"backdoor1CSEC \",\"connect hong-fang-tea; connect CSEC; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"backdoor1CSEC \",\"connect hong-fang-tea; connect CSEC; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"backdoor2NiteSec \",\"connect hong-fang-tea; connect zer0; connect neo-net; connect avmnite-02h; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"backdoor3BlackHand \",\"connect hong-fang-tea; connect zer0; connect neo-net; connect avmnite-02h; connect I.I.I.I; \",\"run BruteSSH.exe; run FTPCrack.exe; run relaySMTP.exe; run HTTPWorm.exe; run SQLInject.exe; run NUKE.exe; backdoor\",\"home\",\"buyAll \",\"./auto-hack-v2.js \",\"rm auto-hack-copy.js \",\"./auto-hack-v2.js \",\"ls\",\"rm INFO.txt \",\"rm autoHack.txt \",\"rm autoHackMax.txt moneyStats.txt scan.txt\",\"rm autoHackMax.txt\",\"rm moneyStats.txt\",\"rm scan.txt\",\"ls\",\"./auto-hack-v2.js \",\"touch #asda.js\",\"nano #asda.js\",\"nano @asda.js\",\"ls\",\"nano @asda.js\",\"ls\",\"rm @asda.js \",\"./auto-hack-v2.js \",\"ls\"],\"lastUpdate\":1694703094446,\"lastSave\":1694703070452,\"totalPlaytime\":32107925200,\"currentWork\":{\"ctor\":\"FactionWork\",\"data\":{\"type\":\"FACTION\",\"singularity\":false,\"cyclesWorked\":83652,\"factionWorkType\":\"hacking\",\"factionName\":\"Netburners\"}},\"focus\":false,\"entropy\":0,\"identifier\":\"38aadbdb6216\"}}","AllServersSave":"{\"home\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"home\",\"httpPortOpen\":true,\"ip\":\"75.8.0.0\",\"isConnectedTo\":true,\"maxRam\":32,\"messages\":[\"hackers-starting-handbook.lit\",\"j0.msg\",\"j1.msg\",\"csec-test.msg\",\"j2.msg\",\"nitesec-test.msg\",\"j3.msg\"],\"organizationName\":\"Home PC\",\"programs\":[\"NUKE.exe\",\"b1t_flum3.exe\",\"fl1ght.exe\",\"BruteSSH.exe\",\"FTPCrack.exe\",\"relaySMTP.exe\",\"HTTPWorm.exe\",\"SQLInject.exe\"],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"simple-hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n\\tns.disableLog('ALL');\\n\\n\\tasync function writeLog(type, obj) {\\n\\t\\tlet timeNow = new Date();\\n\\t\\tlet year = timeNow.getFullYear().toString().substring(2);\\n\\t\\tlet month = (timeNow.getMonth() < 9 ? '0' : '') + (timeNow.getMonth() + 1);\\n\\t\\tlet day = (timeNow.getDate() < 10 ? '0' : '') + timeNow.getDate();\\n\\t\\tlet hour = (timeNow.getHours() < 10 ? '0' : '') + timeNow.getHours();\\n\\t\\tlet minute = (timeNow.getMinutes() < 10 ? '0' : '') + timeNow.getMinutes();\\n\\t\\tlet second = (timeNow.getSeconds() < 10 ? '0' : '') + timeNow.getSeconds();\\n\\t\\tlet timestamp = `${year}${month}${day}_${hour}${minute}${second}`;\\n\\t\\tawait ns.tryWritePort(1, `t${timestamp}_${type} = ${obj};\\\\n`);\\n\\n\\t\\tif (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${timestamp} ${type} = ${obj}`);\\n\\t}\\n\\n\\tlet server = ns.args[0];\\n\\tlet maxMoney = ns.getServerMaxMoney(server);\\n\\tlet minSecurity = ns.getServerMinSecurityLevel(server);\\n\\tlet loop = 0;\\n\\tlet previousMoney = 0;\\n\\n\\twhile (maxMoney != 0) {\\n\\t\\tlet currentMoney = ns.getServerMoneyAvailable(server);\\n\\t\\tlet currentSecurity = ns.getServerSecurityLevel(server);\\n\\n\\t\\tlet hackedMoney = 0;\\n\\t\\tif (currentMoney > 0.1 * maxMoney) {\\n\\t\\t\\thackedMoney = await ns.hack(server);\\n\\t\\t\\tcurrentMoney = ns.getServerMoneyAvailable(server);\\n\\t\\t}\\n\\n\\t\\tif (currentMoney < 0.9 * maxMoney) {\\n\\t\\t\\twhile (currentMoney <= previousMoney) {\\n\\t\\t\\t\\tawait ns.grow(server);\\n\\t\\t\\t\\tcurrentMoney = ns.getServerMoneyAvailable(server);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tpreviousMoney = currentMoney;\\n\\n\\t\\tif (currentSecurity > 2 * minSecurity) {\\n\\t\\t\\tawait ns.weaken(server);\\n\\t\\t\\tcurrentSecurity = ns.getServerSecurityLevel(server);\\n\\t\\t}\\n\\n\\t\\tns.print(`{loop: ${++loop}, hack: ${Math.floor(hackedMoney)}, money: ${Math.floor(currentMoney)} / ${Math.floor(maxMoney)} == ${((currentMoney / maxMoney) * 100).toFixed(2)}, security: ${currentSecurity.toFixed(2)} / ${Math.floor(minSecurity)} == ${((currentSecurity / minSecurity) * 100).toFixed(4)}}`);\\n\\t\\tawait ns.sleep(50);\\n\\t}\\n}\",\"filename\":\"simple-hack.js\",\"server\":\"home\"}}],[\"run-simple-hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n    let host = ns.args[0];\\n    let remote = ns.args[1];\\n    let script = 'simple-hack.js';\\n\\n    if (!ns.serverExists(host)) {\\n        ns.print(`Host '${host}'' doesn't exist!`);\\n        return 1;\\n    }\\n\\n    if (!ns.serverExists(remote)) {\\n        ns.print(`Remote '${remote}'' doesn't exist!`);\\n        return 2;\\n    }\\n\\n    if (!ns.fileExists(script, host)) {\\n        if (!ns.fileExists(script, 'home')) {\\n            ns.print(`Script '${script}' doesn't exist!`);\\n            return 3;\\n        }\\n\\n        ns.scp(script, host, 'home');\\n    }\\n\\n    let serverMaxRam = ns.getServerMaxRam(host);\\n    let serverUsedRam = ns.getServerUsedRam(host);\\n    let serverFreeRam = serverMaxRam - serverUsedRam;\\n    let scriptRam = ns.getScriptRam(script, host);\\n    let maxThreads = Math.floor(serverFreeRam / scriptRam);\\n    if(maxThreads == 0)\\n    {\\n        ns.print(`Not enough ram to run '${script}', ${scriptRam}/${serverFreeRam}!`)\\n    }\\n\\n    ns.scriptKill(script, host);\\n\\n    if (!ns.exec(script, host, maxThreads, remote)) {\\n        ns.tprint(`Exec error running script '${script} on '${host}!`);\\n    }\\n\\n    \\n}\\n\",\"filename\":\"run-simple-hack.js\",\"server\":\"home\"}}],[\"auto-nuke.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"import { EXCLUDE_SERVERS } from \\\"./constants.js\\\";\\n\\n/** @param {import(\\\".\\\").NS} ns*/\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n    async function writeLog(type, obj) {\\n        let timeNow = new Date();\\n        let year = timeNow.getFullYear().toString().substring(2);\\n        let month = (timeNow.getMonth() < 9 ? '0' : '') + (timeNow.getMonth() + 1);\\n        let day = (timeNow.getDate() < 10 ? '0' : '') + timeNow.getDate();\\n        let hour = (timeNow.getHours() < 10 ? '0' : '') + timeNow.getHours();\\n        let minute = (timeNow.getMinutes() < 10 ? '0' : '') + timeNow.getMinutes();\\n        let second = (timeNow.getSeconds() < 10 ? '0' : '') + timeNow.getSeconds();\\n        let timestamp = `${year}${month}${day}_${hour}${minute}${second}`;\\n        await ns.tryWritePort(2, `t${timestamp}_${type} = ${obj};\\\\n`);\\n\\n        if (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${timestamp} ${type} = ${obj}`);\\n    }\\n    /**\\n     * @constant\\n     * @default\\n     */\\n    const EXPLOITS = [\\n        'BruteSSH.exe',\\n        'FTPCrack.exe',\\n        'relaySMTP.exe',\\n        'HTTPWorm.exe',\\n        'SQLInject.exe'\\n    ];\\n\\n    /** @function maxPortsToHack\\n     * Calculate how many ports you're able to open\\n     * @returns {number} number of ports you're able to open\\n     */\\n    function maxPortsToHack() {\\n        let maxPorts = 0;\\n        EXPLOITS.forEach(exploit => {\\n            if (ns.fileExists(exploit)) ++maxPorts;\\n        });\\n        // ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);\\n        return maxPorts;\\n    }\\n\\n    /** @function analyzeServer\\n     * Analyze server requirements\\n     * @param {string} server \\n     * @returns {object} object containing server information\\n     */\\n    function analyzeServer(server) {\\n        let requiredHacking = ns.getServerRequiredHackingLevel(server);\\n        let requiredPorts = ns.getServerNumPortsRequired(server);\\n        let currentHacking = ns.getHackingLevel();\\n\\n        return {\\n            \\\"rootAccess\\\": ns.hasRootAccess(server),\\n            \\\"requiredHacking\\\": requiredHacking,\\n            \\\"requiredPorts\\\": requiredPorts,\\n            \\\"nukeAvailable\\\": (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts)\\n        };\\n    }\\n\\n    /** @function runHack\\n     * Recursively scan, try to nuke and hack servers in the network\\n     * @param {string} server server to nuke and hack\\n     * @returns {Promise<number>} exit code; if negative error, if positive hack script PID, if 0 already running\\n     */\\n    async function runNuke(server) {\\n        let serverStatus = analyzeServer(server);\\n        ns.print('INFO ', `{server: \\\"${server}\\\", status: ${JSON.stringify(serverStatus)}}`);\\n\\n        if (!serverStatus.rootAccess && serverStatus.nukeAvailable) {\\n            ns.print(`\\\"Nuking ${server}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\\"`);\\n            for (let i = 0; i < maxPortsToHack(); ++i) {\\n                switch (EXPLOITS[i]) {\\n                    case 'BruteSSH.exe':\\n                        ns.brutessh(server);\\n                        break;\\n\\n                    case 'FTPCrack.exe':\\n                        ns.ftpcrack(server);\\n                        break;\\n\\n                    case 'relaySMTP.exe':\\n                        ns.relaysmtp(server);\\n                        break;\\n\\n                    case 'HTTPWorm.exe':\\n                        ns.httpworm(server);\\n                        break;\\n\\n                    case 'SQLInject.exe':\\n                        ns.sqlinject(server);\\n                        break;\\n\\n                }\\n            }\\n            ns.nuke(server);\\n        }\\n    }\\n\\n    async function runHack(server) {\\n        let script = 'simple-hack.js';\\n\\n        let serverStatus = analyzeServer(server);\\n        ns.print('INFO ', `{server: \\\"${server}\\\", status: ${JSON.stringify(serverStatus)}}`);\\n\\n        if (serverStatus.rootAccess && serverStatus.nukeAvailable) {\\n            if (!ns.fileExists(script, 'home')) {\\n                ns.print(`ERROR Script '${script}' doesn't exist!`);\\n                // return -3;\\n            }\\n            ns.scp(script, server, 'home');\\n\\n            let serverMaxRam = ns.getServerMaxRam(server);\\n            let serverUsedRam = ns.getServerUsedRam(server);\\n            let serverFreeRam = serverMaxRam - serverUsedRam;\\n            let scriptRam = ns.getScriptRam(script, server);\\n            let maxThreads = Math.floor(serverFreeRam / scriptRam);\\n\\n            let a = ns.scriptRunning(script, server);\\n            if (!a) {\\n                if (maxThreads == 0) {\\n                    // await writeLog('ERROR', `\\\"Not enough ram to run '${script}' on '${server}', ${scriptRam}/${serverFreeRam}!\\\"`);\\n                    return -4;\\n                }\\n\\n                let execExitCode = ns.exec(script, server, maxThreads, server);\\n\\n                if (!execExitCode) {\\n                    // await writeLog('ERROR', `\\\"Exec error running script '${script} on '${server}!\\\"`);\\n                    return -5;\\n                }\\n                else {\\n                    return execExitCode;\\n                }\\n            } else {\\n                // await writeLog('ERROR', `\\\"Hack already running on ${server}\\\"`);\\n                return 0;\\n            }\\n        }\\n\\n        return -6;\\n    }\\n\\n    /**\\n     * Recursively kill simple-hack.js running on servers in the network\\n     * @async\\n     * @param {string} currentServer server to scan\\n     */\\n    async function scanServer(currentServer, previousServer = currentServer) {\\n        let availableServers = ns.scan(currentServer);\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                await runNuke(nextServer);\\n                if (EXCLUDE_SERVERS.indexOf(nextServer) == -1) {\\n                    let hackExitCode = await runHack(nextServer);\\n\\n                    // if (hackExitCode == 0) {\\n                    //     ns.print('INFO ' + `\\\"Hack already running on ${nextServer}\\\"`);\\n                    // } else if (hackExitCode == -6) {\\n                    //     ns.print('ERROR ' + `\\\"No root access to ${nextServer}!\\\"`);\\n                    // } else if (hackExitCode == -4) {\\n                    //     ns.print('WARN ' + `\\\"Not enough RAM to run script on ${nextServer}!\\\"`);\\n                    // } else {\\n                    //     if (hackExitCode < 0) {\\n                    //         ns.print('ERROR ' + `\\\"Hack exec ERROR on '${nextServer}': ${hackExitCode}!\\\"`);\\n                    //     } else {\\n                    //         ns.print('INFO ' + `\\\"Hack started on '${nextServer}'\\\"`);\\n                    //     }\\n                    // }\\n                }\\n                await scanServer(nextServer, currentServer);\\n            }\\n        }\\n        await ns.sleep(10);\\n    }\\n\\n    ns.write('nuke-log.js', '', 'w');\\n    if (!ns.scriptRunning('simple-hack.js', 'n00dles')) ns.write('hack-log.js', '', 'w');\\n    ns.tprint(`TERMINAL = \\\"Running scan\\\"`);\\n\\n    while (true) {\\n        ns.print(`INFO Running scan`);\\n        await scanServer('home');\\n        await ns.sleep(60000);\\n    }\\n}\\n\",\"filename\":\"auto-nuke.js\",\"server\":\"home\"}}],[\"hacknet-bot.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n    const nodeCostThreshold = ns.args.length > 0 ? ns.args[0] : 0.2;\\n    const upgradeCostThreshold = ns.args.length > 1 ? ns.args[1] : 0.1;\\n    const upgradeCount = ns.args.length > 2 ? ns.args[2] : 1;\\n    const nodeCap = 24;\\n    const levelCap = 200;\\n    const ramCap = 64;\\n    const coreCap = 16;\\n    // ns.tprint(`Bot started {nodeCostThreshold: ${nodeCostThreshold}, upgradeCostThreshold: ${upgradeCostThreshold}, upgradeCount: ${upgradeCount}}`);\\n\\n    \\n\\n    while (true) {\\n        let currentMoney = ns.getServerMoneyAvailable(\\\"home\\\");\\n\\n        let nodePurchaseCost = ns.hacknet.getPurchaseNodeCost();\\n        let nodeCount = ns.hacknet.numNodes();\\n\\n        if (nodeCount < nodeCap && nodePurchaseCost / Math.abs(currentMoney) < nodeCostThreshold) {\\n            ns.hacknet.purchaseNode();\\n            currentMoney = ns.getServerMoneyAvailable(\\\"home\\\");\\n            nodeCount = ns.hacknet.numNodes();\\n        }\\n\\n        for (let index = 0; index < nodeCount; ++index) {\\n            let nodeStats = ns.hacknet.getNodeStats(index);\\n\\n            if (nodeStats.level < levelCap && ns.hacknet.getLevelUpgradeCost(index, upgradeCount) / Math.abs(currentMoney) < upgradeCostThreshold) {\\n                ns.hacknet.upgradeLevel(index, upgradeCount);\\n                currentMoney = ns.getServerMoneyAvailable(\\\"home\\\");\\n            }\\n\\n            if (nodeStats.ram < ramCap && ns.hacknet.getRamUpgradeCost(index, upgradeCount) / Math.abs(currentMoney) < upgradeCostThreshold) {\\n                ns.hacknet.upgradeRam(index, upgradeCount);\\n                currentMoney = ns.getServerMoneyAvailable(\\\"home\\\");\\n            }\\n\\n            if (nodeStats.cores < coreCap && ns.hacknet.getCoreUpgradeCost(index, upgradeCount) / Math.abs(currentMoney) < upgradeCostThreshold) {\\n                ns.hacknet.upgradeCore(index, upgradeCount);\\n                currentMoney = ns.getServerMoneyAvailable(\\\"home\\\");\\n            }\\n        }\\n\\n        await ns.sleep(1000);\\n    }\\n}\",\"filename\":\"hacknet-bot.js\",\"server\":\"home\"}}],[\"kill-all-simple-hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nimport { EXCLUDE_SERVERS } from \\\"./constants.js\\\";\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n\\n    /**\\n     * Recursively kill simple-hack.js running on servers in the network\\n     * @async\\n     * @param {string} currentServer server to scan\\n     */\\n    function scanServer(currentServer, previousServer = currentServer) {\\n        let availableServers = ns.scan(currentServer);\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                if (EXCLUDE_SERVERS.indexOf(nextServer) == -1) ns.scriptKill('simple-hack.js', nextServer);\\n                scanServer(nextServer, currentServer);\\n            }\\n        }\\n    }\\n\\n    ns.tprint(`Running scan`);\\n    scanServer('home');\\n}\\n\",\"filename\":\"kill-all-simple-hack.js\",\"server\":\"home\"}}],[\"kill-hacknet.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n    \\n    ns.scriptKill('hacknet-bot.js', 'home');\\n}\",\"filename\":\"kill-hacknet.js\",\"server\":\"home\"}}],[\"hack-log.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"\",\"filename\":\"hack-log.js\",\"server\":\"home\"}}],[\"kill-nuke.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n    ns.scriptKill('auto-nuke.js', 'home');\\n}\",\"filename\":\"kill-nuke.js\",\"server\":\"home\"}}],[\"nuke-log.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"\",\"filename\":\"nuke-log.js\",\"server\":\"home\"}}],[\"grow-helper.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    // TODO: add increasing threshold if no servers lower than current threshold\\n    async function scanServer(currentServer, previousServer = currentServer) {\\n        let availableServers = ns.scan(currentServer);\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                let currentMoney = ns.getServerMoneyAvailable(nextServer);\\n                if (ns.hasRootAccess(nextServer) && currentMoney > 0) {\\n                    await ns.grow(nextServer);\\n                }\\n                await scanServer(nextServer, currentServer);\\n            }\\n        }\\n    }\\n\\n    while (true) {\\n        ns.print(`Running scan`);\\n        await scanServer('home');\\n        await ns.sleep(1000);\\n    }\\n}\",\"filename\":\"grow-helper.js\",\"server\":\"home\"}}],[\"buy-server.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n    \\n    let serverCost = ns.getPurchasedServerCost(16);\\n    let currentMoney = ns.get\\n    if(ns.getPurchasedServerCost(16)\\n}\",\"filename\":\"buy-server.js\",\"server\":\"home\"}}],[\"buy-grow-server.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    let serverCost = ns.getPurchasedServerCost(16);\\n    let currentMoney = ns.getServerMoneyAvailable('home');\\n\\n    if (serverCost < 0.1 * currentMoney) {\\n        let newServer = ns.purchaseServer('home', 16);\\n        if (newServer != '') {\\n            ns.tprint(`Bought a server`);\\n            ns.scp('grow-helper.js', newServer);\\n            let execExitCode = ns.exec('grow-helper.js', newServer, 5, 20);\\n            ns.tprint(`Exec 'grow-helper.js' exit code: ${execExitCode}`);\\n        }\\n    }\\n}\",\"filename\":\"buy-grow-server.js\",\"server\":\"home\"}}],[\"start-grow-helpers.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n    let script = 'grow-helper.js';\\n\\n\\n    let serverMaxRam = ns.getServerMaxRam(`home`);\\n    let serverUsedRam = ns.getServerUsedRam(`home`);\\n    let serverFreeRam = serverMaxRam - serverUsedRam;\\n    let scriptRam = ns.getScriptRam(script, `home`);\\n    let maxThreads = Math.floor(serverFreeRam / scriptRam);\\n    if (maxThreads > 0) ns.exec(script, `home`, maxThreads);\\n\\n    for (let server = 0; ns.serverExists(`home-${server}`); server++) {\\n        let serverMaxRam = ns.getServerMaxRam(`home-${server}`);\\n        let serverUsedRam = ns.getServerUsedRam(`home-${server}`);\\n        let serverFreeRam = serverMaxRam - serverUsedRam;\\n        let scriptRam = ns.getScriptRam(script, `home-${server}`);\\n        let maxThreads = Math.floor(serverFreeRam / scriptRam);\\n        ns.scp(script, `home-${server}`, 'home');\\n        ns.exec(script, `home-${server}`, maxThreads);\\n    }\\n}\",\"filename\":\"start-grow-helpers.js\",\"server\":\"home\"}}],[\"backdoor-command.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nconst doc = eval('document');\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    /**\\n     * Recursively kill simple-hack.js running on servers in the network\\n     * @async\\n     * @param {string} currentServer server to scan\\n     */\\n    function scanServer(currentServer, targetServer, previousServer = currentServer) {\\n        // ns.tprint(currentServer);\\n        if (currentServer == targetServer) {\\n            return [currentServer];\\n        } else {\\n            let availableServers = ns.scan(currentServer);\\n\\n            for (let i = 0; i < availableServers.length; ++i) {\\n                let nextServer = availableServers[i];\\n\\n                if (nextServer != currentServer && nextServer != previousServer) {\\n                    let result = scanServer(nextServer, targetServer, currentServer);\\n\\n                    if (result != null) {\\n                        return [currentServer].concat(result);\\n                    }\\n                }\\n            }\\n\\n            return null;\\n        }\\n    }\\n\\n    let targetPath = scanServer('home', ns.args[0]);\\n    ns.tprint(targetPath);\\n\\n    const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n    const handler = Object.keys(terminalInput)[1];\\n    let backdoorCommand = '';\\n\\n    for (let index = 1; index < targetPath.length; index++) {\\n        const server = targetPath[index];\\n\\n        backdoorCommand += `connect ${server}; `;\\n    }\\n\\n    // ns.tprint(backdoorCommand);\\n    terminalInput.value = backdoorCommand;\\n    terminalInput[handler].onChange({ target: terminalInput });\\n    terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n\\n    backdoorCommand = 'run BruteSSH.exe; ';\\n    backdoorCommand += 'run FTPCrack.exe; ';\\n    backdoorCommand += 'run relaySMTP.exe; ';\\n    backdoorCommand += 'run HTTPWorm.exe; ';\\n    backdoorCommand += 'run SQLInject.exe; ';\\n    backdoorCommand += 'run NUKE.exe; ';\\n    backdoorCommand += 'backdoor';\\n\\n    // ns.tprint(backdoorCommand);\\n    terminalInput.value = backdoorCommand;\\n    terminalInput[handler].onChange({ target: terminalInput });\\n    terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n}\",\"filename\":\"backdoor-command.js\",\"server\":\"home\"}}],[\"download-all-lit.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    function scanServer(currentServer, previousServer = currentServer) {\\n        // ns.tprint(currentServer);\\n        let availableServers = ns.scan(currentServer);\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                let litFiles = ns.ls(nextServer, 'lit');\\n                ns.tprint(`Download from '${nextServer}': ${litFiles}`);\\n                if (ns.args[0] && litFiles.length) {\\n                    ns.scp(litFiles, 'home', nextServer);\\n                }\\n\\n                scanServer(nextServer, currentServer);\\n            }\\n        }\\n    }\\n\\n    scanServer('home');\\n}\",\"filename\":\"download-all-lit.js\",\"server\":\"home\"}}],[\"constants.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport const EXCLUDE_SERVERS = [\\n    'home',\\n    'darkweb',\\n    'CSEC',\\n    'avmnite-02h',\\n    'I.I.I.I',\\n    'run4theh111z'\\n];\\n\\nexport const FACTION_SERVERS = [\\n    'CSEC',\\n    'avmnite-02h',\\n    'I.I.I.I',\\n    'run4theh111z'\\n];\\n\\nfor (let index = 0; index < 1024; index++) {\\n    EXCLUDE_SERVERS.push(`home-${index}`);\\n}\\n\\nexport const EXPLOITS = [\\n    { name: 'BruteSSH.exe', function: 'ns.brutessh' },\\n    { name: 'FTPCrack.exe', function: 'ns.ftpcrack' },\\n    { name: 'relaySMTP.exe', function: 'ns.relaysmtp' },\\n    { name: 'HTTPWorm.exe', function: 'ns.httpworm' },\\n    { name: 'SQLInject.exe', function: 'ns.sqlinject' },\\n];\\n\\nexport const DARKWEB_EXPLOITS = [\\n    { name: 'BruteSSH.exe', cost: 0 },\\n    { name: 'FTPCrack.exe', cost: 1500000 },\\n    { name: 'relaySMTP.exe', cost: 5000000 },\\n    { name: 'HTTPWorm.exe', cost: 30000000 },\\n    { name: 'SQLInject.exe', cost: 250000000 },\\n    { name: 'ServerProfiler.exe', cost: 500000 },\\n    { name: 'DeepscanV1.exe', cost: 500000 },\\n    { name: 'DeepscanV2.exe', cost: 25000000 },\\n    { name: 'AutoLink.exe', cost: 1000000 },\\n    { name: 'Formulas.exe', cost: 5000000000 }\\n];\\n\\n\\nconst COMPLETED_FACTIONS = [\\n    'CyberSec',\\n    'Tian Di Hui',\\n    'Netburners',\\n    //'Shadows of Anarchy',\\n    //'Sector-12',\\n    'Chongquing',\\n    'New Tokyo',\\n    'Ishima',\\n    'Aevum',\\n    'Volhaven',\\n    'NiteSec',\\n    'The Black Hand',\\n    //'BitRunners',\\n    //'ECorp',\\n    //'MegaCorp',\\n    //'KuaiGong International',\\n    //'Four Sigma',\\n    //'NWO',\\n    //'Blade Industries',\\n    //'OmniTek Incorporated',\\n    //'Bachman & Associates',\\n    //'Clarke Incorporated',\\n    //'Fulcrum Secret Technologies',\\n    //'Slum Snakes',\\n    //'Tetrads',\\n    //'Silhouette',\\n    //'Speakers for the Dead',\\n    //'The Dark Army',\\n    //'The Syndicate',\\n    //'The Covenant',\\n    //'Daedalus',\\n    //'Illuminati',\\n    //'',\\n];\",\"filename\":\"constants.js\",\"server\":\"home\"}}],[\"auto-nuke-v2.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\n\\n\\n/**\\n * loop\\n *  get all servers\\n *  nuke if possible\\n *      send scripts hack, grow weaken\\n *  buy grow servers\\n *  start helpers if not running include home //remove from hacknet\\n *      grow if needed\\n *      weaken if needed\\n *      hack if no grow or weaken\\n *  do simple hack\\n *      check if money available\\n *      check threads\\n *      run hack \\n *      run grow to recover\\n *      run weaken if security too high\\n *  buy hack tools\\n */\\n\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    async function writeLog(type, obj) {\\n        let timeNow = new Date();\\n        let year = timeNow.getFullYear().toString().substring(2);\\n        let month = (timeNow.getMonth() < 9 ? '0' : '') + (timeNow.getMonth() + 1);\\n        let day = (timeNow.getDate() < 10 ? '0' : '') + timeNow.getDate();\\n        let hour = (timeNow.getHours() < 10 ? '0' : '') + timeNow.getHours();\\n        let minute = (timeNow.getMinutes() < 10 ? '0' : '') + timeNow.getMinutes();\\n        let second = (timeNow.getSeconds() < 10 ? '0' : '') + timeNow.getSeconds();\\n        let timestamp = `${year}${month}${day}_${hour}${minute}${second}`;\\n        await ns.tryWritePort(2, `t${timestamp}_${type} = ${obj};\\\\n`);\\n\\n        if (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${timestamp} ${type} = ${obj}`);\\n    }\\n\\n    async function runHack(server) {\\n        let script = 'simple-hack.js';\\n\\n        let serverStatus = analyzeServer(server);\\n        await writeLog('ANALYZE', `{server: \\\"${server}\\\", status: ${JSON.stringify(serverStatus)}}`);\\n\\n        if (!serverStatus.rootAccess) {\\n            if (serverStatus.nukeAvailable) {\\n                await writeLog('NUKE', `\\\"Nuking ${server}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\\"`);\\n                for (let i = 0; i < maxPortsToHack(); ++i) {\\n                    switch (EXPLOITS[i]) {\\n                        case 'BruteSSH.exe':\\n                            ns.brutessh(server);\\n                            break;\\n\\n                        case 'FTPCrack.exe':\\n                            ns.ftpcrack(server);\\n                            break;\\n\\n                        case 'relaySMTP.exe':\\n                            ns.relaysmtp(server);\\n                            break;\\n\\n                        case 'HTTPWorm.exe':\\n                            ns.httpworm(server);\\n                            break;\\n\\n                        case 'SQLInject.exe':\\n                            ns.sqlinject(server);\\n                            break;\\n\\n                    }\\n                }\\n                ns.nuke(server);\\n            }\\n        }\\n\\n        serverStatus = analyzeServer(server);\\n\\n        if (serverStatus.rootAccess) {\\n            if (!ns.fileExists(script, 'home')) {\\n                await writeLog('ERROR', `\\\"Script '${script}' doesn't exist!\\\"`);\\n                // return -3;\\n            }\\n            ns.scp(script, server, 'home');\\n\\n            let serverMaxRam = ns.getServerMaxRam(server);\\n            let serverUsedRam = ns.getServerUsedRam(server);\\n            let serverFreeRam = serverMaxRam - serverUsedRam;\\n            let scriptRam = ns.getScriptRam(script, server);\\n            let maxThreads = Math.floor(serverFreeRam / scriptRam);\\n\\n            let a = ns.scriptRunning(script, server);\\n            if (!a) {\\n                if (maxThreads == 0) {\\n                    // await writeLog('ERROR', `\\\"Not enough ram to run '${script}' on '${server}', ${scriptRam}/${serverFreeRam}!\\\"`);\\n                    return -4;\\n                }\\n\\n                let execExitCode = ns.exec(script, server, maxThreads, server);\\n\\n                if (!execExitCode) {\\n                    // await writeLog('ERROR', `\\\"Exec error running script '${script} on '${server}!\\\"`);\\n                    return -5;\\n                }\\n                else {\\n                    return execExitCode;\\n                }\\n            } else {\\n                // await writeLog('ERROR', `\\\"Hack already running on ${server}\\\"`);\\n                return 0;\\n            }\\n        }\\n\\n        return -6;\\n    }\\n\\n    function scanServer(currentServer, previousServer = currentServer) {\\n        let availableServers = ns.scan(currentServer);\\n        let result = [];\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                result.concat(scanServer(nextServer, currentServer));\\n            }\\n        }\\n\\n        return [currentServer].concat(result);\\n    }\\n\\n    while (true) {\\n        let network = scanServer('home');\\n\\n        await ns.sleep(100);\\n    }\\n}\",\"filename\":\"auto-nuke-v2.js\",\"server\":\"home\"}}],[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home\"}}],[\"kill-all-grow-helpers.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n    ns.scriptKill('grow-helper.js', `home`);\\n\\n    for (let server = 0; ns.serverExists(`home-${server}`); server++) {\\n        ns.scriptKill('grow-helper.js', `home-${server}`);\\n    }\\n}\\n\\n\\n\\n\\n\",\"filename\":\"kill-all-grow-helpers.js\",\"server\":\"home\"}}],[\"scan-network.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nimport { EXCLUDE_SERVERS } from \\\"./constants.js\\\";\\n\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n\\n\\n    /**\\n     * Recursively kill simple-hack.js running on servers in the network\\n     * @async\\n     * @param {string} currentServer server to scan\\n     */\\n    function scanServer(currentServer, previousServer = currentServer, connectString = '', scanLevel = 0) {\\n        let availableServers = ns.scan(currentServer);\\n        let nextConnectString = connectString + `connect ${currentServer}; `;\\n        ns.tprint(`${'┃  '.repeat(scanLevel)}┣${currentServer}: ${nextConnectString}`);\\n        ns.write('scan.txt', `${'┃  '.repeat(scanLevel)}┣━${currentServer}: ${nextConnectString}`+'\\\\n', 'a');\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                scanServer(nextServer, currentServer, nextConnectString, scanLevel+1);\\n            }\\n        }\\n    }\\n\\n    ns.tprint(`Running scan`);\\n    ns.write('scan.txt', ``, 'w');\\n    scanServer('home');\\n}\\n\",\"filename\":\"scan-network.js\",\"server\":\"home\"}}],[\"connect-server.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nconst doc = eval('document');\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    /**\\n     * Recursively kill simple-hack.js running on servers in the network\\n     * @async\\n     * @param {string} currentServer server to scan\\n     */\\n    function scanServer(currentServer, targetServer, previousServer = currentServer) {\\n        // ns.tprint(currentServer);\\n        if (currentServer == targetServer) {\\n            return [currentServer];\\n        } else {\\n            let availableServers = ns.scan(currentServer);\\n\\n            for (let i = 0; i < availableServers.length; ++i) {\\n                let nextServer = availableServers[i];\\n\\n                if (nextServer != currentServer && nextServer != previousServer) {\\n                    let result = scanServer(nextServer, targetServer, currentServer);\\n\\n                    if (result != null) {\\n                        return [currentServer].concat(result);\\n                    }\\n                }\\n            }\\n\\n            return null;\\n        }\\n    }\\n\\n    let targetPath = scanServer('home', ns.args[0]);\\n    ns.tprint(targetPath);\\n\\n    const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n    const handler = Object.keys(terminalInput)[1];\\n    let backdoorCommand = '';\\n\\n    for (let index = 1; index < targetPath.length; index++) {\\n        const server = targetPath[index];\\n\\n        backdoorCommand += `connect ${server}; `;\\n    }\\n\\n    // ns.tprint(backdoorCommand);\\n    terminalInput.value = backdoorCommand;\\n    terminalInput[handler].onChange({ target: terminalInput });\\n    terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n\\n    // backdoorCommand = 'run BruteSSH.exe; ';\\n    // backdoorCommand += 'run FTPCrack.exe; ';\\n    // backdoorCommand += 'run relaySMTP.exe; ';\\n    // backdoorCommand += 'run HTTPWorm.exe; ';\\n    // backdoorCommand += 'run SQLInject.exe; ';\\n    // backdoorCommand += 'run NUKE.exe; ';\\n    // backdoorCommand += 'backdoor';\\n\\n    // ns.tprint(backdoorCommand);\\n    // terminalInput.value = backdoorCommand;\\n    // terminalInput[handler].onChange({ target: terminalInput });\\n    // terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n}\",\"filename\":\"connect-server.js\",\"server\":\"home\"}}],[\"backdoor-all.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nconst doc = eval('document');\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n    const handler = Object.keys(terminalInput)[1];\\n\\n    async function scanServer(currentServer, previousServer = currentServer, connectString = '', scanLevel = 0) {\\n        let availableServers = ns.scan(currentServer);\\n        let nextConnectString = connectString + `connect ${currentServer}; `;\\n\\n        let backdoorCommand = nextConnectString;\\n        backdoorCommand += 'run BruteSSH.exe; ';\\n        backdoorCommand += 'run FTPCrack.exe; ';\\n        backdoorCommand += 'run relaySMTP.exe; ';\\n        backdoorCommand += 'run HTTPWorm.exe; ';\\n        backdoorCommand += 'run SQLInject.exe; ';\\n        backdoorCommand += 'run NUKE.exe; ';\\n        backdoorCommand += 'backdoor';\\n\\n        terminalInput.value = backdoorCommand;\\n        terminalInput[handler].onChange({ target: terminalInput });\\n        terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n        await ns.sleep(60000)\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                await scanServer(nextServer, currentServer, nextConnectString, scanLevel + 1);\\n            }\\n        }\\n    }\\n    \\n    await scanServer('home');\\n    terminalInput.value = 'home';\\n    terminalInput[handler].onChange({ target: terminalInput });\\n    terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n}\",\"filename\":\"backdoor-all.js\",\"server\":\"home\"}}],[\"test.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"import { EXPLOITS } from \\\"./constants.js\\\"\\n\\n/** @param {import(\\\".\\\").NS } ns */\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    // function scanServer(currentServer, previousServer = currentServer) {\\n    //     let availableServers = ns.scan(currentServer);\\n    //     let result = [];\\n\\n    //     for (let i = 0; i < availableServers.length; ++i) {\\n    //         let nextServer = availableServers[i];\\n\\n    //         if (nextServer != currentServer && nextServer != previousServer) {\\n    //             result.concat(scanServer(nextServer, currentServer));\\n    //         }\\n    //     }\\n\\n    //     return [currentServer].concat(result);\\n    // }\\n\\n    function maxPortsToHack() {\\n        let maxPorts = 0;\\n        for (const exploit of EXPLOITS) {\\n            if (ns.fileExists(exploit.name)) ++maxPorts;\\n        }\\n        // ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);\\n        return maxPorts;\\n    }\\n\\n    function analyzeServer(server) {\\n        let requiredHacking = ns.getServerRequiredHackingLevel(server);\\n        let requiredPorts = ns.getServerNumPortsRequired(server);\\n        let currentHacking = ns.getHackingLevel();\\n\\n        return {\\n            \\\"name\\\": server,\\n            \\\"rootAccess\\\": ns.hasRootAccess(server),\\n            \\\"requiredHacking\\\": requiredHacking,\\n            \\\"requiredPorts\\\": requiredPorts,\\n            \\\"nukeAvailable\\\": (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts),\\n            \\\"currentMoney\\\": ns.getServerMoneyAvailable(server),\\n            \\\"maxMoney\\\": ns.getServerMaxMoney(server),\\n            \\\"currentSecurity\\\": ns.getServerSecurityLevel(server),\\n            \\\"minSecurity\\\": ns.getServerMinSecurityLevel(server),\\n        };\\n    }\\n\\n    function scanServer(currentServer, previousServer = currentServer, network = []) {\\n        let availableServers = ns.scan(currentServer);\\n        network.push(analyzeServer(currentServer));\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                scanServer(nextServer, currentServer, network);\\n            }\\n        }\\n        return network;\\n    }\\n\\n    let network = scanServer('home');\\nns.tprint(network[0])\\n    ns.as\\n}\",\"filename\":\"test.js\",\"server\":\"home\"}}],[\"document-bypass.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nconst doc = eval('document');\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n    const handler = Object.keys(terminalInput)[1];\\n\\n    terminalInput.value = \\\"COMMAND\\\";\\n    terminalInput[handler].onChange({ target: terminalInput });\\n    terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n}\",\"filename\":\"document-bypass.js\",\"server\":\"home\"}}],[\"auto-hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"import { EXPLOITS, DARKWEB_EXPLOITS } from \\\"./constants.js\\\";\\n\\n/**\\n * remove write log ✓\\n * loop\\n *  get all servers\\n *  nuke if possible\\n *      send scripts hack, grow weaken\\n *  backdoor factions\\n *  buy grow servers\\n *  start helpers if not running include home //remove from hacknet\\n *      grow if needed\\n *      weaken if needed\\n *      hack if no grow or weaken\\n *  do simple hack\\n *      check if money available\\n *      check threads\\n *      run hack \\n *      run grow to recover\\n *      run weaken if security too high\\n *  buy hack tools\\n */\\n\\n/** @param {import(\\\".\\\").NS } ns */\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n    const doc = eval('document');\\n\\n\\n    function terminalCommand(command) {\\n        const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n        if (terminalInput != null && terminalInput != undefined) {\\n            const handler = Object.keys(terminalInput)[1];\\n            terminalInput.value = command;\\n            terminalInput[handler].onChange({ target: terminalInput });\\n            terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n        }\\n    }\\n\\n    function maxPortsToHack() {\\n        let maxPorts = 0;\\n        EXPLOITS.forEach(exploit => {\\n            if (ns.fileExists(exploit.name)) ++maxPorts;\\n        });\\n        // ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);\\n        return maxPorts;\\n    }\\n    function analyzeServer(server) {\\n        let requiredHacking = ns.getServerRequiredHackingLevel(server);\\n        let requiredPorts = ns.getServerNumPortsRequired(server);\\n        let currentHacking = ns.getHackingLevel();\\n\\n        return {\\n            name: server,\\n            rootAccess: ns.hasRootAccess(server),\\n            requiredHacking: requiredHacking,\\n            requiredPorts: requiredPorts,\\n            nukeAvailable: (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts),\\n            currentMoney: ns.getServerMoneyAvailable(server),\\n            maxMoney: ns.getServerMaxMoney(server),\\n            currentSecurity: ns.getServerSecurityLevel(server),\\n            minSecurity: ns.getServerMinSecurityLevel(server),\\n            RAM: ns.getServerMaxRam(server),\\n        };\\n    }\\n\\n    function scanServer(currentServer, previousServer = currentServer, network = []) {\\n        let availableServers = ns.scan(currentServer);\\n        network.push(analyzeServer(currentServer));\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                scanServer(nextServer, currentServer, network);\\n            }\\n        }\\n        return network;\\n    }\\n\\n    // if new game, buy TOR router, start hack course\\n    if (ns.getHackingLevel() == 1) {\\n        let terminal;\\n        let city;\\n        let travel;\\n        for (const elem of doc.querySelectorAll('div.MuiDrawer-root.MuiDrawer-docked p')) {\\n            if (elem.textContent == 'Terminal') {\\n                terminal = elem;\\n            }\\n            if (elem.textContent == 'City') {\\n                city = elem;\\n            }\\n            if (elem.textContent == 'Travel') {\\n                travel = elem;\\n            }\\n        }\\n\\n        city.click(); await ns.sleep(200);\\n\\n        for (const alphaEnt of doc.querySelectorAll('div#root p')) {\\n            if (alphaEnt.textContent == '    o-----+---x----o 4        T [alpha ent.]     o-------o   /') {\\n                alphaEnt.querySelector('span').click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const TOR of doc.querySelectorAll('div#root button')) {\\n            if (TOR.textContent == 'Purchase TOR router - $200.000k') {\\n                TOR.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        travel.click(); await ns.sleep(200);\\n\\n        for (const aevum of doc.querySelectorAll('div#root span')) {\\n            if (aevum.textContent == 'A') {\\n                aevum.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const travelConfirm of doc.querySelectorAll('div[role=\\\"presentation\\\"] p')) {\\n            if (travelConfirm.textContent == 'Travel') {\\n                travelConfirm.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        try {\\n            doc.querySelector('div[role=\\\"presentation\\\"] button').click();\\n        } catch (error) {\\n\\n        }\\n\\n        city.click(); await ns.sleep(200);\\n\\n        for (const uni of doc.querySelectorAll('div#root span')) {\\n            if (uni.textContent == 'U') {\\n                uni.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const course of doc.querySelectorAll('div#root button')) {\\n            if (course.textContent == 'Take Algorithms course ($-1.280k / sec)' || course.textContent == 'Take Algorithms course($ - 960.000 / sec)') {\\n                course.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const closeCourse of doc.querySelectorAll('div#root button')) {\\n            if (closeCourse.textContent == 'Do something else simultaneously') {\\n                closeCourse.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n    }\\n\\n    let buyCounter = 120;\\n    let prevMaxMoneyHost = '';\\n    ns.write('autoHack.txt', '', 'w');\\n\\n    while (true) {\\n        // Buy all available exploits\\n        // if (buyCounter == 120) {\\n        //     terminalCommand(\\\"buyAll\\\");\\n        //     buyCounter = 0;\\n        // }\\n        // ++buyCounter;\\n\\n        // Buy more servers\\n        let serverRAM = 8;\\n        if (ns.getPurchasedServerCost(serverRAM) < ns.getServerMoneyAvailable('home') * 0.2) {\\n            ns.purchaseServer('home', serverRAM);\\n        }\\n\\n        // Upgrade RAM\\n        for (const server of ns.getPurchasedServers()) {\\n            const serverStats = analyzeServer(server);\\n            if (serverStats.RAM < 128) {\\n                if (ns.getPurchasedServerUpgradeCost(serverStats.name, serverStats.RAM * 2) < ns.getServerMoneyAvailable('home') * 0.2) {\\n                    ns.upgradePurchasedServer(serverStats.name, serverStats.RAM * 2);\\n                }\\n            }\\n        }\\n\\n        // Analyze all available hosts\\n        let network = scanServer('home');\\n\\n        // NUKE if possible\\n        for (let host of network) {\\n            ns.scp(['grow.js', 'weaken.js', 'hack.js'], host.name, 'home');\\n            if (!host.rootAccess && host.nukeAvailable) {\\n                for (const exploit of EXPLOITS) {\\n                    if (ns.fileExists(exploit.name)) eval(`${exploit.function}('${host.name}')`);\\n                }\\n                ns.nuke(host.name);\\n                host = analyzeServer(host.name);\\n            }\\n        }\\n\\n        // Find host with most money\\n        let maxMoneyHost = network[1];\\n        for (const host of network) {\\n            if (host.name != 'home' && host.rootAccess) {\\n                if (host.maxMoney > maxMoneyHost.maxMoney && host.currentMoney > 0 && host.requiredHacking < ns.getHackingLevel() / 3) {\\n                    maxMoneyHost = host;\\n                }\\n            }\\n        }\\n\\n        // clear log file if max money host changed\\n        if (maxMoneyHost.name != prevMaxMoneyHost) {\\n            ns.write('autoHackMax.txt', '', 'w');\\n            prevMaxMoneyHost = maxMoneyHost.name;\\n        }\\n\\n        //  TODO: convert to global RAM usage, steal 50%, regrow, weaken\\n\\n        // Hack servers\\n        for (let i = 1; i < network.length; i++) {\\n            const host = network[i];\\n            if (!ns.scriptRunning('grow.js', host.name) && !ns.scriptRunning('weaken.js', host.name) && !ns.scriptRunning('hack.js', host.name) && host.rootAccess && host.RAM > 0) {\\n                if (host.name != 'home' && host.currentMoney > 0) {\\n                    const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name);\\n                    const hackRAM = ns.getScriptRam('hack.js', host.name);\\n                    const growRAM = ns.getScriptRam('grow.js', host.name);\\n                    const weakenRAM = ns.getScriptRam('weaken.js', host.name);\\n                    const hackTime = ns.getHackTime(host.name);\\n                    const growTime = ns.getGrowTime(host.name);\\n                    const weakenTime = ns.getWeakenTime(host.name);\\n                    const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;\\n                    const hackAnalyze = ns.hackAnalyze(host.name);\\n                    const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(host.name, 1 + hackAnalyze));\\n\\n                    let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));\\n                    hackThreads = hackThreads == 0 ? 1 : hackThreads;\\n                    const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);\\n                    const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);\\n                    const weakenThreads = Math.floor(freeRAM / weakenRAM);\\n                    const log = `host:${host.name} target:${host.name} | security:${(host.currentSecurity / host.minSecurity * 100).toFixed(0)}% | money:${(host.currentMoney / host.maxMoney * 100).toFixed(0)}% | hThreads:${hackThreads} hTime:${((growTime * (growLoops - 1) + hackWait + hackTime) / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m`;\\n                    ns.print(log);\\n                    ns.write('autoHack.txt', log + '\\\\n', 'a');\\n\\n                    if (host.currentSecurity / host.minSecurity > 2) {\\n                        if (weakenThreads > 0) {\\n                            ns.exec('weaken.js', host.name, weakenThreads, host.name);\\n                        }\\n                    } else {\\n                        ns.exec('grow.js', host.name, growThreads, host.name, growLoops);\\n                        ns.exec('hack.js', host.name, hackThreads, host.name, growTime * (growLoops - 1) + hackWait);\\n                    }\\n                } else {\\n                    const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name) - (host.name == 'home' ? 1.8 : 0);\\n                    const hackRAM = ns.getScriptRam('hack.js', host.name);\\n                    const growRAM = ns.getScriptRam('grow.js', host.name);\\n                    const weakenRAM = ns.getScriptRam('weaken.js', host.name);\\n                    const hackTime = ns.getHackTime(maxMoneyHost.name);\\n                    const growTime = ns.getGrowTime(maxMoneyHost.name);\\n                    const weakenTime = ns.getWeakenTime(maxMoneyHost.name);\\n                    const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;\\n                    const hackAnalyze = ns.hackAnalyze(maxMoneyHost.name);\\n                    const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(maxMoneyHost.name, 1 + hackAnalyze));\\n\\n                    let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));\\n                    hackThreads = hackThreads == 0 ? 1 : hackThreads;\\n                    const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);\\n                    // ns.tprint(`Math.floor((${freeRAM} - ${hackThreads} * ${hackRAM}) / ${growRAM}) = ${growThreads}`);\\n                    const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);\\n                    const weakenThreads = Math.floor(freeRAM / weakenRAM);\\n                    const log = `host:${host.name} target:${maxMoneyHost.name} | security:${(maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity * 100).toFixed(0)}% | money:${(maxMoneyHost.currentMoney / maxMoneyHost.maxMoney * 100).toFixed(0)}% | hThreads:${hackThreads} hTime:${((growTime * (growLoops - 1) + hackWait + hackTime) / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m`; // | wThreads:${weakenThreads} wTime:${(weakenTime / 60000).toFixed(2)}m`;\\n                    ns.print(log);\\n                    ns.write('autoHackMax.txt', log + '\\\\n', 'a');\\n\\n                    // ns.tprint(`${maxMoneyHost.currentSecurity} / ${maxMoneyHost.minSecurity} > 5 = ${maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity > 5}`)\\n                    if (maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity > 5) {\\n                        if (weakenThreads > 0) {\\n                            ns.exec('weaken.js', host.name, weakenThreads, maxMoneyHost.name);\\n                        }\\n                    } else {\\n                        if (maxMoneyHost.currentMoney / maxMoneyHost.maxMoney < 0.2) {\\n                            ns.exec('grow.js', host.name, Math.floor(freeRAM / growRAM), maxMoneyHost.name);\\n                        } else {\\n                            ns.exec('grow.js', host.name, growThreads, maxMoneyHost.name, growLoops);\\n                            ns.exec('hack.js', host.name, hackThreads, maxMoneyHost.name, growTime * (growLoops - 1) + hackWait);\\n                        }\\n                    }\\n                }\\n            }\\n        }\\n\\n        // Sleep before next loop\\n        await ns.sleep(1000);\\n    }\\n}\",\"filename\":\"auto-hack.js\",\"server\":\"home\"}}],[\"start-hack-course.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"const doc = eval('document');\\n\\n/** @param {import(\\\".\\\").NS } ns */\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    // const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n    // const handler = Object.keys(terminalInput)[1];\\n\\n    // terminalInput.value = \\\"COMMAND\\\";\\n    // terminalInput[handler].onChange({ target: terminalInput });\\n    // terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n\\n    // const terminalButton = doc.querySelector();\\n    let terminal;\\n    let city;\\n    let travel;\\n    for (const elem of doc.querySelectorAll('div.MuiDrawer-root.MuiDrawer-docked p')) {\\n        if (elem.textContent == 'Terminal') {\\n            terminal = elem;\\n        }\\n        if (elem.textContent == 'City') {\\n            city = elem;\\n        }\\n        if (elem.textContent == 'Travel') {\\n            travel = elem;\\n        }\\n    }\\n\\n    city.click(); await ns.sleep(200);\\n\\n    for (const alphaEnt of doc.querySelectorAll('div#root p')) {\\n        if (alphaEnt.textContent == '    o-----+---x----o 4        T [alpha ent.]     o-------o   /') {\\n            alphaEnt.querySelector('span').click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    for (const TOR of doc.querySelectorAll('div#root button')) {\\n        if (TOR.textContent == '') {\\n            // TOR.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    travel.click(); await ns.sleep(200);\\n\\n    for (const aevum of doc.querySelectorAll('div#root span')) {\\n        if (aevum.textContent == 'A') {\\n            aevum.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    for (const travelConfirm of doc.querySelectorAll('div[role=\\\"presentation\\\"] p')) {\\n        if (travelConfirm.textContent == 'Travel') {\\n            travelConfirm.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    try {\\n        doc.querySelector('div[role=\\\"presentation\\\"] button').click();\\n    } catch (error) {\\n\\n    }\\n\\n    city.click(); await ns.sleep(200);\\n\\n    for (const uni of doc.querySelectorAll('div#root span')) {\\n        if (uni.textContent == 'U') {\\n            uni.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    for (const course of doc.querySelectorAll('div#root button')) {\\n        if (course.textContent == 'Take Algorithms course ($-1.280k / sec)') {\\n            course.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n\\n    for (const closeCourse of doc.querySelectorAll('div#root button')) {\\n        if (closeCourse.textContent == 'Do something else simultaneously') {\\n            closeCourse.click(); await ns.sleep(200);\\n            break;\\n        }\\n    }\\n    await ns.sleep(1000);\\n    terminal.click();\\n}\",\"filename\":\"start-hack-course.js\",\"server\":\"home\"}}],[\"alter-reality.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    \\n    ns.alterReality();\\n    ns.rainbow('noodles');\\n}\",\"filename\":\"alter-reality.js\",\"server\":\"home\"}}],[\"t2.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    import { EXPLOITS } from \\\"./constants.js\\\"\\n    /**\\n     * remove write log ✓\\n     * loop\\n     *  get all servers\\n     *  nuke if possible\\n     *      send scripts hack, grow weaken\\n     *  backdoor factions\\n     *  buy grow servers\\n     *  start helpers if not running include home //remove from hacknet\\n     *      grow if needed\\n     *      weaken if needed\\n     *      hack if no grow or weaken\\n     *  do simple hack\\n     *      check if money available\\n     *      check threads\\n     *      run hack \\n     *      run grow to recover\\n     *      run weaken if security too high\\n     *  buy hack tools\\n     */\\n\\n    // ns.disableLog('ALL');\\n\\n    ns.getServerSecurityLevel();\\n    function maxPortsToHack() {\\n        let maxPorts = 0;\\n        EXPLOITS.forEach(exploit => {\\n            if (ns.fileExists(exploit)) ++maxPorts;\\n        });\\n        // ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);\\n        return maxPorts;\\n    }\\n\\n    function analyzeServer(server) {\\n        let requiredHacking = ns.getServerRequiredHackingLevel(server);\\n        let requiredPorts = ns.getServerNumPortsRequired(server);\\n        let currentHacking = ns.getHackingLevel();\\n\\n        return {\\n            \\\"name\\\": server,\\n            \\\"rootAccess\\\": ns.hasRootAccess(server),\\n            \\\"requiredHacking\\\": requiredHacking,\\n            \\\"requiredPorts\\\": requiredPorts,\\n            \\\"nukeAvailable\\\": (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts),\\n            \\\"currentMoney\\\": ns.getServerMoneyAvailable(server),\\n            \\\"maxMoney\\\": ns.getServerMaxMoney(server),\\n            \\\"currentSecurity\\\": ns.getServerSecurityLevel(server),\\n            \\\"minSecurity\\\": ns.getServerMinSecurityLevel(server),\\n        };\\n    }\\n\\n    function scanServer(currentServer, previousServer = currentServer, network = []) {\\n        let availableServers = ns.scan(currentServer);\\n        network.push(analyzeServer(currentServer));\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                scanServer(nextServer, currentServer, network);\\n            }\\n        }\\n        return network;\\n    }\\n\\n    while (true) {\\n        // Analyze all available servers\\n        let network = scanServer('home');\\n\\n        // NUKE if possible\\n        for (const host of network) {\\n            if (host.nukeAvailable) {\\n                for (const exploit of EXPLOITS) {\\n                    if (ns.fileExists(exploit.name)) eval(`${exploit.function}(${host})`);\\n                }\\n                ns.nuke(host);\\n                ns.brutessh();\\n            }\\n        }\\n    }\\n}\",\"filename\":\"t2.js\",\"server\":\"home\"}}],[\"money-stats.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const doc = eval('document');\\n\\n    function numberToUnits(number) {\\n        let numberString = Math.floor(number);\\n        if (Math.abs(number) / 1000 >= 1) {\\n            numberString = Math.floor(number / 1000) + 'k';\\n        }\\n        if (Math.abs(number) / 1000000 >= 1) {\\n            numberString = Math.floor(number / 1000000) + 'm';\\n        }\\n        if (Math.abs(number) / 1000000000 >= 1) {\\n            numberString = Math.floor(number / 1000000000) + 'b';\\n        }\\n        if (Math.abs(number) / 1000000000000 >= 1) {\\n            numberString = Math.floor(number / 1000000000000) + 't';\\n        }\\n\\n        return numberString;\\n    }\\n\\n    let lastMoney = ns.getServerMoneyAvailable('home');\\n    let lastTime = Date.now();\\n    const firstMoney = ns.getServerMoneyAvailable('home');\\n    const firstTime = Date.now();\\n\\n    while (true) {\\n        const currentMoney = ns.getServerMoneyAvailable('home');\\n        const moneyDiff = currentMoney - lastMoney;\\n        const currentTime = Date.now();\\n        const timeDiff = (currentTime - lastTime) / 1000;\\n        const moneyPerSecond = moneyDiff / timeDiff;\\n        const moneyDiffLife = currentMoney - firstMoney;\\n        const timeDiffLife = (currentTime - firstTime) / 1000;\\n        const moneyPerSecondLife = moneyDiffLife / timeDiffLife;\\n        const moneyString = `${numberToUnits(Math.floor(moneyPerSecond))} | ${numberToUnits(Math.floor(moneyPerSecondLife))} $/s`;\\n        ns.print(`${lastMoney} ${currentMoney} ${moneyDiff} ${numberToUnits(Math.floor(moneyPerSecondLife)) }\\\\n ${currentTime} ${currentTime} ${timeDiff}`);\\n        doc.querySelector(\\\"#root > div.react-draggable > div.drag.MuiBox-root > div > p\\\").innerText = moneyString;\\n        ns.write('moneyStats.txt', moneyString+'\\\\n', 'a');\\n        lastMoney = currentMoney;\\n        lastTime = currentTime;\\n        await ns.sleep(5000);\\n    }\\n}\",\"filename\":\"money-stats.js\",\"server\":\"home\"}}],[\"exploits.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    ns.exploit();\\n    const doc = eval('document');\\n    ns.alterReality(); // breakpoint and change value\\n    ns.rainbow('noodles');\\n    window.performance.now = function () { return 0; };\\n    Number.prototype.toExponential = function () { return null; };\\n    doc.achievements.push(\\\"UNACHIEVABLE\\\");\\n    doc.getElementById('unclickable').style = \\\"display: block;position: absolute;top: 50%;left: 50%;width: 100px;height: 100px;z-index: 10000;background: red;\\\";\\n    doc.getElementById('unclickable').parentNode.addEventListener('click', () => {\\n        doc.getElementById('unclickable').style = \\\"display: none; visibility: hidden;\\\";\\n    }, true);\\n}\\n\",\"filename\":\"exploits.js\",\"server\":\"home\"}}],[\"open-devmenu.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"let getProps = (obj) => Object.entries(obj).find(entry => entry[0].startsWith(\\\"__reactProps\\\"))[1].children.props;\\nlet hasPlayer = (obj) => {\\n    try {\\n        return getProps(obj).player ? true : false;\\n    }\\n    catch (ex) {\\n        return false;\\n    }\\n};\\n\\n/** @param {NS} ns **/\\nexport async function main(ns) {\\n    let boxes = Array.from(eval(\\\"document\\\").querySelectorAll(\\\"[class*=MuiBox-root]\\\"));\\n    let box = boxes.find(x => hasPlayer(x));\\n\\n    if (box) {\\n        ns.tprintf(\\\"INFO className: \\\\\\\"\\\" + box.className + \\\"\\\\\\\"\\\");\\n\\n        let props = getProps(box);\\n\\n        // get a 10% cash bonus\\n        props.player.money = props.player.money * 1.1;\\n\\n        //  open dev menu\\n        props.router.toDevMenu();\\n    }\\n}\",\"filename\":\"open-devmenu.js\",\"server\":\"home\"}}],[\"auto-hack-v2.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"import { EXPLOITS, DARKWEB_EXPLOITS } from \\\"./constants.js\\\";\\n\\n/**\\n * remove write log ✓\\n * loop\\n *  get all servers\\n *  nuke if possible\\n *      send scripts hack, grow weaken\\n *  backdoor factions\\n *  buy grow servers\\n *  start helpers if not running include home //remove from hacknet\\n *      grow if needed\\n *      weaken if needed\\n *      hack if no grow or weaken\\n *  do simple hack\\n *      check if money available\\n *      check threads\\n *      run hack \\n *      run grow to recover\\n *      run weaken if security too high\\n *  buy hack tools\\n */\\n\\n/** @param {import(\\\"./index.js\\\").NS } ns */\\nexport async function main(ns) {\\n    ns.disableLog('ALL');\\n    const doc = eval('document');\\n\\n    const nodeCostThreshold = 0.2;\\n    const upgradeCostThreshold = 0.1;\\n    const upgradeCount = 1;\\n    const nodeCap = 24;\\n    const levelCap = 200;\\n    const ramCap = 64;\\n    const coreCap = 16;\\n\\n    const serverCostThreshold = 0.2;\\n    const serverMaxRAM = 128;\\n\\n\\n    const currentMoney = function () { return ns.getServerMoneyAvailable(\\\"home\\\"); };\\n    const currentHacking = function () { return ns.getHackingLevel(); };\\n\\n    function terminalCommand(command) {\\n        const terminalInput = doc.getElementById(\\\"terminal-input\\\");\\n        if (terminalInput != null && terminalInput != undefined) {\\n            const handler = Object.keys(terminalInput)[1];\\n            terminalInput.value = command;\\n            terminalInput[handler].onChange({ target: terminalInput });\\n            terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });\\n        }\\n    }\\n\\n    function maxPortsToHack() {\\n        let maxPorts = 0;\\n        EXPLOITS.forEach(exploit => {\\n            if (ns.fileExists(exploit.name)) ++maxPorts;\\n        });\\n        // ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);\\n        return maxPorts;\\n    }\\n\\n    function analyzeServer(server) {\\n        let requiredHacking = ns.getServerRequiredHackingLevel(server);\\n        let requiredPorts = ns.getServerNumPortsRequired(server);\\n\\n        return {\\n            name: server,\\n            rootAccess: ns.hasRootAccess(server),\\n            requiredHacking: requiredHacking,\\n            requiredPorts: requiredPorts,\\n            nukeAvailable: (currentHacking() >= requiredHacking && maxPortsToHack() >= requiredPorts),\\n            currentMoney: ns.getServerMoneyAvailable(server),\\n            maxMoney: ns.getServerMaxMoney(server),\\n            currentSecurity: ns.getServerSecurityLevel(server),\\n            minSecurity: ns.getServerMinSecurityLevel(server),\\n            RAM: ns.getServerMaxRam(server),\\n        };\\n    }\\n\\n    function scanServer(currentServer, previousServer = currentServer, network = []) {\\n        let availableServers = ns.scan(currentServer);\\n        network.push(analyzeServer(currentServer));\\n\\n        for (let i = 0; i < availableServers.length; ++i) {\\n            let nextServer = availableServers[i];\\n\\n            if (nextServer != currentServer && nextServer != previousServer) {\\n                scanServer(nextServer, currentServer, network);\\n            }\\n        }\\n        return network;\\n    }\\n\\n    function numberToUnits(number) {\\n        let numberString = Math.floor(number);\\n        if (Math.abs(number) / 1000 >= 1) {\\n            numberString = Math.floor(number / 1000) + 'k';\\n        }\\n        if (Math.abs(number) / 1000000 >= 1) {\\n            numberString = Math.floor(number / 1000000) + 'm';\\n        }\\n        if (Math.abs(number) / 1000000000 >= 1) {\\n            numberString = Math.floor(number / 1000000000) + 'b';\\n        }\\n        if (Math.abs(number) / 1000000000000 >= 1) {\\n            numberString = Math.floor(number / 1000000000000) + 't';\\n        }\\n\\n        return numberString;\\n    }\\n\\n    // if new game, buy TOR router, start hack course\\n    if (currentHacking() == 1) {\\n        let terminal;\\n        let city;\\n        let travel;\\n        for (const elem of doc.querySelectorAll('div.MuiDrawer-root.MuiDrawer-docked p')) {\\n            if (elem.textContent == 'Terminal') {\\n                terminal = elem;\\n            }\\n            if (elem.textContent == 'City') {\\n                city = elem;\\n            }\\n            if (elem.textContent == 'Travel') {\\n                travel = elem;\\n            }\\n        }\\n\\n        city.click(); await ns.sleep(200);\\n\\n        for (const alphaEnt of doc.querySelectorAll('div#root p')) {\\n            if (alphaEnt.textContent == '    o-----+---x----o 4        T [alpha ent.]     o-------o   /') {\\n                alphaEnt.querySelector('span').click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const TOR of doc.querySelectorAll('div#root button')) {\\n            if (TOR.textContent == 'Purchase TOR router - $200.000k') {\\n                TOR.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        travel.click(); await ns.sleep(200);\\n\\n        for (const aevum of doc.querySelectorAll('div#root span')) {\\n            if (aevum.textContent == 'A') {\\n                aevum.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const travelConfirm of doc.querySelectorAll('div[role=\\\"presentation\\\"] p')) {\\n            if (travelConfirm.textContent == 'Travel') {\\n                travelConfirm.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        try {\\n            doc.querySelector('div[role=\\\"presentation\\\"] button').click();\\n        } catch (error) {\\n\\n        }\\n\\n        city.click(); await ns.sleep(200);\\n\\n        for (const uni of doc.querySelectorAll('div#root span')) {\\n            if (uni.textContent == 'U') {\\n                uni.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const course of doc.querySelectorAll('div#root button')) {\\n            if (course.textContent == 'Take Algorithms course ($-1.280k / sec)' || course.textContent == 'Take Algorithms course($ - 960.000 / sec)') {\\n                course.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n\\n        for (const closeCourse of doc.querySelectorAll('div#root button')) {\\n            if (closeCourse.textContent == 'Do something else simultaneously') {\\n                closeCourse.click(); await ns.sleep(200);\\n                break;\\n            }\\n        }\\n    }\\n\\n    let prevMaxMoneyHost = '';\\n    ns.write('@autoHack.js', '', 'w');\\n    let lastMoney = ns.getServerMoneyAvailable('home');\\n    let lastTime = Date.now();\\n    const firstMoney = ns.getServerMoneyAvailable('home');\\n    const firstTime = Date.now();\\n\\n    while (true) {\\n        //\\n        // Money stats\\n        //\\n        const moneyDiff = currentMoney() - lastMoney;\\n        const currentTime = Date.now();\\n        const timeDiff = (currentTime - lastTime) / 1000;\\n        const moneyPerSecond = moneyDiff / timeDiff;\\n        const moneyDiffLife = currentMoney() - firstMoney;\\n        const timeDiffLife = (currentTime - firstTime) / 1000;\\n        const moneyPerSecondLife = moneyDiffLife / timeDiffLife;\\n        const moneyString = `${numberToUnits(Math.floor(moneyPerSecond))} | ${numberToUnits(Math.floor(moneyPerSecondLife))} $/s`;\\n        ns.print(`${lastMoney} ${currentMoney() } ${moneyDiff} ${numberToUnits(Math.floor(moneyPerSecondLife))}\\\\n ${currentTime} ${currentTime} ${timeDiff}`);\\n        doc.querySelector(\\\"#root > div.react-draggable > div.drag.MuiBox-root > div > p\\\").innerText = moneyString;\\n        ns.write('@moneyStats.js', moneyString + '\\\\n', 'a');\\n        lastMoney = currentMoney();\\n        lastTime = currentTime;\\n\\n        // \\n        // Hacknet\\n        // \\n        let nodeCount = ns.hacknet.numNodes();\\n\\n        if (nodeCount < nodeCap && ns.hacknet.getPurchaseNodeCost() < nodeCostThreshold * currentMoney()) {\\n            ns.hacknet.purchaseNode();\\n            nodeCount = ns.hacknet.numNodes();\\n        }\\n\\n        for (let index = 0; index < nodeCount; ++index) {\\n            let nodeStats = ns.hacknet.getNodeStats(index);\\n\\n            if (nodeStats.level < levelCap && ns.hacknet.getLevelUpgradeCost(index, upgradeCount) < upgradeCostThreshold * currentMoney()) {\\n                ns.hacknet.upgradeLevel(index, upgradeCount);\\n            }\\n\\n            if (nodeStats.ram < ramCap && ns.hacknet.getRamUpgradeCost(index, upgradeCount) < upgradeCostThreshold * currentMoney()) {\\n                ns.hacknet.upgradeRam(index, upgradeCount);\\n            }\\n\\n            if (nodeStats.cores < coreCap && ns.hacknet.getCoreUpgradeCost(index, upgradeCount) < upgradeCostThreshold * currentMoney()) {\\n                ns.hacknet.upgradeCore(index, upgradeCount);\\n            }\\n        }\\n\\n        // \\n        // Buy more servers\\n        // \\n        let serverRAM = 8;\\n        if (ns.getPurchasedServerCost(serverRAM) < ns.getServerMoneyAvailable('home') * nodeCostThreshold) {\\n            ns.purchaseServer('home', serverRAM);\\n        }\\n\\n        //\\n        // Upgrade RAM\\n        //\\n        for (const server of ns.getPurchasedServers()) {\\n            const serverStats = analyzeServer(server);\\n            if (serverStats.RAM < serverMaxRAM) {\\n                if (ns.getPurchasedServerUpgradeCost(serverStats.name, serverStats.RAM * 2) < ns.getServerMoneyAvailable('home') * upgradeCostThreshold) {\\n                    ns.upgradePurchasedServer(serverStats.name, serverStats.RAM * 2);\\n                }\\n            }\\n        }\\n\\n        //\\n        // Analyze all available hosts\\n        //\\n        let network = scanServer('home');\\n        network.sort((a, b) => b.maxMoney - a.maxMoney);\\n\\n        //\\n        // NUKE if possible\\n        //\\n        for (let host of network) {\\n            ns.scp(['grow.js', 'weaken.js', 'hack.js'], host.name, 'home');\\n            if (!host.rootAccess && host.nukeAvailable) {\\n                for (const exploit of EXPLOITS) {\\n                    if (ns.fileExists(exploit.name)) eval(`${exploit.function}('${host.name}')`);\\n                }\\n                ns.nuke(host.name);\\n                host = analyzeServer(host.name);\\n            }\\n        }\\n\\n        //\\n        // Backdoor factions\\n        //\\n        \\n        //  TODO: convert to global RAM usage, steal 50%, regrow, weaken\\n\\n        //\\n        // Hack servers\\n        //\\n        for (let i = 1; i < network.length; i++) {\\n            \\n        }\\n        //     const host = network[i];\\n        //     if (!ns.scriptRunning('grow.js', host.name) && !ns.scriptRunning('weaken.js', host.name) && !ns.scriptRunning('hack.js', host.name) && host.rootAccess && host.RAM > 0) {\\n        //         if (host.name != 'home' && host.currentMoney > 0) {\\n        //             const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name);\\n        //             const hackRAM = ns.getScriptRam('hack.js', host.name);\\n        //             const growRAM = ns.getScriptRam('grow.js', host.name);\\n        //             const weakenRAM = ns.getScriptRam('weaken.js', host.name);\\n        //             const hackTime = ns.getHackTime(host.name);\\n        //             const growTime = ns.getGrowTime(host.name);\\n        //             const weakenTime = ns.getWeakenTime(host.name);\\n        //             const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;\\n        //             const hackAnalyze = ns.hackAnalyze(host.name);\\n        //             const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(host.name, 1 + hackAnalyze));\\n\\n        //             let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));\\n        //             hackThreads = hackThreads == 0 ? 1 : hackThreads;\\n        //             const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);\\n        //             const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);\\n        //             const weakenThreads = Math.floor(freeRAM / weakenRAM);\\n        //             const log = `host:${host.name} target:${host.name} | security:${(host.currentSecurity / host.minSecurity * 100).toFixed(0)}% | money:${(host.currentMoney / host.maxMoney * 100).toFixed(0)}% | hThreads:${hackThreads} hTime:${((growTime * (growLoops - 1) + hackWait + hackTime) / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m`;\\n        //             ns.print(log);\\n        //             ns.write('@autoHack.js', log + '\\\\n', 'a');\\n\\n        //             if (host.currentSecurity / host.minSecurity > 2) {\\n        //                 if (weakenThreads > 0) {\\n        //                     ns.exec('weaken.js', host.name, weakenThreads, host.name);\\n        //                 }\\n        //             } else {\\n        //                 ns.exec('grow.js', host.name, growThreads, host.name, growLoops);\\n        //                 ns.exec('hack.js', host.name, hackThreads, host.name, growTime * (growLoops - 1) + hackWait);\\n        //             }\\n        //         } else {\\n        //             const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name) - (host.name == 'home' ? 1.8 : 0);\\n        //             const hackRAM = ns.getScriptRam('hack.js', host.name);\\n        //             const growRAM = ns.getScriptRam('grow.js', host.name);\\n        //             const weakenRAM = ns.getScriptRam('weaken.js', host.name);\\n        //             const hackTime = ns.getHackTime(maxMoneyHost.name);\\n        //             const growTime = ns.getGrowTime(maxMoneyHost.name);\\n        //             const weakenTime = ns.getWeakenTime(maxMoneyHost.name);\\n        //             const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;\\n        //             const hackAnalyze = ns.hackAnalyze(maxMoneyHost.name);\\n        //             const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(maxMoneyHost.name, 1 + hackAnalyze));\\n\\n        //             let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));\\n        //             hackThreads = hackThreads == 0 ? 1 : hackThreads;\\n        //             const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);\\n        //             // ns.tprint(`Math.floor((${freeRAM} - ${hackThreads} * ${hackRAM}) / ${growRAM}) = ${growThreads}`);\\n        //             const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);\\n        //             const weakenThreads = Math.floor(freeRAM / weakenRAM);\\n        //             const log = `host:${host.name} target:${maxMoneyHost.name} | security:${(maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity * 100).toFixed(0)}% | money:${(maxMoneyHost.currentMoney / maxMoneyHost.maxMoney * 100).toFixed(0)}% | hThreads:${hackThreads} hTime:${((growTime * (growLoops - 1) + hackWait + hackTime) / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m`; // | wThreads:${weakenThreads} wTime:${(weakenTime / 60000).toFixed(2)}m`;\\n        //             ns.print(log);\\n        //             ns.write('@autoHackMax.js', log + '\\\\n', 'a');\\n\\n        //             // ns.tprint(`${maxMoneyHost.currentSecurity} / ${maxMoneyHost.minSecurity} > 5 = ${maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity > 5}`)\\n        //             if (maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity > 5) {\\n        //                 if (weakenThreads > 0) {\\n        //                     ns.exec('weaken.js', host.name, weakenThreads, maxMoneyHost.name);\\n        //                 }\\n        //             } else {\\n        //                 if (maxMoneyHost.currentMoney / maxMoneyHost.maxMoney < 0.2) {\\n        //                     ns.exec('grow.js', host.name, Math.floor(freeRAM / growRAM), maxMoneyHost.name);\\n        //                 } else {\\n        //                     ns.exec('grow.js', host.name, growThreads, maxMoneyHost.name, growLoops);\\n        //                     ns.exec('hack.js', host.name, hackThreads, maxMoneyHost.name, growTime * (growLoops - 1) + hackWait);\\n        //                 }\\n        //             }\\n        //         }\\n        //     }\\n        // }\\n\\n        // Sleep before next loop\\n        await ns.sleep(1000);\\n    }\\n}\",\"filename\":\"auto-hack-v2.js\",\"server\":\"home\"}}],[\"autoHack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"\",\"filename\":\"autoHack.js\",\"server\":\"home\"}}],[\"@autoHack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"\",\"filename\":\"@autoHack.js\",\"server\":\"home\"}}],[\"@moneyStats.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"NaN | NaN $/s\\n9k | 9k $/s\\n11k | 10k $/s\\n9k | 10k $/s\\n9k | 10k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\nNaN | NaN $/s\\n9k | 9k $/s\\n8k | 8k $/s\\n11k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n11k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n9k | 9k $/s\\n\",\"filename\":\"@moneyStats.js\",\"server\":\"home\"}}]]},\"serversOnNetwork\":[\"n00dles\",\"foodnstuff\",\"sigma-cosmetics\",\"joesguns\",\"hong-fang-tea\",\"harakiri-sushi\",\"iron-gym\",\"home-0\",\"home-1\",\"home-2\",\"home-3\",\"home-4\",\"home-5\",\"home-6\",\"home-7\",\"home-8\",\"home-9\",\"home-10\",\"home-11\",\"home-12\",\"home-13\",\"home-14\",\"home-15\",\"home-16\",\"home-17\",\"home-18\",\"home-19\",\"home-20\",\"home-21\",\"home-22\",\"home-23\",\"home-24\",\"darkweb\"],\"smtpPortOpen\":true,\"sqlPortOpen\":true,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1.016,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":5,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"ecorp\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"ecorp\",\"httpPortOpen\":false,\"ip\":\"37.2.2.7\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"ECorp\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"ecorp\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"ecorp\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"ecorp\"}}]]},\"serversOnNetwork\":[\"clarkinc\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":99,\"hackDifficulty\":99,\"minDifficulty\":33,\"moneyAvailable\":27117986568,\"moneyMax\":101692449630,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1114,\"serverGrowth\":99,\"runningScripts\":[]}},\"megacorp\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"megacorp\",\"httpPortOpen\":false,\"ip\":\"52.3.4.0\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"MegaCorp\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"megacorp\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"megacorp\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"megacorp\"}}]]},\"serversOnNetwork\":[\"powerhouse-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":99,\"hackDifficulty\":99,\"minDifficulty\":33,\"moneyAvailable\":34353527811.75,\"moneyMax\":128825729294.0625,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1131,\"serverGrowth\":99,\"runningScripts\":[]}},\"b-and-a\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"b-and-a\",\"httpPortOpen\":false,\"ip\":\"67.0.0.5\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Bachman & Associates\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"b-and-a\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"b-and-a\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"b-and-a\"}}]]},\"serversOnNetwork\":[\"kuai-gong\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":80,\"hackDifficulty\":80,\"minDifficulty\":27,\"moneyAvailable\":21832493526.75,\"moneyMax\":81871850725.3125,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1108,\"serverGrowth\":63,\"runningScripts\":[]}},\"blade\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"blade\",\"httpPortOpen\":false,\"ip\":\"30.7.3.8\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[\"beyond-man.lit\"],\"organizationName\":\"Blade Industries\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"blade\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"blade\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"blade\"}}]]},\"serversOnNetwork\":[\"omnitek\",\"fulcrumassets\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":93,\"hackDifficulty\":93,\"minDifficulty\":31,\"moneyAvailable\":28371583718.25,\"moneyMax\":106393438943.4375,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":998,\"serverGrowth\":58,\"runningScripts\":[]}},\"nwo\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"nwo\",\"httpPortOpen\":false,\"ip\":\"76.5.5.6\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"the-hidden-world.lit\"],\"organizationName\":\"NWO\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"nwo\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"nwo\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"nwo\"}}]]},\"serversOnNetwork\":[\"kuai-gong\",\"The-Cave\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":99,\"hackDifficulty\":99,\"minDifficulty\":33,\"moneyAvailable\":18320950439.25,\"moneyMax\":68703564147.1875,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1282,\"serverGrowth\":81,\"runningScripts\":[]}},\"clarkinc\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"clarkinc\",\"httpPortOpen\":false,\"ip\":\"10.3.7.2\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"beyond-man.lit\",\"cost-of-immortality.lit\"],\"organizationName\":\"Clarke Incorporated\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"clarkinc\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"clarkinc\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"clarkinc\"}}]]},\"serversOnNetwork\":[\"omnitek\",\"ecorp\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":57,\"hackDifficulty\":57,\"minDifficulty\":19,\"moneyAvailable\":14888174838,\"moneyMax\":55830655642.5,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1067,\"serverGrowth\":72,\"runningScripts\":[]}},\"omnitek\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"omnitek\",\"httpPortOpen\":false,\"ip\":\"85.9.6.2\",\"isConnectedTo\":false,\"maxRam\":256,\"messages\":[\"coded-intelligence.lit\",\"history-of-synthoids.lit\"],\"organizationName\":\"OmniTek Incorporated\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"omnitek\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"omnitek\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"omnitek\"}}]]},\"serversOnNetwork\":[\"vitalife\",\"blade\",\"clarkinc\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":98,\"hackDifficulty\":98,\"minDifficulty\":33,\"moneyAvailable\":14000707092.75,\"moneyMax\":52502651597.8125,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":976,\"serverGrowth\":96,\"runningScripts\":[]}},\"4sigma\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"4sigma\",\"httpPortOpen\":false,\"ip\":\"41.9.5.3\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Four Sigma\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"4sigma\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"4sigma\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"4sigma\"}}]]},\"serversOnNetwork\":[\"stormtech\",\"powerhouse-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":55,\"hackDifficulty\":55,\"minDifficulty\":18,\"moneyAvailable\":13152616131,\"moneyMax\":49322310491.25,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":964,\"serverGrowth\":79,\"runningScripts\":[]}},\"kuai-gong\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"kuai-gong\",\"httpPortOpen\":false,\"ip\":\"79.4.5.4\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"KuaiGong International\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"kuai-gong\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"kuai-gong\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"kuai-gong\"}}]]},\"serversOnNetwork\":[\"helios\",\"b-and-a\",\"nwo\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":96,\"hackDifficulty\":96,\"minDifficulty\":32,\"moneyAvailable\":16964466944.25,\"moneyMax\":63616751040.9375,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1127,\"serverGrowth\":90,\"runningScripts\":[]}},\"fulcrumtech\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-722952-ECorp.cct\",\"type\":\"Compression III: LZ Compression\",\"data\":\"6C8wnnLRmnnLRmnnLRrRmnnLREnnLREnkqMmREnkqMmVEnlKLIo57KLIohhpZsohhpZsohhohhpZ1AiTMtAmUAiAiAiA\",\"reward\":{\"type\":2,\"name\":\"ECorp\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"fulcrumtech\",\"httpPortOpen\":false,\"ip\":\"23.6.1.2\",\"isConnectedTo\":false,\"maxRam\":512,\"messages\":[\"simulated-reality.lit\"],\"organizationName\":\"Fulcrum Technologies\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"fulcrumtech\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"fulcrumtech\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"fulcrumtech\"}}]]},\"serversOnNetwork\":[\"applied-energetics\",\".\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":87,\"hackDifficulty\":87,\"minDifficulty\":29,\"moneyAvailable\":1161479316,\"moneyMax\":4355547435,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1225,\"serverGrowth\":81,\"runningScripts\":[]}},\"fulcrumassets\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-839591.cct\",\"type\":\"Algorithmic Stock Trader IV\",\"data\":[2,[76,46,137,182,55,196,125,133,18,58]],\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"fulcrumassets\",\"httpPortOpen\":false,\"ip\":\"31.1.0.2\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Fulcrum Technologies\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"fulcrumassets\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"fulcrumassets\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"fulcrumassets\"}}]]},\"serversOnNetwork\":[\"blade\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":99,\"hackDifficulty\":99,\"minDifficulty\":33,\"moneyAvailable\":750000,\"moneyMax\":2812500,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1212,\"serverGrowth\":1,\"runningScripts\":[]}},\"stormtech\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"stormtech\",\"httpPortOpen\":false,\"ip\":\"9.0.7.8\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Storm Technologies\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"stormtech\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"stormtech\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"stormtech\"}}]]},\"serversOnNetwork\":[\"run4theh111z\",\"4sigma\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":90,\"hackDifficulty\":90,\"minDifficulty\":30,\"moneyAvailable\":838692279,\"moneyMax\":3145096046.25,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":988,\"serverGrowth\":73,\"runningScripts\":[]}},\"defcomm\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"defcomm\",\"httpPortOpen\":false,\"ip\":\"73.4.6.9\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"DefComm\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"defcomm\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"defcomm\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"defcomm\"}}]]},\"serversOnNetwork\":[\"omnia\",\"infocomm\",\"taiyang-digital\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":84,\"hackDifficulty\":84,\"minDifficulty\":28,\"moneyAvailable\":614039727,\"moneyMax\":2302648976.25,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":917,\"serverGrowth\":64,\"runningScripts\":[]}},\"infocomm\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-426685-NiteSec.cct\",\"type\":\"Spiralize Matrix\",\"data\":[[26,26,31,50,3,5],[39,3,12,39,45,48]],\"reward\":{\"type\":0,\"name\":\"NiteSec\"}}},{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-87438.cct\",\"type\":\"Array Jumping Game\",\"data\":[0,0,0,0,6,9,5,4,3,9,4,1,2,0,0,4,10,9,4,0,10,0,4],\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"infocomm\",\"httpPortOpen\":false,\"ip\":\"39.3.6.6\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"InfoComm\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"infocomm\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"infocomm\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"infocomm\"}}]]},\"serversOnNetwork\":[\"defcomm\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":76,\"hackDifficulty\":76,\"minDifficulty\":25,\"moneyAvailable\":564485515.5,\"moneyMax\":2116820683.125,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":913,\"serverGrowth\":64,\"runningScripts\":[]}},\"helios\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"helios\",\"httpPortOpen\":false,\"ip\":\"3.7.4.7\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"beyond-man.lit\"],\"organizationName\":\"Helios Labs\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"helios\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"helios\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"helios\"}}]]},\"serversOnNetwork\":[\"titan-labs\",\"kuai-gong\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":86,\"hackDifficulty\":86,\"minDifficulty\":29,\"moneyAvailable\":493832175,\"moneyMax\":1851870656.25,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":892,\"serverGrowth\":73,\"runningScripts\":[]}},\"vitalife\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"vitalife\",\"httpPortOpen\":false,\"ip\":\"7.1.2.2\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"A-Green-Tomorrow.lit\"],\"organizationName\":\"VitaLife\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"vitalife\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"vitalife\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"vitalife\"}}]]},\"serversOnNetwork\":[\"microdyne\",\"omnitek\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":82,\"hackDifficulty\":82,\"minDifficulty\":27,\"moneyAvailable\":559262904,\"moneyMax\":2097235890,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":785,\"serverGrowth\":79,\"runningScripts\":[]}},\"icarus\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"icarus\",\"httpPortOpen\":false,\"ip\":\"71.5.3.5\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Icarus Microsystems\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"icarus\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"icarus\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"icarus\"}}]]},\"serversOnNetwork\":[\"omnia\",\"zb-def\",\"nova-med\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":88,\"hackDifficulty\":88,\"minDifficulty\":29,\"moneyAvailable\":747386805.75,\"moneyMax\":2802700521.5625,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":896,\"serverGrowth\":91,\"runningScripts\":[]}},\"univ-energy\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"univ-energy\",\"httpPortOpen\":false,\"ip\":\"19.1.0.8\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Universal Energy\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"univ-energy\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"univ-energy\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"univ-energy\"}}]]},\"serversOnNetwork\":[\"deltaone\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":80,\"hackDifficulty\":80,\"minDifficulty\":27,\"moneyAvailable\":834869223.75,\"moneyMax\":3130759589.0625,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":860,\"serverGrowth\":82,\"runningScripts\":[]}},\"titan-labs\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"titan-labs\",\"httpPortOpen\":false,\"ip\":\"45.4.4.1\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[\"coded-intelligence.lit\"],\"organizationName\":\"Titan Laboratories\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"titan-labs\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"titan-labs\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"titan-labs\"}}]]},\"serversOnNetwork\":[\"zb-def\",\"helios\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":71,\"hackDifficulty\":71,\"minDifficulty\":24,\"moneyAvailable\":576242294.25,\"moneyMax\":2160908603.4375,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":821,\"serverGrowth\":60,\"runningScripts\":[]}},\"microdyne\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-905226.cct\",\"type\":\"Encryption II: Vigenère Cipher\",\"data\":[\"DEBUGPRINTFRAMEMOUSEQUEUE\",\"GRAPHICS\"],\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"microdyne\",\"httpPortOpen\":false,\"ip\":\"53.0.4.0\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"synthetic-muscles.lit\"],\"organizationName\":\"Microdyne Technologies\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"microdyne\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"microdyne\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"microdyne\"}}]]},\"serversOnNetwork\":[\"nova-med\",\"vitalife\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":67,\"hackDifficulty\":67,\"minDifficulty\":22,\"moneyAvailable\":400656040.5,\"moneyMax\":1502460151.875,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":869,\"serverGrowth\":77,\"runningScripts\":[]}},\"taiyang-digital\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-714734.cct\",\"type\":\"Sanitize Parentheses in Expression\",\"data\":\"((()(a)a())(((\",\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"taiyang-digital\",\"httpPortOpen\":false,\"ip\":\"29.5.7.2\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"A-Green-Tomorrow.lit\",\"brighter-than-the-sun.lit\"],\"organizationName\":\"Taiyang Digital\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"taiyang-digital\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"taiyang-digital\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"taiyang-digital\"}}]]},\"serversOnNetwork\":[\"defcomm\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":76,\"hackDifficulty\":76,\"minDifficulty\":25,\"moneyAvailable\":631895201.25,\"moneyMax\":2369607004.6875,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":928,\"serverGrowth\":80,\"runningScripts\":[]}},\"galactic-cyber\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"galactic-cyber\",\"httpPortOpen\":false,\"ip\":\"34.0.9.9\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Galactic Cybersystems\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"galactic-cyber\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"galactic-cyber\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"galactic-cyber\"}}]]},\"serversOnNetwork\":[\"millenium-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":56,\"hackDifficulty\":56,\"minDifficulty\":19,\"moneyAvailable\":618700419,\"moneyMax\":2320126571.25,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":873,\"serverGrowth\":77,\"runningScripts\":[]}},\"aerocorp\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-681374.cct\",\"type\":\"Array Jumping Game II\",\"data\":[4,0,4,1,3,3,4,0,1,2,2,3,2,2,4,1],\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"aerocorp\",\"httpPortOpen\":false,\"ip\":\"80.0.9.6\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"man-and-machine.lit\"],\"organizationName\":\"AeroCorp\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"aerocorp\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"aerocorp\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"aerocorp\"}}]]},\"serversOnNetwork\":[\"lexo-corp\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":82,\"hackDifficulty\":82,\"minDifficulty\":27,\"moneyAvailable\":872284149.75,\"moneyMax\":3271065561.5625,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":889,\"serverGrowth\":63,\"runningScripts\":[]}},\"omnia\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-314485.cct\",\"type\":\"Compression II: LZ Decompression\",\"data\":\"962hYy3Qox419ztto6gDbk06Vlh8Fe1471O6QlGn164uk6j472Qx347sFHukTA626byhhhT\",\"reward\":{\"type\":3}}},{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-377079-ECorp.cct\",\"type\":\"Compression I: RLE Compression\",\"data\":\"MMPP000000000PPWS0055555555BBBBBBBBBBBBByyyyyyyyyyyoLL0000000000000QQQQQ\",\"reward\":{\"type\":2,\"name\":\"ECorp\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"omnia\",\"httpPortOpen\":false,\"ip\":\"86.6.9.4\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"history-of-synthoids.lit\"],\"organizationName\":\"Omnia Cybersystems\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"omnia\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"omnia\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"omnia\"}}]]},\"serversOnNetwork\":[\"global-pharm\",\"defcomm\",\"icarus\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":94,\"hackDifficulty\":94,\"minDifficulty\":31,\"moneyAvailable\":736733211.75,\"moneyMax\":2762749544.0625,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":927,\"serverGrowth\":66,\"runningScripts\":[]}},\"zb-def\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"zb-def\",\"httpPortOpen\":false,\"ip\":\"17.5.0.8\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"synthetic-muscles.lit\"],\"organizationName\":\"ZB Defense Industries\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"zb-def\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"zb-def\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"zb-def\"}}]]},\"serversOnNetwork\":[\"icarus\",\"titan-labs\",\"run4theh111z\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":63,\"hackDifficulty\":63,\"minDifficulty\":21,\"moneyAvailable\":808846318.5,\"moneyMax\":3033173694.375,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":775,\"serverGrowth\":70,\"runningScripts\":[]}},\"applied-energetics\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"applied-energetics\",\"httpPortOpen\":false,\"ip\":\"18.6.0.1\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Applied Energetics\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"applied-energetics\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"applied-energetics\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"applied-energetics\"}}]]},\"serversOnNetwork\":[\"nova-med\",\"fulcrumtech\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":63,\"hackDifficulty\":63,\"minDifficulty\":21,\"moneyAvailable\":586209792,\"moneyMax\":2198286720,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":809,\"serverGrowth\":74,\"runningScripts\":[]}},\"solaris\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"solaris\",\"httpPortOpen\":false,\"ip\":\"6.7.9.3\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[\"A-Green-Tomorrow.lit\",\"the-failed-frontier.lit\"],\"organizationName\":\"Solaris Space Systems\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"solaris\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"solaris\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"solaris\"}}]]},\"serversOnNetwork\":[\"deltaone\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":71,\"hackDifficulty\":71,\"minDifficulty\":24,\"moneyAvailable\":570647094.75,\"moneyMax\":2139926605.3125,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":841,\"serverGrowth\":71,\"runningScripts\":[]}},\"deltaone\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"deltaone\",\"httpPortOpen\":false,\"ip\":\"75.5.9.5\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"DeltaOne\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"deltaone\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"deltaone\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"deltaone\"}}]]},\"serversOnNetwork\":[\"snap-fitness\",\"univ-energy\",\"solaris\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":81,\"hackDifficulty\":81,\"minDifficulty\":27,\"moneyAvailable\":1012055004.75,\"moneyMax\":3795206267.8125,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":888,\"serverGrowth\":56,\"runningScripts\":[]}},\"global-pharm\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"global-pharm\",\"httpPortOpen\":false,\"ip\":\"14.5.8.1\",\"isConnectedTo\":false,\"maxRam\":8,\"messages\":[\"A-Green-Tomorrow.lit\"],\"organizationName\":\"Global Pharmaceuticals\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"global-pharm\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"global-pharm\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"global-pharm\"}}]]},\"serversOnNetwork\":[\"millenium-fitness\",\"omnia\",\"unitalife\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":77,\"hackDifficulty\":77,\"minDifficulty\":26,\"moneyAvailable\":1306143917.25,\"moneyMax\":4898039689.6875,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":771,\"serverGrowth\":80,\"runningScripts\":[]}},\"nova-med\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-376922-CyberSec.cct\",\"type\":\"Generate IP Addresses\",\"data\":\"1472587215\",\"reward\":{\"type\":0,\"name\":\"CyberSec\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"nova-med\",\"httpPortOpen\":false,\"ip\":\"91.2.3.3\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Nova Medical\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"nova-med\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"nova-med\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"nova-med\"}}]]},\"serversOnNetwork\":[\"icarus\",\"microdyne\",\"applied-energetics\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":71,\"hackDifficulty\":71,\"minDifficulty\":24,\"moneyAvailable\":863270945.25,\"moneyMax\":3237266044.6875,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":848,\"serverGrowth\":85,\"runningScripts\":[]}},\"zeus-med\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"zeus-med\",\"httpPortOpen\":false,\"ip\":\"13.0.7.2\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Zeus Medical\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"zeus-med\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"zeus-med\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"zeus-med\"}}]]},\"serversOnNetwork\":[\"unitalife\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":88,\"hackDifficulty\":88,\"minDifficulty\":29,\"moneyAvailable\":1011387250.5,\"moneyMax\":3792702189.375,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":826,\"serverGrowth\":70,\"runningScripts\":[]}},\"unitalife\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"unitalife\",\"httpPortOpen\":false,\"ip\":\"65.9.1.8\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[],\"organizationName\":\"UnitaLife Group\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"unitalife\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"unitalife\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"unitalife\"}}]]},\"serversOnNetwork\":[\"global-pharm\",\"zeus-med\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":77,\"hackDifficulty\":77,\"minDifficulty\":26,\"moneyAvailable\":781302536.25,\"moneyMax\":2929884510.9375,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":823,\"serverGrowth\":78,\"runningScripts\":[]}},\"lexo-corp\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"lexo-corp\",\"httpPortOpen\":false,\"ip\":\"30.9.8.7\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"LexoCorp\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"lexo-corp\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"lexo-corp\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"lexo-corp\"}}]]},\"serversOnNetwork\":[\"I.I.I.I\",\"aerocorp\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":66,\"hackDifficulty\":66,\"minDifficulty\":22,\"moneyAvailable\":583017741.75,\"moneyMax\":2186316531.5625,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":706,\"serverGrowth\":58,\"runningScripts\":[]}},\"rho-construction\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"rho-construction\",\"httpPortOpen\":false,\"ip\":\"65.6.0.2\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Rho Construction\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"rho-construction\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"rho-construction\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"rho-construction\"}}]]},\"serversOnNetwork\":[\"summit-uni\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":50,\"hackDifficulty\":50,\"minDifficulty\":17,\"moneyAvailable\":466613980.5,\"moneyMax\":1749802426.875,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":513,\"serverGrowth\":59,\"runningScripts\":[]}},\"alpha-ent\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"alpha-ent\",\"httpPortOpen\":false,\"ip\":\"5.3.4.1\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[\"sector-12-crime.lit\"],\"organizationName\":\"Alpha Enterprises\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"alpha-ent\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"alpha-ent\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"alpha-ent\"}}]]},\"serversOnNetwork\":[\"catalyst\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":52,\"hackDifficulty\":52,\"minDifficulty\":17,\"moneyAvailable\":527584344,\"moneyMax\":1978441290,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":574,\"serverGrowth\":56,\"runningScripts\":[]}},\"aevum-police\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"aevum-police\",\"httpPortOpen\":false,\"ip\":\"19.7.5.3\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Aevum Police Headquarters\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"aevum-police\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"aevum-police\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"aevum-police\"}}]]},\"serversOnNetwork\":[\"catalyst\",\"snap-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":73,\"hackDifficulty\":73,\"minDifficulty\":24,\"moneyAvailable\":267073499.25,\"moneyMax\":1001525622.1875,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":438,\"serverGrowth\":30,\"runningScripts\":[]}},\"rothman-uni\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-501889-ECorp.cct\",\"type\":\"Algorithmic Stock Trader IV\",\"data\":[2,[156,196,183,190,127,15,51,13,40,100,90,121,22,89,155,76,113,38,99,102,179]],\"reward\":{\"type\":2,\"name\":\"ECorp\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"rothman-uni\",\"httpPortOpen\":false,\"ip\":\"62.3.4.0\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"secret-societies.lit\",\"the-failed-frontier.lit\",\"tensions-in-tech-race.lit\"],\"organizationName\":\"Rothman University\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"rothman-uni\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"rothman-uni\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"rothman-uni\"}}]]},\"serversOnNetwork\":[\"the-hub\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":46,\"hackDifficulty\":46,\"minDifficulty\":15,\"moneyAvailable\":161888633.25,\"moneyMax\":607082374.6875,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":410,\"serverGrowth\":45,\"runningScripts\":[]}},\"zb-institute\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-96108.cct\",\"type\":\"Proper 2-Coloring of a Graph\",\"data\":[12,[[4,7],[4,10],[2,5],[4,10],[6,7],[1,10],[0,11],[3,10],[0,10],[5,6],[3,9],[1,5],[4,5],[8,11],[3,5],[8,9]]],\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"zb-institute\",\"httpPortOpen\":false,\"ip\":\"72.7.5.8\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"ZB Institute of Technology\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"zb-institute\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"zb-institute\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"zb-institute\"}}]]},\"serversOnNetwork\":[\"netlink\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":68,\"hackDifficulty\":68,\"minDifficulty\":23,\"moneyAvailable\":765011067.75,\"moneyMax\":2868791504.0625,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":725,\"serverGrowth\":81,\"runningScripts\":[]}},\"summit-uni\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-170546.cct\",\"type\":\"Algorithmic Stock Trader I\",\"data\":[78,117,28,56,185,95,179,160,99,148,37,64,84,174,145,137,26,113,129,117,110,102,61,11,198,114,42,185,123,101,140,19,167,16,107,66,29,32,187,32,20,196,117,154,187,172,54,96,51],\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"summit-uni\",\"httpPortOpen\":false,\"ip\":\"78.4.6.8\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[\"secret-societies.lit\",\"the-failed-frontier.lit\",\"synthetic-muscles.lit\"],\"organizationName\":\"Summit University\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"summit-uni\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"summit-uni\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"summit-uni\"}}]]},\"serversOnNetwork\":[\"the-hub\",\"rho-construction\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":51,\"hackDifficulty\":51,\"minDifficulty\":17,\"moneyAvailable\":236036371.5,\"moneyMax\":885136393.125,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":464,\"serverGrowth\":45,\"runningScripts\":[]}},\"syscore\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-973271.cct\",\"type\":\"Find All Valid Math Expressions\",\"data\":[\"6822918920\",92],\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"syscore\",\"httpPortOpen\":false,\"ip\":\"75.6.9.2\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"SysCore Securities\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"syscore\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"syscore\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"syscore\"}}]]},\"serversOnNetwork\":[\"the-hub\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":72,\"hackDifficulty\":72,\"minDifficulty\":24,\"moneyAvailable\":443104473,\"moneyMax\":1661641773.75,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":631,\"serverGrowth\":66,\"runningScripts\":[]}},\"catalyst\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"catalyst\",\"httpPortOpen\":false,\"ip\":\"74.0.6.1\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[\"tensions-in-tech-race.lit\"],\"organizationName\":\"Catalyst Ventures\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"catalyst\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"catalyst\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"catalyst\"}}]]},\"serversOnNetwork\":[\"the-hub\",\"alpha-ent\",\"aevum-police\",\"millenium-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":64,\"hackDifficulty\":64,\"minDifficulty\":21,\"moneyAvailable\":251778954,\"moneyMax\":944171077.5,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":431,\"serverGrowth\":38,\"runningScripts\":[]}},\"the-hub\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-467746.cct\",\"type\":\"HammingCodes: Integer to Encoded Binary\",\"data\":585114311,\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"the-hub\",\"httpPortOpen\":false,\"ip\":\"71.1.8.2\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"The Hub\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"the-hub\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"the-hub\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"the-hub\"}}]]},\"serversOnNetwork\":[\"neo-net\",\"rothman-uni\",\"summit-uni\",\"syscore\",\"catalyst\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":35,\"hackDifficulty\":23.977999999999987,\"minDifficulty\":12,\"moneyAvailable\":145414609.04785904,\"moneyMax\":529035797.8125,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":278,\"serverGrowth\":46,\"runningScripts\":[]}},\"computek\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"computek\",\"httpPortOpen\":true,\"ip\":\"10.8.0.9\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"man-and-machine.lit\"],\"organizationName\":\"CompuTek\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"computek\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"computek\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"computek\"}}]]},\"serversOnNetwork\":[\"neo-net\"],\"smtpPortOpen\":true,\"sqlPortOpen\":true,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":58,\"hackDifficulty\":58,\"minDifficulty\":19,\"moneyAvailable\":182807777.25,\"moneyMax\":685529164.6875,\"numOpenPortsRequired\":3,\"openPortCount\":5,\"requiredHackingSkill\":336,\"serverGrowth\":65,\"runningScripts\":[]}},\"netlink\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"netlink\",\"httpPortOpen\":false,\"ip\":\"34.0.6.5\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[\"simulated-reality.lit\"],\"organizationName\":\"NetLink Technologies\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"netlink\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"netlink\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"netlink\"}}]]},\"serversOnNetwork\":[\"silver-helix\",\"zb-institute\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":80,\"hackDifficulty\":80,\"minDifficulty\":27,\"moneyAvailable\":206250000,\"moneyMax\":773437500,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":377,\"serverGrowth\":62,\"runningScripts\":[]}},\"johnson-ortho\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"johnson-ortho\",\"httpPortOpen\":false,\"ip\":\"77.3.4.3\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Johnson Orthopedics\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"johnson-ortho\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"johnson-ortho\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"johnson-ortho\"}}]]},\"serversOnNetwork\":[\"omega-net\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":39,\"hackDifficulty\":39,\"minDifficulty\":13,\"moneyAvailable\":57851335.5,\"moneyMax\":216942508.125,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":256,\"serverGrowth\":53,\"runningScripts\":[]}},\"n00dles\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"n00dles\",\"httpPortOpen\":false,\"ip\":\"91.7.8.0\",\"isConnectedTo\":false,\"maxRam\":4,\"messages\":[],\"organizationName\":\"Noodle Bar\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"n00dles\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"n00dles\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"n00dles\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":2.0039999999999805,\"minDifficulty\":1,\"moneyAvailable\":196667.3446118384,\"moneyMax\":196875,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":3000,\"runningScripts\":[]}},\"foodnstuff\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"foodnstuff\",\"httpPortOpen\":false,\"ip\":\"66.4.7.2\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[\"sector-12-crime.lit\"],\"organizationName\":\"FoodNStuff\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"foodnstuff\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"foodnstuff\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"foodnstuff\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":10,\"hackDifficulty\":5.607999999999198,\"minDifficulty\":3,\"moneyAvailable\":5619285.1828725,\"moneyMax\":5625000,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":5,\"runningScripts\":[]}},\"sigma-cosmetics\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"sigma-cosmetics\",\"httpPortOpen\":false,\"ip\":\"66.9.1.3\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Sigma Cosmetics\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"sigma-cosmetics\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"sigma-cosmetics\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"sigma-cosmetics\"}}]]},\"serversOnNetwork\":[\"home\",\"nectar-net\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":10,\"hackDifficulty\":5.7119999999981275,\"minDifficulty\":3,\"moneyAvailable\":6455776.431848685,\"moneyMax\":6468750,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":5,\"serverGrowth\":10,\"runningScripts\":[]}},\"joesguns\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-575337.cct\",\"type\":\"Find All Valid Math Expressions\",\"data\":[\"76674\",70],\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"joesguns\",\"httpPortOpen\":false,\"ip\":\"27.7.9.5\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Joe's Guns\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"joesguns\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"joesguns\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"joesguns\"}}]]},\"serversOnNetwork\":[\"home\",\"max-hardware\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":15,\"hackDifficulty\":9.77399999999988,\"minDifficulty\":5,\"moneyAvailable\":7011313.070444653,\"moneyMax\":7031250,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":10,\"serverGrowth\":20,\"runningScripts\":[]}},\"zer0\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"zer0\",\"httpPortOpen\":false,\"ip\":\"44.9.3.0\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"ZER0 Nightclub\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"zer0\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"zer0\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"zer0\"}}]]},\"serversOnNetwork\":[\"hong-fang-tea\",\"neo-net\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":25,\"hackDifficulty\":15.30400000000011,\"minDifficulty\":8,\"moneyAvailable\":20958776.370191053,\"moneyMax\":21093750,\"numOpenPortsRequired\":1,\"openPortCount\":1,\"requiredHackingSkill\":75,\"serverGrowth\":40,\"runningScripts\":[]}},\"nectar-net\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"nectar-net\",\"httpPortOpen\":false,\"ip\":\"90.1.0.4\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"Nectar Nightclub Network\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"nectar-net\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"nectar-net\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"nectar-net\"}}]]},\"serversOnNetwork\":[\"sigma-cosmetics\",\"omega-net\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":20,\"hackDifficulty\":13.611999999999592,\"minDifficulty\":7,\"moneyAvailable\":7714019.326911355,\"moneyMax\":7734375,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":20,\"serverGrowth\":25,\"runningScripts\":[]}},\"neo-net\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"neo-net\",\"httpPortOpen\":false,\"ip\":\"81.6.8.6\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[\"the-hidden-world.lit\"],\"organizationName\":\"Neo Nightclub Network\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"neo-net\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"neo-net\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"neo-net\"}}]]},\"serversOnNetwork\":[\"zer0\",\"the-hub\",\"computek\",\"avmnite-02h\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":25,\"hackDifficulty\":15.296000000000204,\"minDifficulty\":8,\"moneyAvailable\":13996786.096180951,\"moneyMax\":14062500,\"numOpenPortsRequired\":1,\"openPortCount\":1,\"requiredHackingSkill\":50,\"serverGrowth\":25,\"runningScripts\":[]}},\"silver-helix\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"silver-helix\",\"httpPortOpen\":false,\"ip\":\"70.3.9.2\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"new-triads.lit\"],\"organizationName\":\"Silver Helix\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"silver-helix\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"silver-helix\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"silver-helix\"}}]]},\"serversOnNetwork\":[\"CSEC\",\"netlink\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":30,\"hackDifficulty\":18.752000000000233,\"minDifficulty\":10,\"moneyAvailable\":74539006.55733177,\"moneyMax\":126562500,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":150,\"serverGrowth\":30,\"runningScripts\":[]}},\"hong-fang-tea\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-432413-ECorp.cct\",\"type\":\"Encryption II: Vigenère Cipher\",\"data\":[\"SHIFTMACRODEBUGSHELLCACHE\",\"GIGABYTE\"],\"reward\":{\"type\":2,\"name\":\"ECorp\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"hong-fang-tea\",\"httpPortOpen\":false,\"ip\":\"84.1.7.5\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[\"brighter-than-the-sun.lit\"],\"organizationName\":\"HongFang Teahouse\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"hong-fang-tea\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"hong-fang-tea\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"hong-fang-tea\"}}]]},\"serversOnNetwork\":[\"home\",\"zer0\",\"CSEC\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":15,\"hackDifficulty\":10.01799999999973,\"minDifficulty\":5,\"moneyAvailable\":8415099.683264354,\"moneyMax\":8437500,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":30,\"serverGrowth\":20,\"runningScripts\":[]}},\"harakiri-sushi\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-789629-CyberSec.cct\",\"type\":\"Compression I: RLE Compression\",\"data\":\"SSSSSSSSvddWWWWWWWWWWWWWYYTTTTTTTTTTTGFF33666664RRRRRRRRRROpppppppppprwwwwwwwwwwwwwwCCf\",\"reward\":{\"type\":0,\"name\":\"CyberSec\"}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"harakiri-sushi\",\"httpPortOpen\":false,\"ip\":\"46.8.2.3\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\"HaraKiri Sushi Bar Network\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"harakiri-sushi\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"harakiri-sushi\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"harakiri-sushi\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":15,\"hackDifficulty\":9.915999999999409,\"minDifficulty\":5,\"moneyAvailable\":11211429.84938478,\"moneyMax\":11250000,\"numOpenPortsRequired\":0,\"openPortCount\":0,\"requiredHackingSkill\":40,\"serverGrowth\":40,\"runningScripts\":[]}},\"phantasy\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-425294.cct\",\"type\":\"Shortest Path in a Grid\",\"data\":[[0,0,0,0,1,0],[0,0,1,0,1,0],[0,0,0,0,1,1],[0,0,0,0,0,0],[0,0,0,1,1,0],[1,1,1,0,1,0],[0,0,1,1,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[1,0,0,1,1,0],[0,0,0,0,0,0],[0,0,0,0,0,0]],\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"phantasy\",\"httpPortOpen\":false,\"ip\":\"16.3.8.5\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"Phantasy Club\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"phantasy\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"phantasy\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"phantasy\"}}]]},\"serversOnNetwork\":[\"max-hardware\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":20,\"hackDifficulty\":22.126000000000033,\"minDifficulty\":7,\"moneyAvailable\":44080827.59713552,\"moneyMax\":67500000,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":100,\"serverGrowth\":35,\"runningScripts\":[]}},\"max-hardware\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"max-hardware\",\"httpPortOpen\":false,\"ip\":\"16.5.1.5\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"Max Hardware Store\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"max-hardware\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"max-hardware\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"max-hardware\"}}]]},\"serversOnNetwork\":[\"joesguns\",\"phantasy\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":15,\"hackDifficulty\":9.281999999999947,\"minDifficulty\":5,\"moneyAvailable\":27935920.72109554,\"moneyMax\":28125000,\"numOpenPortsRequired\":1,\"openPortCount\":1,\"requiredHackingSkill\":80,\"serverGrowth\":30,\"runningScripts\":[]}},\"omega-net\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-461387-Netburners.cct\",\"type\":\"Subarray with Maximum Sum\",\"data\":[8,-5,8,5,-3,-8,-5,2,-8,3,0,-9,5,-10,-2,-7,0,8,-7,3,10,-4,5,10,3,-10,0,-3,-10],\"reward\":{\"type\":0,\"name\":\"Netburners\"}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"omega-net\",\"httpPortOpen\":false,\"ip\":\"18.6.0.2\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[\"the-new-god.lit\"],\"organizationName\":\"Omega Software\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"omega-net\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"omega-net\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"omega-net\"}}]]},\"serversOnNetwork\":[\"nectar-net\",\"johnson-ortho\",\"crush-fitness\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":25,\"hackDifficulty\":15.442000000000025,\"minDifficulty\":8,\"moneyAvailable\":88749057.9746765,\"moneyMax\":169794593.4375,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":185,\"serverGrowth\":31,\"runningScripts\":[]}},\"crush-fitness\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"crush-fitness\",\"httpPortOpen\":false,\"ip\":\"5.0.9.0\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Crush Fitness\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"crush-fitness\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"crush-fitness\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"crush-fitness\"}}]]},\"serversOnNetwork\":[\"omega-net\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":44,\"hackDifficulty\":44,\"minDifficulty\":15,\"moneyAvailable\":42518355.75,\"moneyMax\":159443834.0625,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":259,\"serverGrowth\":28,\"runningScripts\":[]}},\"iron-gym\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"iron-gym\",\"httpPortOpen\":false,\"ip\":\"86.7.5.1\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"Iron Gym Network\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"iron-gym\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"iron-gym\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"iron-gym\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":30,\"hackDifficulty\":19.871999999999744,\"minDifficulty\":10,\"moneyAvailable\":22877951.99882274,\"moneyMax\":56250000,\"numOpenPortsRequired\":1,\"openPortCount\":1,\"requiredHackingSkill\":100,\"serverGrowth\":20,\"runningScripts\":[]}},\"millenium-fitness\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"millenium-fitness\",\"httpPortOpen\":false,\"ip\":\"52.2.5.0\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"Millenium Fitness Network\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"millenium-fitness\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"millenium-fitness\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"millenium-fitness\"}}]]},\"serversOnNetwork\":[\"catalyst\",\"galactic-cyber\",\"global-pharm\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":50,\"hackDifficulty\":50,\"minDifficulty\":17,\"moneyAvailable\":187500000,\"moneyMax\":703125000,\"numOpenPortsRequired\":3,\"openPortCount\":0,\"requiredHackingSkill\":503,\"serverGrowth\":32,\"runningScripts\":[]}},\"powerhouse-fitness\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"powerhouse-fitness\",\"httpPortOpen\":false,\"ip\":\"95.1.9.4\",\"isConnectedTo\":false,\"maxRam\":32,\"messages\":[],\"organizationName\":\"Powerhouse Fitness\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"powerhouse-fitness\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"powerhouse-fitness\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"powerhouse-fitness\"}}]]},\"serversOnNetwork\":[\"4sigma\",\"megacorp\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":62,\"hackDifficulty\":62,\"minDifficulty\":21,\"moneyAvailable\":675000000,\"moneyMax\":2531250000,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":953,\"serverGrowth\":52,\"runningScripts\":[]}},\"snap-fitness\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"snap-fitness\",\"httpPortOpen\":false,\"ip\":\"22.5.4.1\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"Snap Fitness\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"snap-fitness\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"snap-fitness\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"snap-fitness\"}}]]},\"serversOnNetwork\":[\"aevum-police\",\"deltaone\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":51,\"hackDifficulty\":51,\"minDifficulty\":17,\"moneyAvailable\":337500000,\"moneyMax\":1265625000,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":724,\"serverGrowth\":44,\"runningScripts\":[]}},\"run4theh111z\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"run4theh111z\",\"httpPortOpen\":false,\"ip\":\"77.6.6.1\",\"isConnectedTo\":false,\"maxRam\":256,\"messages\":[\"simulated-reality.lit\",\"the-new-god.lit\"],\"organizationName\":\"The Runners\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"run4theh111z\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"run4theh111z\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"run4theh111z\"}}]]},\"serversOnNetwork\":[\"zb-def\",\"stormtech\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":523,\"serverGrowth\":1,\"runningScripts\":[]}},\"I.I.I.I\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-200810.cct\",\"type\":\"Minimum Path Sum in a Triangle\",\"data\":[[2],[9,6],[2,6,8],[8,3,6,8]],\"reward\":{\"type\":3}}},{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-191467-CyberSec.cct\",\"type\":\"HammingCodes: Encoded Binary to Integer\",\"data\":\"0110000010010000\",\"reward\":{\"type\":0,\"name\":\"CyberSec\"}}},{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-884048-CyberSec.cct\",\"type\":\"Subarray with Maximum Sum\",\"data\":[-7,8,7,-1,-1,6,0,4,-3,0,6,-10,-6,-4,-1],\"reward\":{\"type\":0,\"name\":\"CyberSec\"}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":false,\"hostname\":\"I.I.I.I\",\"httpPortOpen\":false,\"ip\":\"9.5.8.9\",\"isConnectedTo\":false,\"maxRam\":64,\"messages\":[\"democracy-is-dead.lit\"],\"organizationName\":\"I.I.I.I\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"I.I.I.I\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"I.I.I.I\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"I.I.I.I\"}}]]},\"serversOnNetwork\":[\"avmnite-02h\",\"lexo-corp\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":3,\"openPortCount\":2,\"requiredHackingSkill\":354,\"serverGrowth\":1,\"runningScripts\":[]}},\"avmnite-02h\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-802840-CyberSec.cct\",\"type\":\"Array Jumping Game II\",\"data\":[2,6,5,0,2,4,0],\"reward\":{\"type\":0,\"name\":\"CyberSec\"}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"avmnite-02h\",\"httpPortOpen\":false,\"ip\":\"3.6.6.8\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[\"democracy-is-dead.lit\"],\"organizationName\":\"NiteSec\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"avmnite-02h\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"avmnite-02h\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"avmnite-02h\"}}]]},\"serversOnNetwork\":[\"neo-net\",\"I.I.I.I\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":true,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":2,\"openPortCount\":2,\"requiredHackingSkill\":214,\"serverGrowth\":1,\"runningScripts\":[]}},\".\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-172788.cct\",\"type\":\"Find All Valid Math Expressions\",\"data\":[\"448815038584\",-12],\"reward\":{\"type\":3}}}],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\".\",\"httpPortOpen\":false,\"ip\":\"7.7.0.5\",\"isConnectedTo\":false,\"maxRam\":16,\"messages\":[],\"organizationName\":\".\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\".\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\".\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\".\"}}]]},\"serversOnNetwork\":[\"fulcrumtech\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":4,\"openPortCount\":0,\"requiredHackingSkill\":531,\"serverGrowth\":1,\"runningScripts\":[]}},\"CSEC\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[{\"ctor\":\"CodingContract\",\"data\":{\"tries\":0,\"fn\":\"contract-605061.cct\",\"type\":\"Compression I: RLE Compression\",\"data\":\"888888888888MeXxxxyvv88aBBttttHHHHHHHHq11111111111P000000000007JyyZZZ\",\"reward\":{\"type\":1}}}],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"CSEC\",\"httpPortOpen\":false,\"ip\":\"30.9.8.3\",\"isConnectedTo\":false,\"maxRam\":8,\"messages\":[\"democracy-is-dead.lit\"],\"organizationName\":\"CyberSec\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"CSEC\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"CSEC\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"CSEC\"}}]]},\"serversOnNetwork\":[\"hong-fang-tea\",\"silver-helix\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":true,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":1,\"openPortCount\":2,\"requiredHackingSkill\":52,\"serverGrowth\":1,\"runningScripts\":[]}},\"The-Cave\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"The-Cave\",\"httpPortOpen\":false,\"ip\":\"5.2.1.5\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[\"alpha-omega.lit\"],\"organizationName\":\"Helios\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"The-Cave\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"The-Cave\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"The-Cave\"}}]]},\"serversOnNetwork\":[\"nwo\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":925,\"serverGrowth\":1,\"runningScripts\":[]}},\"w0r1d_d43m0n\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":false,\"hostname\":\"w0r1d_d43m0n\",\"httpPortOpen\":false,\"ip\":\"8.4.4.9\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"w0r1d_d43m0n\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[]},\"serversOnNetwork\":[],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":9000,\"serverGrowth\":1,\"runningScripts\":[]}},\"darkweb\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":true,\"hasAdminRights\":true,\"hostname\":\"darkweb\",\"httpPortOpen\":true,\"ip\":\"64.7.8.0\",\"isConnectedTo\":false,\"maxRam\":0,\"messages\":[],\"organizationName\":\"darkweb\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"darkweb\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"darkweb\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"darkweb\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":true,\"sqlPortOpen\":true,\"sshPortOpen\":true,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":false,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":5,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-0\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-0\",\"httpPortOpen\":false,\"ip\":\"68.9.8.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-0\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-0\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-0\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-1\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-1\",\"httpPortOpen\":false,\"ip\":\"23.4.0.3\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-1\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-1\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-1\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-2\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-2\",\"httpPortOpen\":false,\"ip\":\"40.9.8.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-2\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-2\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-2\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-3\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-3\",\"httpPortOpen\":false,\"ip\":\"28.8.5.9\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-3\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-3\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-3\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-4\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-4\",\"httpPortOpen\":false,\"ip\":\"12.6.2.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-4\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-4\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-4\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-5\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-5\",\"httpPortOpen\":false,\"ip\":\"86.4.8.9\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-5\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-5\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-5\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-6\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-6\",\"httpPortOpen\":false,\"ip\":\"37.2.7.6\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-6\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-6\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-6\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-7\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-7\",\"httpPortOpen\":false,\"ip\":\"2.2.1.7\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-7\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-7\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-7\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-8\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-8\",\"httpPortOpen\":false,\"ip\":\"27.7.0.9\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-8\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-8\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-8\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-9\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-9\",\"httpPortOpen\":false,\"ip\":\"4.1.0.9\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-9\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-9\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-9\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-10\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-10\",\"httpPortOpen\":false,\"ip\":\"53.3.0.1\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-10\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-10\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-10\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-11\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-11\",\"httpPortOpen\":false,\"ip\":\"21.1.2.3\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-11\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-11\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-11\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-12\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-12\",\"httpPortOpen\":false,\"ip\":\"41.7.2.3\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-12\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-12\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-12\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-13\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-13\",\"httpPortOpen\":false,\"ip\":\"47.4.8.8\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-13\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-13\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-13\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-14\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-14\",\"httpPortOpen\":false,\"ip\":\"20.8.8.6\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-14\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-14\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-14\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-15\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-15\",\"httpPortOpen\":false,\"ip\":\"63.5.5.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-15\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-15\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-15\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-16\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-16\",\"httpPortOpen\":false,\"ip\":\"92.1.7.7\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-16\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-16\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-16\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-17\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-17\",\"httpPortOpen\":false,\"ip\":\"62.4.4.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-17\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-17\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-17\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-18\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-18\",\"httpPortOpen\":false,\"ip\":\"41.4.6.2\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-18\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-18\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-18\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-19\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-19\",\"httpPortOpen\":false,\"ip\":\"61.9.9.4\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-19\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-19\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-19\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-20\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-20\",\"httpPortOpen\":false,\"ip\":\"92.1.3.0\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-20\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-20\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-20\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-21\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-21\",\"httpPortOpen\":false,\"ip\":\"78.3.1.0\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-21\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-21\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-21\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-22\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-22\",\"httpPortOpen\":false,\"ip\":\"36.4.0.9\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-22\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-22\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-22\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-23\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-23\",\"httpPortOpen\":false,\"ip\":\"18.9.8.3\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-23\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-23\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-23\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}},\"home-24\":{\"ctor\":\"Server\",\"data\":{\"contracts\":[],\"cpuCores\":1,\"ftpPortOpen\":false,\"hasAdminRights\":true,\"hostname\":\"home-24\",\"httpPortOpen\":false,\"ip\":\"81.3.7.6\",\"isConnectedTo\":false,\"maxRam\":128,\"messages\":[],\"organizationName\":\"\",\"programs\":[],\"scripts\":{\"ctor\":\"JSONMap\",\"data\":[[\"grow.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n    const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;\\n    for (let loops = 0; loops < maxLoops; loops++) {\\n        ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)\\n        await ns.grow(ns.args.length > 0 ? ns.args[0] : '');\\n    }\\n}\",\"filename\":\"grow.js\",\"server\":\"home-24\"}}],[\"weaken.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')\\n}\",\"filename\":\"weaken.js\",\"server\":\"home-24\"}}],[\"hack.js\",{\"ctor\":\"Script\",\"data\":{\"code\":\"/** @param {import(\\\".\\\").NS } ns */\\n\\nexport async function main(ns) {\\n    // ns.disableLog('ALL');\\n\\n    await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);\\n    await ns.hack(ns.args.length > 0 ? ns.args[0] : '');\\n}\",\"filename\":\"hack.js\",\"server\":\"home-24\"}}]]},\"serversOnNetwork\":[\"home\"],\"smtpPortOpen\":false,\"sqlPortOpen\":false,\"sshPortOpen\":false,\"textFiles\":{\"ctor\":\"JSONMap\",\"data\":[]},\"purchasedByPlayer\":true,\"backdoorInstalled\":false,\"baseDifficulty\":1,\"hackDifficulty\":1,\"minDifficulty\":1,\"moneyAvailable\":0,\"moneyMax\":0,\"numOpenPortsRequired\":5,\"openPortCount\":0,\"requiredHackingSkill\":1,\"serverGrowth\":1,\"runningScripts\":[]}}}","CompaniesSave":"{\"ECorp\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":14173.169313111826}},\"MegaCorp\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Bachman & Associates\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Blade Industries\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"NWO\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Clarke Incorporated\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"OmniTek Incorporated\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Four Sigma\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"KuaiGong International\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Fulcrum Technologies\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Storm Technologies\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"DefComm\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Helios Labs\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"VitaLife\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Icarus Microsystems\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Universal Energy\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Galactic Cybersystems\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"AeroCorp\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Omnia Cybersystems\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Solaris Space Systems\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"DeltaOne\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Global Pharmaceuticals\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Nova Medical\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Central Intelligence Agency\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"National Security Agency\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Watchdog Security\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"LexoCorp\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Rho Construction\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Alpha Enterprises\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Aevum Police Headquarters\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"SysCore Securities\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"CompuTek\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"NetLink Technologies\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Carmichael Security\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"FoodNStuff\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Joe's Guns\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Omega Software\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}},\"Noodle Bar\":{\"ctor\":\"Company\",\"data\":{\"favor\":0,\"playerReputation\":0}}}","FactionsSave":"{\"Illuminati\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Daedalus\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"The Covenant\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"ECorp\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"MegaCorp\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Bachman & Associates\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Blade Industries\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"NWO\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Clarke Incorporated\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"OmniTek Incorporated\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Four Sigma\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"KuaiGong International\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Fulcrum Secret Technologies\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"BitRunners\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"The Black Hand\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"NiteSec\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":1,\"isBanned\":false,\"isMember\":true,\"playerReputation\":3023.8255216537505}},\"Aevum\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Chongqing\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Ishima\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"New Tokyo\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Sector-12\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Volhaven\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Speakers for the Dead\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"The Dark Army\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"The Syndicate\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Silhouette\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Tetrads\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Slum Snakes\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Netburners\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":1,\"isBanned\":false,\"isMember\":true,\"playerReputation\":34255.85819306117}},\"Tian Di Hui\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"CyberSec\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":true,\"favor\":1,\"isBanned\":false,\"isMember\":true,\"playerReputation\":3646.2527936014135}},\"Bladeburners\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Church of the Machine God\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}},\"Shadows of Anarchy\":{\"ctor\":\"Faction\",\"data\":{\"alreadyInvited\":false,\"favor\":0,\"isBanned\":false,\"isMember\":false,\"playerReputation\":0}}}","AliasesSave":"{\"kill-nuke\":\"home; run kill-nuke.js\",\"kill-hack\":\"home; run kill-all-simple-hack.js\",\"hacknet\":\"home; run hacknet-bot.js\",\"kill-bot\":\"home; run kill-hacknet.js\",\"nuke\":\"home; run auto-nuke.js\",\"flight\":\"home; run fl1ght.exe\",\"start-grow-helpers\":\"home; run start-grow-helpers.js\",\"backdoor-server\":\"home; run backdoor-command.js\",\"darkweb\":\"connect darkweb; buy -l\"}","GlobalAliasesSave":"{\"killAll\":\"connect home; kill ./auto-hack.js; kill ./hacknet-bot.js; kill ./money-stats.js; kill ./grow.js\",\"connectServer\":\"connect home; ./connect-server.js\",\"backdoor1CSEC\":\"connect home; ./backdoor-command.js CSEC\",\"backdoor2NiteSec\":\"connect home; ./backdoor-command.js avmnite-02h\",\"backdoor3BlackHand\":\"connect home; ./backdoor-command.js I.I.I.I\",\"backdoor4BitRunners\":\"connect home; ./backdoor-command.js run4theh111z\",\"buy1FTP\":\"buy FTPCrack.exe\",\"buy2SMTP\":\"buy relaySMTP.exe\",\"buy3HTTP\":\"buy HTTPWorm.exe\",\"buy4SQL\":\"buy SQLInject.exe\",\"startAll\":\"connect home; ./scan-network.js; ./money-stats.js; ./hacknet-bot.js; ./auto-hack.js; nano scan.txt; nano moneyStats.txt; nano autoHack.txt; nano autoHackMax.txt;\",\"backdoor5TheCave\":\"connect home; ./backdoor-command.js The-Cave\",\"backdoor6WorldDaemon\":\"connect home; ./backdoor-command.js w0r1d_d43m0n\",\"autoHack\":\"connect home; kill ./auto-hack.js; ./auto-hack.js; nano autoHack.txt;\",\"buyAll\":\"buy FTPCrack.exe; buy relaySMTP.exe; buy HTTPWorm.exe; buy SQLInject.exe;\"}","StockMarketSave":"{\"lastUpdate\":0,\"Orders\":{},\"storedCycles\":0,\"ticksUntilCycle\":0}","SettingsSave":"{\"ActiveScriptsServerPageSize\":100,\"ActiveScriptsScriptPageSize\":10,\"AutoexecScript\":\"\",\"AutosaveInterval\":60,\"CodeInstructionRunTime\":20,\"DisableASCIIArt\":false,\"DisableHotkeys\":false,\"DisableTextEffects\":false,\"DisableOverviewProgressBars\":false,\"EnableBashHotkeys\":false,\"EnableHistorySearch\":false,\"TimestampsFormat\":\"\",\"Locale\":\"en\",\"MaxRecentScriptsCapacity\":50,\"MaxLogCapacity\":50,\"MaxPortCapacity\":50,\"MaxTerminalCapacity\":500,\"RemoteFileApiPort\":0,\"SaveGameOnFileSave\":true,\"SuppressBuyAugmentationConfirmation\":false,\"SuppressFactionInvites\":false,\"SuppressMessages\":false,\"SuppressTravelConfirmation\":false,\"SuppressBladeburnerPopup\":false,\"SuppressTIXPopup\":false,\"SuppressSavedGameToast\":false,\"SuppressAutosaveDisabledWarnings\":false,\"UseIEC60027_2\":true,\"ShowMiddleNullTimeUnit\":false,\"ExcludeRunningScriptsFromSave\":false,\"IsSidebarOpened\":true,\"theme\":{\"primarylight\":\"#28CF28\",\"primary\":\"#21A821\",\"primarydark\":\"#177317\",\"successlight\":\"#1CFF1C\",\"success\":\"#16CA16\",\"successdark\":\"#0D910D\",\"errorlight\":\"#FF3B3B\",\"error\":\"#C32D2D\",\"errordark\":\"#8E2121\",\"secondarylight\":\"#B3B3B3\",\"secondary\":\"#838383\",\"secondarydark\":\"#676767\",\"warninglight\":\"#FFFF3A\",\"warning\":\"#C3C32A\",\"warningdark\":\"#8C8C1E\",\"infolight\":\"#64CBFF\",\"info\":\"#3399CC\",\"infodark\":\"#246D91\",\"welllight\":\"#404040\",\"well\":\"#1C1C1C\",\"white\":\"#C3C3C3\",\"black\":\"#0A0B0B\",\"hp\":\"#C62E2E\",\"money\":\"#D6BB27\",\"hack\":\"#ADFF2F\",\"combat\":\"#E8EDCD\",\"cha\":\"#8B5FAF\",\"int\":\"#537CC8\",\"rep\":\"#E8EDCD\",\"disabled\":\"#5AB5A5\",\"backgroundprimary\":\"#0C0D0E\",\"backgroundsecondary\":\"#121415\",\"button\":\"#252829\"},\"styles\":{\"lineHeight\":1.5,\"fontFamily\":\"Lucida Console, Lucida Sans Unicode, Fira Mono, Consolas, Courier New, Courier, monospace, Times New Roman\"},\"overview\":{\"x\":-1312,\"y\":1097,\"opened\":true},\"EditorTheme\":{\"common\":{\"accent\":\"B5CEA8\",\"bg\":\"1E1E1E\",\"fg\":\"D4D4D4\"},\"syntax\":{\"tag\":\"569CD6\",\"entity\":\"569CD6\",\"string\":\"CE9178\",\"regexp\":\"646695\",\"markup\":\"569CD6\",\"keyword\":\"569CD6\",\"comment\":\"6A9955\",\"constant\":\"569CD6\",\"error\":\"F44747\"},\"ui\":{\"line\":\"1E1E1E\",\"panel\":{\"bg\":\"252526\",\"selected\":\"252526\",\"border\":\"1E1E1E\"},\"selection\":{\"bg\":\"ADD6FF26\"}},\"base\":\"vs-dark\",\"inherit\":true},\"OwnedAugmentationsOrder\":0,\"PurchaseAugmentationsOrder\":0,\"MonacoTheme\":\"monokai\",\"MonacoInsertSpaces\":true,\"MonacoTabSize\":2,\"MonacoDetectIndentation\":false,\"MonacoFontFamily\":\"Lucida Console\",\"MonacoFontSize\":14,\"MonacoFontLigatures\":false,\"MonacoVim\":false,\"MonacoWordWrap\":\"off\",\"MonacoCursorStyle\":\"line\",\"MonacoCursorBlinking\":\"blink\",\"hideTrailingDecimalZeros\":false,\"hideThousandsSeparator\":false,\"useEngineeringNotation\":false,\"disableSuffixes\":false}","VersionSave":"34","AllGangsSave":"","LastExportBonus":"1694703094619","StaneksGiftSave":"{\"ctor\":\"StaneksGift\",\"data\":{\"fragments\":[],\"isBonusCharging\":false,\"storedCycles\":0}}"}}