Skip to content

Instantly share code, notes, and snippets.

@KrunoSaho
Last active July 10, 2023 02:25
Show Gist options
  • Save KrunoSaho/0a1c8684b0c7a6cff0b24689d0d25418 to your computer and use it in GitHub Desktop.
Save KrunoSaho/0a1c8684b0c7a6cff0b24689d0d25418 to your computer and use it in GitHub Desktop.
Batcher Total JS
import { Task, getMyServers, getThreadCountForSimpleOps, makeColour } from "Util";
function interleave(hack, grow, weaken) {
const result = [];
const max = Math.max(hack.length, grow.length, weaken.length);
for (let i = 0; i < max; i++) {
if (i < weaken.length)
result.push(weaken[i]);
if (i < grow.length)
result.push(grow[i]);
if (i < hack.length)
result.push(hack[i]);
}
return result;
}
export async function main(ns) {
if (ns.args.length < 1)
throw new Error("Missing hostname");
const hostname = ns.args[0];
let targetServer = ns.getServer(hostname);
const moneyAtTime = [];
const sleepTime = 5;
const sleepMul = Math.ceil(1000 / sleepTime);
ns.atExit(() => {
[...getMyServers()].forEach((s) => ns.killall(s));
});
ns.disableLog("ALL");
ns.clearLog();
ns.tail();
ns.moveTail(1800, 250);
const { hack, grow, weaken } = {
hack: createTask(ns, targetServer, Task.Hack),
grow: createTask(ns, targetServer, Task.Grow),
weaken: createTask(ns, targetServer, Task.Weaken),
};
const findLosses = () => countPeriodsOfLoss(getDeltaMoney(moneyAtTime));
let iteration = 0;
while (true) {
const t0 = Date.now();
// ui
ns.clearLog();
displayUi(ns, targetServer);
plotMoneybar(ns, moneyAtTime);
ns.print(`Losses in period: ${findLosses()}`);
const totalHackThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Hack);
const totalGrowThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Grow);
const totalWeakenThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Weaken);
const hackNoThreads = totalHackThreads.reduce((a, b) => a + b.threads, 0);
const growNoThreads = totalGrowThreads.reduce((a, b) => a + b.threads, 0);
const weakNoThreads = totalWeakenThreads.reduce((a, b) => a + b.threads, 0);
const serversToIgnore = [];
const weakenThreads = getServersForThreads(totalWeakenThreads, weakNoThreads, serversToIgnore);
const growThreads = getServersForThreads(totalGrowThreads, growNoThreads, serversToIgnore);
const hackThreads = getServersForThreads(totalHackThreads, hackNoThreads, serversToIgnore);
const processes = interleave(hackThreads, growThreads, weakenThreads).map((x) => {
switch (x.task) {
case Task.Hack:
return () => hack(x.server, x.threads);
case Task.Grow:
return () => grow(x.server, x.threads);
case Task.Weaken:
return () => weaken(x.server, x.threads);
}
});
processes.sort(() => Math.random() - Math.random()).forEach((p) => p());
// ending updates
targetServer = ns.getServer(hostname);
if (iteration % (2 * sleepMul) === 0)
push(moneyAtTime, ns.getPlayer().money);
iteration++;
await ns.sleep(sleepTime);
const dt = t0 - Date.now();
ns.writePort(ns.pid, JSON.stringify({ type: "hack", start: t0, end: dt, batch: iteration }));
}
}
function getSourceServers(ns) {
const serverHasMemory = (s) => s.maxRam - s.ramUsed >= 1.75;
const servers = ["home", ...getMyServers()]
.filter((s) => ns.serverExists(s))
.map(ns.getServer)
.filter(serverHasMemory);
return servers;
}
function getServersWithThreads(ns, servers, task) {
return servers.map((s) => {
return { server: s, threads: getThreadCountForSimpleOps(ns, s, task), task };
});
}
function getServersForThreads(servers, threadsRequired, serversToIgnore) {
const result = [];
for (const s of servers.filter((s) => !serversToIgnore.includes(s.server))) {
if (s.threads > 0) {
result.push(s);
threadsRequired -= s.threads;
if (threadsRequired > s.threads) {
serversToIgnore.push(s.server);
}
}
if (threadsRequired <= 0) {
return result;
}
}
return result;
}
function countPeriodsOfLoss(data) {
let result = 0;
for (let i = 0; i < data.length; i++) {
if (data[i] < 0) {
result++;
}
}
return result;
}
function getDeltaMoney(moneyAtTime) {
let result = [];
for (let i = 1; i < moneyAtTime.length; i++) {
result.push(moneyAtTime[i] - moneyAtTime[i - 1]);
}
return result;
}
function plotMoneybar(ns, moneyAtTime, maxItems = 25) {
const red = makeColour(255, 0, 0);
const green = makeColour(0, 255, 0);
const blue = makeColour(0, 0, 255);
let output = "Money: ";
for (let i = 1; i < moneyAtTime.length; i++) {
const m0 = moneyAtTime[i - 1];
const m1 = moneyAtTime[i];
const delta = m1 - m0;
if (delta > 0) {
output += `${blue}${"█"}`;
}
else if (delta < 0) {
output += `${red}${"█"}`;
}
else {
output += `${green}${"█"}`;
}
}
const gray = makeColour(100, 100, 100);
for (let i = 0; i < maxItems - moneyAtTime.length; i++) {
output += `${gray}${"█"}`;
}
ns.print(output);
}
function push(data, value, maxItems = 25) {
data.push(value);
if (data.length > maxItems) {
data.shift();
}
}
function getHackWeakenGrowCounts(ns, hostname) {
const processes = ns.ps(hostname);
const hc = processes.filter((p) => p.filename === Task.Hack).length;
const wc = processes.filter((p) => p.filename === Task.Weaken).length;
const gc = processes.filter((p) => p.filename === Task.Grow).length;
return { hc, wc, gc };
}
function createTask(ns, target, task) {
return (src, threads, additionTimeMs = 0) => {
ns.exec(task, src.hostname, threads, target.hostname, additionTimeMs);
};
}
function displayUi(ns, targetServer) {
const srcServers = ["home", ...getMyServers()];
const srcPs = srcServers.map((s) => ns.ps(s)).flat();
const { hc, gc, wc } = srcPs
.filter((x) => x.filename.includes("Simple"))
.map((x) => {
const hc = x.filename.toLowerCase().includes("hack") ? 1 : 0;
const gc = x.filename.toLowerCase().includes("grow") ? 1 : 0;
const wc = x.filename.toLowerCase().includes("weaken") ? 1 : 0;
return { hc: hc, gc: gc, wc: wc };
})
.reduce((acc, x) => {
return { hc: acc.hc + x.hc, gc: acc.gc + x.gc, wc: acc.wc + x.wc };
}, { hc: 0, gc: 0, wc: 0 });
ns.print(`H: ${hc} G: ${gc} W: ${wc}`);
const randomColours = [
makeColour(100, 100, 200),
makeColour(100, 200, 100),
makeColour(200, 100, 100),
makeColour(200, 100, 200),
makeColour(200, 200, 100),
makeColour(100, 100, 200),
makeColour(33, 88, 66),
makeColour(100, 190, 220),
makeColour(33, 220, 190),
];
const defaultCol = makeColour(255, 255, 255);
ns.print(`${defaultCol}Target server: ${randomColours.pop()}${targetServer.hostname}`);
ns.print(`${defaultCol}Money: ${randomColours.pop()}$${targetServer.moneyAvailable?.toLocaleString("en-AU")} / $${targetServer.moneyMax?.toLocaleString("en-AU")}`);
ns.print(`${defaultCol}Security: ${randomColours.pop()}${targetServer.hackDifficulty?.toPrecision(2)} / 100 = ${(targetServer.hackDifficulty / 100).toPrecision(2)}`);
ns.print(`${defaultCol}Min security: ${randomColours.pop()}${targetServer.minDifficulty.toPrecision(2)}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdEhnd0RhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ29sbGVjdEhnd0RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSWxGLFNBQVMsVUFBVSxDQUFDLElBQXlCLEVBQUUsSUFBeUIsRUFBRSxNQUEyQjtJQUNqRyxNQUFNLE1BQU0sR0FBRyxFQUF5QixDQUFDO0lBRXpDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEVBQU07SUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTVELE1BQU0sUUFB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
export function copyHackFilesToServers(ns, servers) {
const files = ["hacks/SimpleHack.js", "hacks/SimpleGrow.js", "hacks/SimpleWeaken.js"];
for (const server of servers) {
if (!ns.scp(files, server.hostname, "home")) {
ns.print(`ERROR: copyHackFilesToServers => Failed to copy files to ${server}`);
}
}
}
export async function main(ns) {
const servers = JSON.parse(ns.args[0]);
copyHackFilesToServers(ns, servers.filter((s) => s.hostname !== "home"));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29weUZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvQ29weUZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxFQUFNLEVBQUUsT0FBaUI7SUFDNUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXRGLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1FBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ3pDLEVBQUUsQ0FBQyxLQUFLLENBQUMsNERBQTRELE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDbEY7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxFQUFNO0lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVcsQ0FBYSxDQUFDO0lBRTdELHNCQUFzQixDQUNsQixFQUFFLEVBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FDL0MsQ0FBQztBQUNOLENBQUMifQ==
import { copyHackFilesToServers } from "CopyFiles";
export var Task;
(function (Task) {
Task["Hack"] = "hacks/SimpleHack.js";
Task["Grow"] = "hacks/SimpleGrow.js";
Task["Weaken"] = "hacks/SimpleWeaken.js";
})(Task || (Task = {}));
export var PortMessages;
(function (PortMessages) {
PortMessages["ServersBroken"] = "ServersBroken";
})(PortMessages || (PortMessages = {}));
const PurchasedServerBaseName = "a";
export function getCurrentDateTime() {
// Get the current date and time
let now = new Date(Date.now());
// Extract the date and time components
let date = now.getDate();
let month = now.getMonth() + 1;
let year = now.getFullYear();
let hours = now.getHours();
let minutes = now.getMinutes();
let seconds = now.getSeconds();
// Format the date and time components to have two digits
date = date < 10 ? "0" + date : date;
month = month < 10 ? "0" + month : month;
hours = hours < 10 ? "0" + hours : hours;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
// Combine the date and time components into a string
let formattedDateTime = `${date}/${month}/${year} - ${hours}:${minutes}:${seconds}`;
return formattedDateTime;
}
export async function getPurchasedServers(ns, portNumber) {
const portHandle = ns.getPortHandle(portNumber);
portHandle.clear();
ns.exec("scripts/GetMyServers.js", "home", 1, portNumber);
await portHandle.nextWrite();
return JSON.parse(portHandle.read());
}
export async function getTargetServersForHack(ns, portNumber, purchasedServers) {
const portHandle = ns.getPortHandle(portNumber);
const args = [JSON.stringify(purchasedServers), portNumber];
portHandle.clear();
ns.exec("scripts/GetTargetServers.js", "home", 1, ...args);
await portHandle.nextWrite();
return JSON.parse(portHandle.read());
}
export function makeColour(r, g, b, foreGround = true) {
return `\u001b[${foreGround ? 3 : 4}8;2;${r};${g};${b}m`;
}
export function buyAllTorStuff(ns) {
ns.singularity.purchaseTor();
for (const prog of ns.singularity.getDarkwebPrograms()) {
ns.singularity.purchaseProgram(prog);
}
}
export function getServers(ns) {
const player = ns.getPlayer();
const totalServers = getAllServers(ns.scan, "home", []).filter((s) => !s.includes("hacknet"));
// my servers
const boughtServers = getMyServers();
const myServers = totalServers
.map(ns.getServer)
.filter((s) => s.hasAdminRights)
.filter((s) => boughtServers.includes(s.hostname));
// attack
const targetServers = totalServers
.map(ns.getServer)
.filter((s) => !boughtServers.includes(s.hostname))
.filter((s) => s.moneyMax > 0)
.filter((s) => Math.ceil(player.skills.hacking / 2) >= s.requiredHackingSkill)
.sort((a, b) => b.moneyMax - a.moneyMax);
myServers.unshift(ns.getServer("home"));
return { myServers, targetServers };
}
export function getMyServers() {
return Array(25)
.fill(0)
.map((_, i) => {
if (i - 1 === -1)
return PurchasedServerBaseName;
return `${PurchasedServerBaseName}-${i - 1}`;
});
}
export function buyServers(ns) {
const serversBought = ns.getPurchasedServers();
const updateScripts = (server) => {
ns.scp(["hacks/SimpleGrow.js", "hacks/SimpleHack.js", "hacks/SimpleWeaken.js"], server, "home");
};
let boughtServers = false;
// upgrade servers
for (const server of serversBought) {
if (ns.getServerMaxRam(server) === ns.getPurchasedServerMaxRam()) {
continue;
}
const money = ns.getPlayer().money;
const memory = ns.getServerMaxRam(server);
const idx = Math.floor(Math.log2(memory));
const ramQty = Math.floor(Math.pow(2, idx + 2));
const cost = ns.getPurchasedServerUpgradeCost(server, ramQty);
if (cost < Math.floor(money * 0.33)) {
if (ns.upgradePurchasedServer(server, ramQty)) {
updateScripts(server);
ns.print(`Server ${server} upgraded => RAM: ${ramQty}`);
}
}
}
// Purchase server if server costs < 10% of money.
let purchaseServer = false;
let ramQty = 1;
const costPurchase = () => ns.getPurchasedServerCost(ramQty) < Math.floor(ns.getPlayer().money * 0.1);
const maxIdx = Math.floor(Math.log2(ns.getPurchasedServerMaxRam()));
for (let i = maxIdx; i > 0; i--) {
ramQty = Math.pow(2, i);
if (costPurchase()) {
purchaseServer = true;
break;
}
}
// buy server
if (serversBought.length < ns.getPurchasedServerLimit() && purchaseServer) {
const newServer = ns.purchaseServer(PurchasedServerBaseName, ramQty);
if (newServer != "") {
boughtServers = true;
serversBought.push(newServer);
ns.print(`Purchased new server, ${newServer}`);
updateScripts(newServer);
}
}
return boughtServers;
}
export function spendHashes(ns, action, targetServer, upgradeCount = 1) {
if (ns.hacknet.hashCost(action, upgradeCount) > ns.hacknet.numHashes()) {
action = "Increase Maximum Money";
}
const hasFinished = ns.hacknet.spendHashes(action, targetServer, upgradeCount);
if (hasFinished) {
ns.print(`Spending hashes on ${action}`);
ns.print(`Bought ${action}`);
}
}
export function breakServers(ns, servers) {
const run = (file, host, program) => {
try {
program(host);
}
catch (e) { }
};
for (const server of servers) {
copyHackFilesToServers(ns, [server]);
const host = server.hostname;
if (!server.sshPortOpen)
run("BruteSSH.exe", host, ns.brutessh);
if (!server.ftpPortOpen)
run("FTPCrack.exe", host, ns.ftpcrack);
if (!server.httpPortOpen)
run("HTTPWorm.exe", host, ns.httpworm);
if (!server.sqlPortOpen)
run("SQLInject.exe", host, ns.sqlinject);
if (!server.smtpPortOpen)
run("relaySMTP.exe", host, ns.relaysmtp);
const portsOpened = [
server.sshPortOpen,
server.ftpPortOpen,
server.httpPortOpen,
server.sqlPortOpen,
server.smtpPortOpen,
].reduce((a, b) => a + Number(b), 0);
if (!server.hasAdminRights && server.numOpenPortsRequired <= portsOpened) {
ns.nuke(host);
}
}
}
export function getHoursSinceReset(ns) {
return (Date.now() - ns.getResetInfo().lastAugReset) / 3600000;
}
export function getAllServers(scan, server, existingServers) {
const newServers = scan(server) // pad
.filter((ss) => !existingServers.includes(ss));
if (newServers.length === 0) {
return [server];
}
existingServers.push(...newServers);
for (const s of newServers) {
const nextServers = getAllServers(scan, s, existingServers);
existingServers.push(...nextServers);
}
return [...new Set(existingServers)];
}
export function getThreadCountForSimpleOps(ns, srcServer, script, percent = 0.99) {
const available = Math.ceil(srcServer.maxRam) - Math.ceil(srcServer.ramUsed);
let scriptUsage = script === "hacks/SimpleHack.js" ? 1.7 : 1.75;
if (available <= 0) {
return 0;
}
const threads = Math.floor((percent * available) / scriptUsage);
return threads;
}
export function getThreadCount(ns, srcServer, script, percent = 0.99) {
const available = Math.ceil(srcServer.maxRam) - Math.ceil(srcServer.ramUsed);
const scriptUsage = ns.getScriptRam(script, srcServer.hostname);
if (available === 0 || scriptUsage === 0) {
return 0;
}
const threads = Math.floor((percent * available) / scriptUsage);
return threads;
}
/***
* Thanks to quacksouls for this:
* https://gist.github.com/quacksouls/dde4532740c2204425fa83bba3ceb8fa
*/
export function shell(cmd) {
// Template code from the official documentation of Bitburner:
//
// https://bitburner.readthedocs.io/en/latest/netscript/advancedfunctions/inject_html.html
const input = globalThis["document"].getElementById("terminal-input");
input.value = cmd;
const handler = Object.keys(input)[1];
input[handler].onChange({
target: input,
});
input[handler].onKeyDown({
key: "Enter",
preventDefault: () => null,
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9VdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE1BQU0sQ0FBTixJQUFZLElBSVg7QUFKRCxXQUFZLElBQUk7SUFDWixvQ0FBNEIsQ0FBQTtJQUM1QixvQ0FBNEIsQ0FBQTtJQUM1Qix3Q0FBZ0MsQ0FBQTtBQUNwQyxDQUFDLEVBSlcsSUFBSSxLQUFKLElBQUksUUFJZjtBQUVELE1BQU0sQ0FBTixJQUFZLFlBRVg7QUFGRCxXQUFZLFlBQVk7SUFDcEIsK0NBQStCLENBQUE7QUFDbkMsQ0FBQyxFQUZXLFlBQVksS0FBWixZQUFZLFFBRXZCO0FBSUQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMsTUFBTSxVQUFVLGtCQUFrQjtJQUM5QixnQ0FBZ0M7SUFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFL0IsdUNBQXVDO0lBQ3ZDLElBQUksSUFBSSxHQUFvQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsSUFBSSxLQUFLLEdBQW9CLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxJQUFJLEdBQW9CLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU5QyxJQUFJLEtBQUssR0FBb0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVDLElBQUksT0FBTyxHQUFvQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDaEQsSUFBSSxPQUFPLEdBQW9CLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUVoRCx5REFBeUQ7SUFDekQsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment