seedrandom = (function() {
const width = 256,
chunks = 6,
digits = 52;
const startdenom = Math.pow(width, chunks),
significance = Math.pow(2, digits),
overflow = significance * 2,
mask = width - 1;
return function(seed) {
const arc4 = new ARC4(mixkey(seed));
return function() {
let n = arc4.g(chunks),
d = startdenom,
x = 0;
while (n < significance) {
n = (n + x) * width;
d *= width;
x = arc4.g(1);
}
while (n >= overflow) {
n /= 2;
d /= 2;
x >>>= 1;
}
return (n + x) / d;
};
function ARC4(key) {
const me = this,
s = (me.S = []);
let t,
keylen = key.length,
i = 0,
j = (me.i = me.j = 0);
if (!keylen) key = [keylen++];
while (i < width) s[i] = i++;
for (i = 0; i < width; i++) {
s[i] = s[(j = mask & (j + key[i % keylen] + (t = s[i])))];
s[j] = t;
}
(me.g = function(count) {
const s = me.S;
let t,
r = 0,
i = me.i,
j = me.j;
while (count--) {
t = s[(i = mask & (i + 1))];
r =
r * width +
s[mask & ((s[i] = s[(j = mask & (j + t))]) + (s[j] = t))];
}
me.i = i;
me.j = j;
return r;
})(width);
}
};
function mixkey(seed) {
seed = String(seed);
const key = [];
let smear,
j = 0;
while (j < seed.length) {
key[mask & j] =
mask & ((smear ^= key[mask & j] * 19) + seed.charCodeAt(j++));
}
return key;
}
})()