Greasy Fork is available in English.

bianos websocket blabal

i just added window.io to normal 1.8.0 bundle

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.greasyfork.org/scripts/494975/1376630/bianos%20websocket%20blabal.js

(function () {
    const t = document.createElement("link").relList;
    if (t && t.supports && t.supports("modulepreload")) return;
    for (const n of document.querySelectorAll('link[rel="modulepreload"]')) s(n);
    new MutationObserver((n) => {
        for (const r of n) if (r.type === "childList") for (const o of r.addedNodes) o.tagName === "LINK" && o.rel === "modulepreload" && s(o);
    }).observe(document, { childList: !0, subtree: !0 });
    function i(n) {
        const r = {};
        return (
            n.integrity && (r.integrity = n.integrity),
            n.referrerpolicy && (r.referrerPolicy = n.referrerpolicy),
            n.crossorigin === "use-credentials" ? (r.credentials = "include") : n.crossorigin === "anonymous" ? (r.credentials = "omit") : (r.credentials = "same-origin"),
            r
        );
    }
    function s(n) {
        if (n.ep) return;
        n.ep = !0;
        const r = i(n);
        fetch(n.href, r);
    }
})();
var Ke = 4294967295;
function Ko(e, t, i) {
    var s = i / 4294967296,
        n = i;
    e.setUint32(t, s), e.setUint32(t + 4, n);
}
function Br(e, t, i) {
    var s = Math.floor(i / 4294967296),
        n = i;
    e.setUint32(t, s), e.setUint32(t + 4, n);
}
function zr(e, t) {
    var i = e.getInt32(t),
        s = e.getUint32(t + 4);
    return i * 4294967296 + s;
}
function Jo(e, t) {
    var i = e.getUint32(t),
        s = e.getUint32(t + 4);
    return i * 4294967296 + s;
}
var Gi,
    Yi,
    $i,
    Pi = (typeof process > "u" || ((Gi = process == null ? void 0 : process.env) === null || Gi === void 0 ? void 0 : Gi.TEXT_ENCODING) !== "never") && typeof TextEncoder < "u" && typeof TextDecoder < "u";
function Cs(e) {
    for (var t = e.length, i = 0, s = 0; s < t; ) {
        var n = e.charCodeAt(s++);
        if (n & 4294967168)
            if (!(n & 4294965248)) i += 2;
            else {
                if (n >= 55296 && n <= 56319 && s < t) {
                    var r = e.charCodeAt(s);
                    (r & 64512) === 56320 && (++s, (n = ((n & 1023) << 10) + (r & 1023) + 65536));
                }
                n & 4294901760 ? (i += 4) : (i += 3);
            }
        else {
            i++;
            continue;
        }
    }
    return i;
}
function Qo(e, t, i) {
    for (var s = e.length, n = i, r = 0; r < s; ) {
        var o = e.charCodeAt(r++);
        if (o & 4294967168)
            if (!(o & 4294965248)) t[n++] = ((o >> 6) & 31) | 192;
            else {
                if (o >= 55296 && o <= 56319 && r < s) {
                    var l = e.charCodeAt(r);
                    (l & 64512) === 56320 && (++r, (o = ((o & 1023) << 10) + (l & 1023) + 65536));
                }
                o & 4294901760 ? ((t[n++] = ((o >> 18) & 7) | 240), (t[n++] = ((o >> 12) & 63) | 128), (t[n++] = ((o >> 6) & 63) | 128)) : ((t[n++] = ((o >> 12) & 15) | 224), (t[n++] = ((o >> 6) & 63) | 128));
            }
        else {
            t[n++] = o;
            continue;
        }
        t[n++] = (o & 63) | 128;
    }
}
var Ut = Pi ? new TextEncoder() : void 0,
    Zo = Pi ? (typeof process < "u" && ((Yi = process == null ? void 0 : process.env) === null || Yi === void 0 ? void 0 : Yi.TEXT_ENCODING) !== "force" ? 200 : 0) : Ke;
function jo(e, t, i) {
    t.set(Ut.encode(e), i);
}
function ea(e, t, i) {
    Ut.encodeInto(e, t.subarray(i));
}
var ta = Ut != null && Ut.encodeInto ? ea : jo,
    ia = 4096;
function Hr(e, t, i) {
    for (var s = t, n = s + i, r = [], o = ""; s < n; ) {
        var l = e[s++];
        if (!(l & 128)) r.push(l);
        else if ((l & 224) === 192) {
            var c = e[s++] & 63;
            r.push(((l & 31) << 6) | c);
        } else if ((l & 240) === 224) {
            var c = e[s++] & 63,
                a = e[s++] & 63;
            r.push(((l & 31) << 12) | (c << 6) | a);
        } else if ((l & 248) === 240) {
            var c = e[s++] & 63,
                a = e[s++] & 63,
                u = e[s++] & 63,
                p = ((l & 7) << 18) | (c << 12) | (a << 6) | u;
            p > 65535 && ((p -= 65536), r.push(((p >>> 10) & 1023) | 55296), (p = 56320 | (p & 1023))), r.push(p);
        } else r.push(l);
        r.length >= ia && ((o += String.fromCharCode.apply(String, r)), (r.length = 0));
    }
    return r.length > 0 && (o += String.fromCharCode.apply(String, r)), o;
}
var na = Pi ? new TextDecoder() : null,
    sa = Pi ? (typeof process < "u" && (($i = process == null ? void 0 : process.env) === null || $i === void 0 ? void 0 : $i.TEXT_DECODER) !== "force" ? 200 : 0) : Ke;
function ra(e, t, i) {
    var s = e.subarray(t, t + i);
    return na.decode(s);
}
var si = (function () {
        function e(t, i) {
            (this.type = t), (this.data = i);
        }
        return e;
    })(),
    oa =
        (globalThis && globalThis.__extends) ||
        (function () {
            var e = function (t, i) {
                return (
                    (e =
                        Object.setPrototypeOf ||
                        ({ __proto__: [] } instanceof Array &&
                            function (s, n) {
                                s.__proto__ = n;
                            }) ||
                        function (s, n) {
                            for (var r in n) Object.prototype.hasOwnProperty.call(n, r) && (s[r] = n[r]);
                        }),
                    e(t, i)
                );
            };
            return function (t, i) {
                if (typeof i != "function" && i !== null) throw new TypeError("Class extends value " + String(i) + " is not a constructor or null");
                e(t, i);
                function s() {
                    this.constructor = t;
                }
                t.prototype = i === null ? Object.create(i) : ((s.prototype = i.prototype), new s());
            };
        })(),
    Pe = (function (e) {
        oa(t, e);
        function t(i) {
            var s = e.call(this, i) || this,
                n = Object.create(t.prototype);
            return Object.setPrototypeOf(s, n), Object.defineProperty(s, "name", { configurable: !0, enumerable: !1, value: t.name }), s;
        }
        return t;
    })(Error),
    aa = -1,
    la = 4294967296 - 1,
    ca = 17179869184 - 1;
function ha(e) {
    var t = e.sec,
        i = e.nsec;
    if (t >= 0 && i >= 0 && t <= ca)
        if (i === 0 && t <= la) {
            var s = new Uint8Array(4),
                n = new DataView(s.buffer);
            return n.setUint32(0, t), s;
        } else {
            var r = t / 4294967296,
                o = t & 4294967295,
                s = new Uint8Array(8),
                n = new DataView(s.buffer);
            return n.setUint32(0, (i << 2) | (r & 3)), n.setUint32(4, o), s;
        }
    else {
        var s = new Uint8Array(12),
            n = new DataView(s.buffer);
        return n.setUint32(0, i), Br(n, 4, t), s;
    }
}
function fa(e) {
    var t = e.getTime(),
        i = Math.floor(t / 1e3),
        s = (t - i * 1e3) * 1e6,
        n = Math.floor(s / 1e9);
    return { sec: i + n, nsec: s - n * 1e9 };
}
function ua(e) {
    if (e instanceof Date) {
        var t = fa(e);
        return ha(t);
    } else return null;
}
function da(e) {
    var t = new DataView(e.buffer, e.byteOffset, e.byteLength);
    switch (e.byteLength) {
        case 4: {
            var i = t.getUint32(0),
                s = 0;
            return { sec: i, nsec: s };
        }
        case 8: {
            var n = t.getUint32(0),
                r = t.getUint32(4),
                i = (n & 3) * 4294967296 + r,
                s = n >>> 2;
            return { sec: i, nsec: s };
        }
        case 12: {
            var i = zr(t, 4),
                s = t.getUint32(0);
            return { sec: i, nsec: s };
        }
        default:
            throw new Pe("Unrecognized data size for timestamp (expected 4, 8, or 12): ".concat(e.length));
    }
}
function pa(e) {
    var t = da(e);
    return new Date(t.sec * 1e3 + t.nsec / 1e6);
}
var ma = { type: aa, encode: ua, decode: pa },
    Fr = (function () {
        function e() {
            (this.builtInEncoders = []), (this.builtInDecoders = []), (this.encoders = []), (this.decoders = []), this.register(ma);
        }
        return (
            (e.prototype.register = function (t) {
                var i = t.type,
                    s = t.encode,
                    n = t.decode;
                if (i >= 0) (this.encoders[i] = s), (this.decoders[i] = n);
                else {
                    var r = 1 + i;
                    (this.builtInEncoders[r] = s), (this.builtInDecoders[r] = n);
                }
            }),
            (e.prototype.tryToEncode = function (t, i) {
                for (var s = 0; s < this.builtInEncoders.length; s++) {
                    var n = this.builtInEncoders[s];
                    if (n != null) {
                        var r = n(t, i);
                        if (r != null) {
                            var o = -1 - s;
                            return new si(o, r);
                        }
                    }
                }
                for (var s = 0; s < this.encoders.length; s++) {
                    var n = this.encoders[s];
                    if (n != null) {
                        var r = n(t, i);
                        if (r != null) {
                            var o = s;
                            return new si(o, r);
                        }
                    }
                }
                return t instanceof si ? t : null;
            }),
            (e.prototype.decode = function (t, i, s) {
                var n = i < 0 ? this.builtInDecoders[-1 - i] : this.decoders[i];
                return n ? n(t, i, s) : new si(i, t);
            }),
            (e.defaultCodec = new e()),
            e
        );
    })();
function gi(e) {
    return e instanceof Uint8Array ? e : ArrayBuffer.isView(e) ? new Uint8Array(e.buffer, e.byteOffset, e.byteLength) : e instanceof ArrayBuffer ? new Uint8Array(e) : Uint8Array.from(e);
}
function ga(e) {
    if (e instanceof ArrayBuffer) return new DataView(e);
    var t = gi(e);
    return new DataView(t.buffer, t.byteOffset, t.byteLength);
}
var ya = 100,
    wa = 2048,
    ka = (function () {
        function e(t, i, s, n, r, o, l, c) {
            t === void 0 && (t = Fr.defaultCodec),
                i === void 0 && (i = void 0),
                s === void 0 && (s = ya),
                n === void 0 && (n = wa),
                r === void 0 && (r = !1),
                o === void 0 && (o = !1),
                l === void 0 && (l = !1),
                c === void 0 && (c = !1),
                (this.extensionCodec = t),
                (this.context = i),
                (this.maxDepth = s),
                (this.initialBufferSize = n),
                (this.sortKeys = r),
                (this.forceFloat32 = o),
                (this.ignoreUndefined = l),
                (this.forceIntegerToFloat = c),
                (this.pos = 0),
                (this.view = new DataView(new ArrayBuffer(this.initialBufferSize))),
                (this.bytes = new Uint8Array(this.view.buffer));
        }
        return (
            (e.prototype.reinitializeState = function () {
                this.pos = 0;
            }),
            (e.prototype.encodeSharedRef = function (t) {
                return this.reinitializeState(), this.doEncode(t, 1), this.bytes.subarray(0, this.pos);
            }),
            (e.prototype.encode = function (t) {
                return this.reinitializeState(), this.doEncode(t, 1), this.bytes.slice(0, this.pos);
            }),
            (e.prototype.doEncode = function (t, i) {
                if (i > this.maxDepth) throw new Error("Too deep objects in depth ".concat(i));
                t == null ? this.encodeNil() : typeof t == "boolean" ? this.encodeBoolean(t) : typeof t == "number" ? this.encodeNumber(t) : typeof t == "string" ? this.encodeString(t) : this.encodeObject(t, i);
            }),
            (e.prototype.ensureBufferSizeToWrite = function (t) {
                var i = this.pos + t;
                this.view.byteLength < i && this.resizeBuffer(i * 2);
            }),
            (e.prototype.resizeBuffer = function (t) {
                var i = new ArrayBuffer(t),
                    s = new Uint8Array(i),
                    n = new DataView(i);
                s.set(this.bytes), (this.view = n), (this.bytes = s);
            }),
            (e.prototype.encodeNil = function () {
                this.writeU8(192);
            }),
            (e.prototype.encodeBoolean = function (t) {
                t === !1 ? this.writeU8(194) : this.writeU8(195);
            }),
            (e.prototype.encodeNumber = function (t) {
                Number.isSafeInteger(t) && !this.forceIntegerToFloat
                    ? t >= 0
                        ? t < 128
                            ? this.writeU8(t)
                            : t < 256
                            ? (this.writeU8(204), this.writeU8(t))
                            : t < 65536
                            ? (this.writeU8(205), this.writeU16(t))
                            : t < 4294967296
                            ? (this.writeU8(206), this.writeU32(t))
                            : (this.writeU8(207), this.writeU64(t))
                        : t >= -32
                        ? this.writeU8(224 | (t + 32))
                        : t >= -128
                        ? (this.writeU8(208), this.writeI8(t))
                        : t >= -32768
                        ? (this.writeU8(209), this.writeI16(t))
                        : t >= -2147483648
                        ? (this.writeU8(210), this.writeI32(t))
                        : (this.writeU8(211), this.writeI64(t))
                    : this.forceFloat32
                    ? (this.writeU8(202), this.writeF32(t))
                    : (this.writeU8(203), this.writeF64(t));
            }),
            (e.prototype.writeStringHeader = function (t) {
                if (t < 32) this.writeU8(160 + t);
                else if (t < 256) this.writeU8(217), this.writeU8(t);
                else if (t < 65536) this.writeU8(218), this.writeU16(t);
                else if (t < 4294967296) this.writeU8(219), this.writeU32(t);
                else throw new Error("Too long string: ".concat(t, " bytes in UTF-8"));
            }),
            (e.prototype.encodeString = function (t) {
                var i = 5,
                    s = t.length;
                if (s > Zo) {
                    var n = Cs(t);
                    this.ensureBufferSizeToWrite(i + n), this.writeStringHeader(n), ta(t, this.bytes, this.pos), (this.pos += n);
                } else {
                    var n = Cs(t);
                    this.ensureBufferSizeToWrite(i + n), this.writeStringHeader(n), Qo(t, this.bytes, this.pos), (this.pos += n);
                }
            }),
            (e.prototype.encodeObject = function (t, i) {
                var s = this.extensionCodec.tryToEncode(t, this.context);
                if (s != null) this.encodeExtension(s);
                else if (Array.isArray(t)) this.encodeArray(t, i);
                else if (ArrayBuffer.isView(t)) this.encodeBinary(t);
                else if (typeof t == "object") this.encodeMap(t, i);
                else throw new Error("Unrecognized object: ".concat(Object.prototype.toString.apply(t)));
            }),
            (e.prototype.encodeBinary = function (t) {
                var i = t.byteLength;
                if (i < 256) this.writeU8(196), this.writeU8(i);
                else if (i < 65536) this.writeU8(197), this.writeU16(i);
                else if (i < 4294967296) this.writeU8(198), this.writeU32(i);
                else throw new Error("Too large binary: ".concat(i));
                var s = gi(t);
                this.writeU8a(s);
            }),
            (e.prototype.encodeArray = function (t, i) {
                var s = t.length;
                if (s < 16) this.writeU8(144 + s);
                else if (s < 65536) this.writeU8(220), this.writeU16(s);
                else if (s < 4294967296) this.writeU8(221), this.writeU32(s);
                else throw new Error("Too large array: ".concat(s));
                for (var n = 0, r = t; n < r.length; n++) {
                    var o = r[n];
                    this.doEncode(o, i + 1);
                }
            }),
            (e.prototype.countWithoutUndefined = function (t, i) {
                for (var s = 0, n = 0, r = i; n < r.length; n++) {
                    var o = r[n];
                    t[o] !== void 0 && s++;
                }
                return s;
            }),
            (e.prototype.encodeMap = function (t, i) {
                var s = Object.keys(t);
                this.sortKeys && s.sort();
                var n = this.ignoreUndefined ? this.countWithoutUndefined(t, s) : s.length;
                if (n < 16) this.writeU8(128 + n);
                else if (n < 65536) this.writeU8(222), this.writeU16(n);
                else if (n < 4294967296) this.writeU8(223), this.writeU32(n);
                else throw new Error("Too large map object: ".concat(n));
                for (var r = 0, o = s; r < o.length; r++) {
                    var l = o[r],
                        c = t[l];
                    (this.ignoreUndefined && c === void 0) || (this.encodeString(l), this.doEncode(c, i + 1));
                }
            }),
            (e.prototype.encodeExtension = function (t) {
                var i = t.data.length;
                if (i === 1) this.writeU8(212);
                else if (i === 2) this.writeU8(213);
                else if (i === 4) this.writeU8(214);
                else if (i === 8) this.writeU8(215);
                else if (i === 16) this.writeU8(216);
                else if (i < 256) this.writeU8(199), this.writeU8(i);
                else if (i < 65536) this.writeU8(200), this.writeU16(i);
                else if (i < 4294967296) this.writeU8(201), this.writeU32(i);
                else throw new Error("Too large extension object: ".concat(i));
                this.writeI8(t.type), this.writeU8a(t.data);
            }),
            (e.prototype.writeU8 = function (t) {
                this.ensureBufferSizeToWrite(1), this.view.setUint8(this.pos, t), this.pos++;
            }),
            (e.prototype.writeU8a = function (t) {
                var i = t.length;
                this.ensureBufferSizeToWrite(i), this.bytes.set(t, this.pos), (this.pos += i);
            }),
            (e.prototype.writeI8 = function (t) {
                this.ensureBufferSizeToWrite(1), this.view.setInt8(this.pos, t), this.pos++;
            }),
            (e.prototype.writeU16 = function (t) {
                this.ensureBufferSizeToWrite(2), this.view.setUint16(this.pos, t), (this.pos += 2);
            }),
            (e.prototype.writeI16 = function (t) {
                this.ensureBufferSizeToWrite(2), this.view.setInt16(this.pos, t), (this.pos += 2);
            }),
            (e.prototype.writeU32 = function (t) {
                this.ensureBufferSizeToWrite(4), this.view.setUint32(this.pos, t), (this.pos += 4);
            }),
            (e.prototype.writeI32 = function (t) {
                this.ensureBufferSizeToWrite(4), this.view.setInt32(this.pos, t), (this.pos += 4);
            }),
            (e.prototype.writeF32 = function (t) {
                this.ensureBufferSizeToWrite(4), this.view.setFloat32(this.pos, t), (this.pos += 4);
            }),
            (e.prototype.writeF64 = function (t) {
                this.ensureBufferSizeToWrite(8), this.view.setFloat64(this.pos, t), (this.pos += 8);
            }),
            (e.prototype.writeU64 = function (t) {
                this.ensureBufferSizeToWrite(8), Ko(this.view, this.pos, t), (this.pos += 8);
            }),
            (e.prototype.writeI64 = function (t) {
                this.ensureBufferSizeToWrite(8), Br(this.view, this.pos, t), (this.pos += 8);
            }),
            e
        );
    })();
function Ki(e) {
    return "".concat(e < 0 ? "-" : "", "0x").concat(Math.abs(e).toString(16).padStart(2, "0"));
}
var va = 16,
    xa = 16,
    ba = (function () {
        function e(t, i) {
            t === void 0 && (t = va), i === void 0 && (i = xa), (this.maxKeyLength = t), (this.maxLengthPerKey = i), (this.hit = 0), (this.miss = 0), (this.caches = []);
            for (var s = 0; s < this.maxKeyLength; s++) this.caches.push([]);
        }
        return (
            (e.prototype.canBeCached = function (t) {
                return t > 0 && t <= this.maxKeyLength;
            }),
            (e.prototype.find = function (t, i, s) {
                var n = this.caches[s - 1];
                e: for (var r = 0, o = n; r < o.length; r++) {
                    for (var l = o[r], c = l.bytes, a = 0; a < s; a++) if (c[a] !== t[i + a]) continue e;
                    return l.str;
                }
                return null;
            }),
            (e.prototype.store = function (t, i) {
                var s = this.caches[t.length - 1],
                    n = { bytes: t, str: i };
                s.length >= this.maxLengthPerKey ? (s[(Math.random() * s.length) | 0] = n) : s.push(n);
            }),
            (e.prototype.decode = function (t, i, s) {
                var n = this.find(t, i, s);
                if (n != null) return this.hit++, n;
                this.miss++;
                var r = Hr(t, i, s),
                    o = Uint8Array.prototype.slice.call(t, i, i + s);
                return this.store(o, r), r;
            }),
            e
        );
    })(),
    Sa =
        (globalThis && globalThis.__awaiter) ||
        function (e, t, i, s) {
            function n(r) {
                return r instanceof i
                    ? r
                    : new i(function (o) {
                          o(r);
                      });
            }
            return new (i || (i = Promise))(function (r, o) {
                function l(u) {
                    try {
                        a(s.next(u));
                    } catch (p) {
                        o(p);
                    }
                }
                function c(u) {
                    try {
                        a(s.throw(u));
                    } catch (p) {
                        o(p);
                    }
                }
                function a(u) {
                    u.done ? r(u.value) : n(u.value).then(l, c);
                }
                a((s = s.apply(e, t || [])).next());
            });
        },
    Ji =
        (globalThis && globalThis.__generator) ||
        function (e, t) {
            var i = {
                    label: 0,
                    sent: function () {
                        if (r[0] & 1) throw r[1];
                        return r[1];
                    },
                    trys: [],
                    ops: [],
                },
                s,
                n,
                r,
                o;
            return (
                (o = { next: l(0), throw: l(1), return: l(2) }),
                typeof Symbol == "function" &&
                    (o[Symbol.iterator] = function () {
                        return this;
                    }),
                o
            );
            function l(a) {
                return function (u) {
                    return c([a, u]);
                };
            }
            function c(a) {
                if (s) throw new TypeError("Generator is already executing.");
                for (; i; )
                    try {
                        if (((s = 1), n && (r = a[0] & 2 ? n.return : a[0] ? n.throw || ((r = n.return) && r.call(n), 0) : n.next) && !(r = r.call(n, a[1])).done)) return r;
                        switch (((n = 0), r && (a = [a[0] & 2, r.value]), a[0])) {
                            case 0:
                            case 1:
                                r = a;
                                break;
                            case 4:
                                return i.label++, { value: a[1], done: !1 };
                            case 5:
                                i.label++, (n = a[1]), (a = [0]);
                                continue;
                            case 7:
                                (a = i.ops.pop()), i.trys.pop();
                                continue;
                            default:
                                if (((r = i.trys), !(r = r.length > 0 && r[r.length - 1]) && (a[0] === 6 || a[0] === 2))) {
                                    i = 0;
                                    continue;
                                }
                                if (a[0] === 3 && (!r || (a[1] > r[0] && a[1] < r[3]))) {
                                    i.label = a[1];
                                    break;
                                }
                                if (a[0] === 6 && i.label < r[1]) {
                                    (i.label = r[1]), (r = a);
                                    break;
                                }
                                if (r && i.label < r[2]) {
                                    (i.label = r[2]), i.ops.push(a);
                                    break;
                                }
                                r[2] && i.ops.pop(), i.trys.pop();
                                continue;
                        }
                        a = t.call(e, i);
                    } catch (u) {
                        (a = [6, u]), (n = 0);
                    } finally {
                        s = r = 0;
                    }
                if (a[0] & 5) throw a[1];
                return { value: a[0] ? a[1] : void 0, done: !0 };
            }
        },
    As =
        (globalThis && globalThis.__asyncValues) ||
        function (e) {
            if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
            var t = e[Symbol.asyncIterator],
                i;
            return t
                ? t.call(e)
                : ((e = typeof __values == "function" ? __values(e) : e[Symbol.iterator]()),
                  (i = {}),
                  s("next"),
                  s("throw"),
                  s("return"),
                  (i[Symbol.asyncIterator] = function () {
                      return this;
                  }),
                  i);
            function s(r) {
                i[r] =
                    e[r] &&
                    function (o) {
                        return new Promise(function (l, c) {
                            (o = e[r](o)), n(l, c, o.done, o.value);
                        });
                    };
            }
            function n(r, o, l, c) {
                Promise.resolve(c).then(function (a) {
                    r({ value: a, done: l });
                }, o);
            }
        },
    St =
        (globalThis && globalThis.__await) ||
        function (e) {
            return this instanceof St ? ((this.v = e), this) : new St(e);
        },
    Ta =
        (globalThis && globalThis.__asyncGenerator) ||
        function (e, t, i) {
            if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
            var s = i.apply(e, t || []),
                n,
                r = [];
            return (
                (n = {}),
                o("next"),
                o("throw"),
                o("return"),
                (n[Symbol.asyncIterator] = function () {
                    return this;
                }),
                n
            );
            function o(h) {
                s[h] &&
                    (n[h] = function (m) {
                        return new Promise(function (w, v) {
                            r.push([h, m, w, v]) > 1 || l(h, m);
                        });
                    });
            }
            function l(h, m) {
                try {
                    c(s[h](m));
                } catch (w) {
                    p(r[0][3], w);
                }
            }
            function c(h) {
                h.value instanceof St ? Promise.resolve(h.value.v).then(a, u) : p(r[0][2], h);
            }
            function a(h) {
                l("next", h);
            }
            function u(h) {
                l("throw", h);
            }
            function p(h, m) {
                h(m), r.shift(), r.length && l(r[0][0], r[0][1]);
            }
        },
    Ia = function (e) {
        var t = typeof e;
        return t === "string" || t === "number";
    },
    Dt = -1,
    es = new DataView(new ArrayBuffer(0)),
    Ma = new Uint8Array(es.buffer),
    Cn = (function () {
        try {
            es.getInt8(0);
        } catch (e) {
            return e.constructor;
        }
        throw new Error("never reached");
    })(),
    Ds = new Cn("Insufficient data"),
    Ea = new ba(),
    Pa = (function () {
        function e(t, i, s, n, r, o, l, c) {
            t === void 0 && (t = Fr.defaultCodec),
                i === void 0 && (i = void 0),
                s === void 0 && (s = Ke),
                n === void 0 && (n = Ke),
                r === void 0 && (r = Ke),
                o === void 0 && (o = Ke),
                l === void 0 && (l = Ke),
                c === void 0 && (c = Ea),
                (this.extensionCodec = t),
                (this.context = i),
                (this.maxStrLength = s),
                (this.maxBinLength = n),
                (this.maxArrayLength = r),
                (this.maxMapLength = o),
                (this.maxExtLength = l),
                (this.keyDecoder = c),
                (this.totalPos = 0),
                (this.pos = 0),
                (this.view = es),
                (this.bytes = Ma),
                (this.headByte = Dt),
                (this.stack = []);
        }
        return (
            (e.prototype.reinitializeState = function () {
                (this.totalPos = 0), (this.headByte = Dt), (this.stack.length = 0);
            }),
            (e.prototype.setBuffer = function (t) {
                (this.bytes = gi(t)), (this.view = ga(this.bytes)), (this.pos = 0);
            }),
            (e.prototype.appendBuffer = function (t) {
                if (this.headByte === Dt && !this.hasRemaining(1)) this.setBuffer(t);
                else {
                    var i = this.bytes.subarray(this.pos),
                        s = gi(t),
                        n = new Uint8Array(i.length + s.length);
                    n.set(i), n.set(s, i.length), this.setBuffer(n);
                }
            }),
            (e.prototype.hasRemaining = function (t) {
                return this.view.byteLength - this.pos >= t;
            }),
            (e.prototype.createExtraByteError = function (t) {
                var i = this,
                    s = i.view,
                    n = i.pos;
                return new RangeError(
                    "Extra "
                        .concat(s.byteLength - n, " of ")
                        .concat(s.byteLength, " byte(s) found at buffer[")
                        .concat(t, "]")
                );
            }),
            (e.prototype.decode = function (t) {
                this.reinitializeState(), this.setBuffer(t);
                var i = this.doDecodeSync();
                if (this.hasRemaining(1)) throw this.createExtraByteError(this.pos);
                return i;
            }),
            (e.prototype.decodeMulti = function (t) {
                return Ji(this, function (i) {
                    switch (i.label) {
                        case 0:
                            this.reinitializeState(), this.setBuffer(t), (i.label = 1);
                        case 1:
                            return this.hasRemaining(1) ? [4, this.doDecodeSync()] : [3, 3];
                        case 2:
                            return i.sent(), [3, 1];
                        case 3:
                            return [2];
                    }
                });
            }),
            (e.prototype.decodeAsync = function (t) {
                var i, s, n, r;
                return Sa(this, void 0, void 0, function () {
                    var o, l, c, a, u, p, h, m;
                    return Ji(this, function (w) {
                        switch (w.label) {
                            case 0:
                                (o = !1), (w.label = 1);
                            case 1:
                                w.trys.push([1, 6, 7, 12]), (i = As(t)), (w.label = 2);
                            case 2:
                                return [4, i.next()];
                            case 3:
                                if (((s = w.sent()), !!s.done)) return [3, 5];
                                if (((c = s.value), o)) throw this.createExtraByteError(this.totalPos);
                                this.appendBuffer(c);
                                try {
                                    (l = this.doDecodeSync()), (o = !0);
                                } catch (v) {
                                    if (!(v instanceof Cn)) throw v;
                                }
                                (this.totalPos += this.pos), (w.label = 4);
                            case 4:
                                return [3, 2];
                            case 5:
                                return [3, 12];
                            case 6:
                                return (a = w.sent()), (n = { error: a }), [3, 12];
                            case 7:
                                return w.trys.push([7, , 10, 11]), s && !s.done && (r = i.return) ? [4, r.call(i)] : [3, 9];
                            case 8:
                                w.sent(), (w.label = 9);
                            case 9:
                                return [3, 11];
                            case 10:
                                if (n) throw n.error;
                                return [7];
                            case 11:
                                return [7];
                            case 12:
                                if (o) {
                                    if (this.hasRemaining(1)) throw this.createExtraByteError(this.totalPos);
                                    return [2, l];
                                }
                                throw ((u = this), (p = u.headByte), (h = u.pos), (m = u.totalPos), new RangeError("Insufficient data in parsing ".concat(Ki(p), " at ").concat(m, " (").concat(h, " in the current buffer)")));
                        }
                    });
                });
            }),
            (e.prototype.decodeArrayStream = function (t) {
                return this.decodeMultiAsync(t, !0);
            }),
            (e.prototype.decodeStream = function (t) {
                return this.decodeMultiAsync(t, !1);
            }),
            (e.prototype.decodeMultiAsync = function (t, i) {
                return Ta(this, arguments, function () {
                    var n, r, o, l, c, a, u, p, h;
                    return Ji(this, function (m) {
                        switch (m.label) {
                            case 0:
                                (n = i), (r = -1), (m.label = 1);
                            case 1:
                                m.trys.push([1, 13, 14, 19]), (o = As(t)), (m.label = 2);
                            case 2:
                                return [4, St(o.next())];
                            case 3:
                                if (((l = m.sent()), !!l.done)) return [3, 12];
                                if (((c = l.value), i && r === 0)) throw this.createExtraByteError(this.totalPos);
                                this.appendBuffer(c), n && ((r = this.readArraySize()), (n = !1), this.complete()), (m.label = 4);
                            case 4:
                                m.trys.push([4, 9, , 10]), (m.label = 5);
                            case 5:
                                return [4, St(this.doDecodeSync())];
                            case 6:
                                return [4, m.sent()];
                            case 7:
                                return m.sent(), --r === 0 ? [3, 8] : [3, 5];
                            case 8:
                                return [3, 10];
                            case 9:
                                if (((a = m.sent()), !(a instanceof Cn))) throw a;
                                return [3, 10];
                            case 10:
                                (this.totalPos += this.pos), (m.label = 11);
                            case 11:
                                return [3, 2];
                            case 12:
                                return [3, 19];
                            case 13:
                                return (u = m.sent()), (p = { error: u }), [3, 19];
                            case 14:
                                return m.trys.push([14, , 17, 18]), l && !l.done && (h = o.return) ? [4, St(h.call(o))] : [3, 16];
                            case 15:
                                m.sent(), (m.label = 16);
                            case 16:
                                return [3, 18];
                            case 17:
                                if (p) throw p.error;
                                return [7];
                            case 18:
                                return [7];
                            case 19:
                                return [2];
                        }
                    });
                });
            }),
            (e.prototype.doDecodeSync = function () {
                e: for (;;) {
                    var t = this.readHeadByte(),
                        i = void 0;
                    if (t >= 224) i = t - 256;
                    else if (t < 192)
                        if (t < 128) i = t;
                        else if (t < 144) {
                            var s = t - 128;
                            if (s !== 0) {
                                this.pushMapState(s), this.complete();
                                continue e;
                            } else i = {};
                        } else if (t < 160) {
                            var s = t - 144;
                            if (s !== 0) {
                                this.pushArrayState(s), this.complete();
                                continue e;
                            } else i = [];
                        } else {
                            var n = t - 160;
                            i = this.decodeUtf8String(n, 0);
                        }
                    else if (t === 192) i = null;
                    else if (t === 194) i = !1;
                    else if (t === 195) i = !0;
                    else if (t === 202) i = this.readF32();
                    else if (t === 203) i = this.readF64();
                    else if (t === 204) i = this.readU8();
                    else if (t === 205) i = this.readU16();
                    else if (t === 206) i = this.readU32();
                    else if (t === 207) i = this.readU64();
                    else if (t === 208) i = this.readI8();
                    else if (t === 209) i = this.readI16();
                    else if (t === 210) i = this.readI32();
                    else if (t === 211) i = this.readI64();
                    else if (t === 217) {
                        var n = this.lookU8();
                        i = this.decodeUtf8String(n, 1);
                    } else if (t === 218) {
                        var n = this.lookU16();
                        i = this.decodeUtf8String(n, 2);
                    } else if (t === 219) {
                        var n = this.lookU32();
                        i = this.decodeUtf8String(n, 4);
                    } else if (t === 220) {
                        var s = this.readU16();
                        if (s !== 0) {
                            this.pushArrayState(s), this.complete();
                            continue e;
                        } else i = [];
                    } else if (t === 221) {
                        var s = this.readU32();
                        if (s !== 0) {
                            this.pushArrayState(s), this.complete();
                            continue e;
                        } else i = [];
                    } else if (t === 222) {
                        var s = this.readU16();
                        if (s !== 0) {
                            this.pushMapState(s), this.complete();
                            continue e;
                        } else i = {};
                    } else if (t === 223) {
                        var s = this.readU32();
                        if (s !== 0) {
                            this.pushMapState(s), this.complete();
                            continue e;
                        } else i = {};
                    } else if (t === 196) {
                        var s = this.lookU8();
                        i = this.decodeBinary(s, 1);
                    } else if (t === 197) {
                        var s = this.lookU16();
                        i = this.decodeBinary(s, 2);
                    } else if (t === 198) {
                        var s = this.lookU32();
                        i = this.decodeBinary(s, 4);
                    } else if (t === 212) i = this.decodeExtension(1, 0);
                    else if (t === 213) i = this.decodeExtension(2, 0);
                    else if (t === 214) i = this.decodeExtension(4, 0);
                    else if (t === 215) i = this.decodeExtension(8, 0);
                    else if (t === 216) i = this.decodeExtension(16, 0);
                    else if (t === 199) {
                        var s = this.lookU8();
                        i = this.decodeExtension(s, 1);
                    } else if (t === 200) {
                        var s = this.lookU16();
                        i = this.decodeExtension(s, 2);
                    } else if (t === 201) {
                        var s = this.lookU32();
                        i = this.decodeExtension(s, 4);
                    } else throw new Pe("Unrecognized type byte: ".concat(Ki(t)));
                    this.complete();
                    for (var r = this.stack; r.length > 0; ) {
                        var o = r[r.length - 1];
                        if (o.type === 0)
                            if (((o.array[o.position] = i), o.position++, o.position === o.size)) r.pop(), (i = o.array);
                            else continue e;
                        else if (o.type === 1) {
                            if (!Ia(i)) throw new Pe("The type of key must be string or number but " + typeof i);
                            if (i === "__proto__") throw new Pe("The key __proto__ is not allowed");
                            (o.key = i), (o.type = 2);
                            continue e;
                        } else if (((o.map[o.key] = i), o.readCount++, o.readCount === o.size)) r.pop(), (i = o.map);
                        else {
                            (o.key = null), (o.type = 1);
                            continue e;
                        }
                    }
                    return i;
                }
            }),
            (e.prototype.readHeadByte = function () {
                return this.headByte === Dt && (this.headByte = this.readU8()), this.headByte;
            }),
            (e.prototype.complete = function () {
                this.headByte = Dt;
            }),
            (e.prototype.readArraySize = function () {
                var t = this.readHeadByte();
                switch (t) {
                    case 220:
                        return this.readU16();
                    case 221:
                        return this.readU32();
                    default: {
                        if (t < 160) return t - 144;
                        throw new Pe("Unrecognized array type byte: ".concat(Ki(t)));
                    }
                }
            }),
            (e.prototype.pushMapState = function (t) {
                if (t > this.maxMapLength) throw new Pe("Max length exceeded: map length (".concat(t, ") > maxMapLengthLength (").concat(this.maxMapLength, ")"));
                this.stack.push({ type: 1, size: t, key: null, readCount: 0, map: {} });
            }),
            (e.prototype.pushArrayState = function (t) {
                if (t > this.maxArrayLength) throw new Pe("Max length exceeded: array length (".concat(t, ") > maxArrayLength (").concat(this.maxArrayLength, ")"));
                this.stack.push({ type: 0, size: t, array: new Array(t), position: 0 });
            }),
            (e.prototype.decodeUtf8String = function (t, i) {
                var s;
                if (t > this.maxStrLength) throw new Pe("Max length exceeded: UTF-8 byte length (".concat(t, ") > maxStrLength (").concat(this.maxStrLength, ")"));
                if (this.bytes.byteLength < this.pos + i + t) throw Ds;
                var n = this.pos + i,
                    r;
                return (
                    this.stateIsMapKey() && !((s = this.keyDecoder) === null || s === void 0) && s.canBeCached(t) ? (r = this.keyDecoder.decode(this.bytes, n, t)) : t > sa ? (r = ra(this.bytes, n, t)) : (r = Hr(this.bytes, n, t)),
                    (this.pos += i + t),
                    r
                );
            }),
            (e.prototype.stateIsMapKey = function () {
                if (this.stack.length > 0) {
                    var t = this.stack[this.stack.length - 1];
                    return t.type === 1;
                }
                return !1;
            }),
            (e.prototype.decodeBinary = function (t, i) {
                if (t > this.maxBinLength) throw new Pe("Max length exceeded: bin length (".concat(t, ") > maxBinLength (").concat(this.maxBinLength, ")"));
                if (!this.hasRemaining(t + i)) throw Ds;
                var s = this.pos + i,
                    n = this.bytes.subarray(s, s + t);
                return (this.pos += i + t), n;
            }),
            (e.prototype.decodeExtension = function (t, i) {
                if (t > this.maxExtLength) throw new Pe("Max length exceeded: ext length (".concat(t, ") > maxExtLength (").concat(this.maxExtLength, ")"));
                var s = this.view.getInt8(this.pos + i),
                    n = this.decodeBinary(t, i + 1);
                return this.extensionCodec.decode(n, s, this.context);
            }),
            (e.prototype.lookU8 = function () {
                return this.view.getUint8(this.pos);
            }),
            (e.prototype.lookU16 = function () {
                return this.view.getUint16(this.pos);
            }),
            (e.prototype.lookU32 = function () {
                return this.view.getUint32(this.pos);
            }),
            (e.prototype.readU8 = function () {
                var t = this.view.getUint8(this.pos);
                return this.pos++, t;
            }),
            (e.prototype.readI8 = function () {
                var t = this.view.getInt8(this.pos);
                return this.pos++, t;
            }),
            (e.prototype.readU16 = function () {
                var t = this.view.getUint16(this.pos);
                return (this.pos += 2), t;
            }),
            (e.prototype.readI16 = function () {
                var t = this.view.getInt16(this.pos);
                return (this.pos += 2), t;
            }),
            (e.prototype.readU32 = function () {
                var t = this.view.getUint32(this.pos);
                return (this.pos += 4), t;
            }),
            (e.prototype.readI32 = function () {
                var t = this.view.getInt32(this.pos);
                return (this.pos += 4), t;
            }),
            (e.prototype.readU64 = function () {
                var t = Jo(this.view, this.pos);
                return (this.pos += 8), t;
            }),
            (e.prototype.readI64 = function () {
                var t = zr(this.view, this.pos);
                return (this.pos += 8), t;
            }),
            (e.prototype.readF32 = function () {
                var t = this.view.getFloat32(this.pos);
                return (this.pos += 4), t;
            }),
            (e.prototype.readF64 = function () {
                var t = this.view.getFloat64(this.pos);
                return (this.pos += 8), t;
            }),
            e
        );
    })(),
    rt = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {},
    $t = {},
    Ca = {
        get exports() {
            return $t;
        },
        set exports(e) {
            $t = e;
        },
    },
    le = (Ca.exports = {}),
    Ce,
    Ae;
function An() {
    throw new Error("setTimeout has not been defined");
}
function Dn() {
    throw new Error("clearTimeout has not been defined");
}
(function () {
    try {
        typeof setTimeout == "function" ? (Ce = setTimeout) : (Ce = An);
    } catch {
        Ce = An;
    }
    try {
        typeof clearTimeout == "function" ? (Ae = clearTimeout) : (Ae = Dn);
    } catch {
        Ae = Dn;
    }
})();
function Vr(e) {
    if (Ce === setTimeout) return setTimeout(e, 0);
    if ((Ce === An || !Ce) && setTimeout) return (Ce = setTimeout), setTimeout(e, 0);
    try {
        return Ce(e, 0);
    } catch {
        try {
            return Ce.call(null, e, 0);
        } catch {
            return Ce.call(this, e, 0);
        }
    }
}
function Aa(e) {
    if (Ae === clearTimeout) return clearTimeout(e);
    if ((Ae === Dn || !Ae) && clearTimeout) return (Ae = clearTimeout), clearTimeout(e);
    try {
        return Ae(e);
    } catch {
        try {
            return Ae.call(null, e);
        } catch {
            return Ae.call(this, e);
        }
    }
}
var ze = [],
    Tt = !1,
    Qe,
    li = -1;
function Da() {
    !Tt || !Qe || ((Tt = !1), Qe.length ? (ze = Qe.concat(ze)) : (li = -1), ze.length && Ur());
}
function Ur() {
    if (!Tt) {
        var e = Vr(Da);
        Tt = !0;
        for (var t = ze.length; t; ) {
            for (Qe = ze, ze = []; ++li < t; ) Qe && Qe[li].run();
            (li = -1), (t = ze.length);
        }
        (Qe = null), (Tt = !1), Aa(e);
    }
}
le.nextTick = function (e) {
    var t = new Array(arguments.length - 1);
    if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) t[i - 1] = arguments[i];
    ze.push(new Lr(e, t)), ze.length === 1 && !Tt && Vr(Ur);
};
function Lr(e, t) {
    (this.fun = e), (this.array = t);
}
Lr.prototype.run = function () {
    this.fun.apply(null, this.array);
};
le.title = "browser";
le.browser = !0;
le.env = {};
le.argv = [];
le.version = "";
le.versions = {};
function Fe() {}
le.on = Fe;
le.addListener = Fe;
le.once = Fe;
le.off = Fe;
le.removeListener = Fe;
le.removeAllListeners = Fe;
le.emit = Fe;
le.prependListener = Fe;
le.prependOnceListener = Fe;
le.listeners = function (e) {
    return [];
};
le.binding = function (e) {
    throw new Error("process.binding is not supported");
};
le.cwd = function () {
    return "/";
};
le.chdir = function (e) {
    throw new Error("process.chdir is not supported");
};
le.umask = function () {
    return 0;
};
const Oa = 1920,
    Ra = 1080,
    _a = 9,
    Nr = $t && $t.argv.indexOf("--largeserver") != -1 ? 80 : 40,
    Ba = Nr + 10,
    za = 6,
    Ha = 3e3,
    Fa = 10,
    Va = 5,
    Ua = 50,
    La = 4.5,
    Na = 15,
    qa = 0.9,
    Wa = 3e3,
    Xa = 60,
    Ga = 35,
    Ya = 3e3,
    $a = 500,
    Ka = $t && {}.IS_SANDBOX,
    Ja = 100,
    Qa = Math.PI / 2.6,
    Za = 10,
    ja = 0.25,
    el = Math.PI / 2,
    tl = 35,
    il = 0.0016,
    nl = 0.993,
    sl = 34,
    rl = ["#bf8f54", "#cbb091", "#896c4b", "#fadadc", "#ececec", "#c37373", "#4c4c4c", "#ecaff7", "#738cc3", "#8bc373"],
    ol = 7,
    al = 0.06,
    ll = [
        "Sid",
        "Steph",
        "Bmoe",
        "Romn",
        "Jononthecool",
        "Fiona",
        "Vince",
        "Nathan",
        "Nick",
        "Flappy",
        "Ronald",
        "Otis",
        "Pepe",
        "Mc Donald",
        "Theo",
        "Fabz",
        "Oliver",
        "Jeff",
        "Jimmy",
        "Helena",
        "Reaper",
        "Ben",
        "Alan",
        "Naomi",
        "XYZ",
        "Clever",
        "Jeremy",
        "Mike",
        "Destined",
        "Stallion",
        "Allison",
        "Meaty",
        "Sophia",
        "Vaja",
        "Joey",
        "Pendy",
        "Murdoch",
        "Theo",
        "Jared",
        "July",
        "Sonia",
        "Mel",
        "Dexter",
        "Quinn",
        "Milky",
    ],
    cl = Math.PI / 3,
    ci = [
        { id: 0, src: "", xp: 0, val: 1 },
        { id: 1, src: "_g", xp: 3e3, val: 1.1 },
        { id: 2, src: "_d", xp: 7e3, val: 1.18 },
        { id: 3, src: "_r", poison: !0, xp: 12e3, val: 1.18 },
    ],
    hl = function (e) {
        const t = e.weaponXP[e.weaponIndex] || 0;
        for (let i = ci.length - 1; i >= 0; --i) if (t >= ci[i].xp) return ci[i];
    },
    fl = ["wood", "food", "stone", "points"],
    ul = 7,
    dl = 9,
    pl = 3,
    ml = 32,
    gl = 7,
    yl = 724,
    wl = 114,
    kl = 0.0011,
    vl = 1e-4,
    xl = 1.3,
    bl = [150, 160, 165, 175],
    Sl = [80, 85, 95],
    Tl = [80, 85, 90],
    Il = 2400,
    Ml = 0.75,
    El = 15,
    ts = 14400,
    Pl = 40,
    Cl = 2200,
    Al = 0.6,
    Dl = 1,
    Ol = 0.3,
    Rl = 0.3,
    _l = 144e4,
    is = 320,
    Bl = 100,
    zl = 2,
    Hl = 3200,
    Fl = 1440,
    Vl = 0.2,
    Ul = -1,
    Ll = ts - is - 120,
    Nl = ts - is - 120,
    T = {
        maxScreenWidth: Oa,
        maxScreenHeight: Ra,
        serverUpdateRate: _a,
        maxPlayers: Nr,
        maxPlayersHard: Ba,
        collisionDepth: za,
        minimapRate: Ha,
        colGrid: Fa,
        clientSendRate: Va,
        healthBarWidth: Ua,
        healthBarPad: La,
        iconPadding: Na,
        iconPad: qa,
        deathFadeout: Wa,
        crownIconScale: Xa,
        crownPad: Ga,
        chatCountdown: Ya,
        chatCooldown: $a,
        inSandbox: Ka,
        maxAge: Ja,
        gatherAngle: Qa,
        gatherWiggle: Za,
        hitReturnRatio: ja,
        hitAngle: el,
        playerScale: tl,
        playerSpeed: il,
        playerDecel: nl,
        nameY: sl,
        skinColors: rl,
        animalCount: ol,
        aiTurnRandom: al,
        cowNames: ll,
        shieldAngle: cl,
        weaponVariants: ci,
        fetchVariant: hl,
        resourceTypes: fl,
        areaCount: ul,
        treesPerArea: dl,
        bushesPerArea: pl,
        totalRocks: ml,
        goldOres: gl,
        riverWidth: yl,
        riverPadding: wl,
        waterCurrent: kl,
        waveSpeed: vl,
        waveMax: xl,
        treeScales: bl,
        bushScales: Sl,
        rockScales: Tl,
        snowBiomeTop: Il,
        snowSpeed: Ml,
        maxNameLength: El,
        mapScale: ts,
        mapPingScale: Pl,
        mapPingTime: Cl,
        volcanoScale: is,
        innerVolcanoScale: Bl,
        volcanoAnimalStrength: zl,
        volcanoAnimationDuration: Hl,
        volcanoAggressionRadius: Fl,
        volcanoAggressionPercentage: Vl,
        volcanoDamagePerSecond: Ul,
        volcanoLocationX: Ll,
        volcanoLocationY: Nl,
        MAX_ATTACK: Al,
        MAX_SPAWN_DELAY: Dl,
        MAX_SPEED: Ol,
        MAX_TURN_SPEED: Rl,
        DAY_INTERVAL: _l,
    },
    ql = new ka(),
    Wl = new Pa(),
    ee = {
        socket: null,
        connected: !1,
        socketId: -1,
        connect: function (e, t, i) {
            if (this.socket) return;
            const s = this;
            try {
                let n = !1;
                const r = e;
                (this.socket = new WebSocket(e)),
                    (this.socket.binaryType = "arraybuffer"),
                    (this.socket.onmessage = function (o) {
                        var a = new Uint8Array(o.data);
                        const l = Wl.decode(a),
                            c = l[0];
                        var a = l[1];
                        c == "io-init" ? (s.socketId = a[0]) : i[c].apply(void 0, a);
                    }),
                    (this.socket.onopen = function () {
                        (s.connected = !0), t();
                    }),
                    (this.socket.onclose = function (o) {
                        (s.connected = !1), o.code == 4001 ? t("Invalid Connection") : n || t("disconnected");
                    }),
                    (this.socket.onerror = function (o) {
                        this.socket && this.socket.readyState != WebSocket.OPEN && ((n = !0), console.error("Socket error", arguments), t("Socket error"));
                    });
            } catch (n) {
                console.warn("Socket connection error:", n), t(n);
            }
        },
        send: function (e) {
            const t = Array.prototype.slice.call(arguments, 1),
                i = ql.encode([e, t]);
            this.socket && this.socket.send(i);
        },
        socketReady: function () {
            return this.socket && this.connected;
        },
        close: function () {
            this.socket && this.socket.close(), (this.socket = null), (this.connected = !1);
        },
    };
var qr = Math.abs;
const Xl = Math.sqrt;
var qr = Math.abs;
const Gl = Math.atan2,
    Qi = Math.PI,
    Yl = function (e, t) {
        return Math.floor(Math.random() * (t - e + 1)) + e;
    },
    $l = function (e, t) {
        return Math.random() * (t - e + 1) + e;
    },
    Kl = function (e, t, i) {
        return e + (t - e) * i;
    },
    Jl = function (e, t) {
        return e > 0 ? (e = Math.max(0, e - t)) : e < 0 && (e = Math.min(0, e + t)), e;
    },
    Ql = function (e, t, i, s) {
        return Xl((i -= e) * i + (s -= t) * s);
    },
    Zl = function (e, t, i, s) {
        return Gl(t - s, e - i);
    },
    jl = function (e, t) {
        const i = qr(t - e) % (Qi * 2);
        return i > Qi ? Qi * 2 - i : i;
    },
    ec = function (e) {
        return typeof e == "number" && !isNaN(e) && isFinite(e);
    },
    tc = function (e) {
        return e && typeof e == "string";
    },
    ic = function (e) {
        return e > 999 ? (e / 1e3).toFixed(1) + "k" : e;
    },
    nc = function (e) {
        return e.charAt(0).toUpperCase() + e.slice(1);
    },
    sc = function (e, t) {
        return e ? parseFloat(e.toFixed(t)) : 0;
    },
    rc = function (e, t) {
        return parseFloat(t.points) - parseFloat(e.points);
    },
    oc = function (e, t, i, s, n, r, o, l) {
        let c = n,
            a = o;
        if ((n > o && ((c = o), (a = n)), a > i && (a = i), c < e && (c = e), c > a)) return !1;
        let u = r,
            p = l;
        const h = o - n;
        if (Math.abs(h) > 1e-7) {
            const m = (l - r) / h,
                w = r - m * n;
            (u = m * c + w), (p = m * a + w);
        }
        if (u > p) {
            const m = p;
            (p = u), (u = m);
        }
        return p > s && (p = s), u < t && (u = t), !(u > p);
    },
    Wr = function (e, t, i) {
        const s = e.getBoundingClientRect(),
            n = s.left + window.scrollX,
            r = s.top + window.scrollY,
            o = s.width,
            l = s.height,
            c = t > n && t < n + o,
            a = i > r && i < r + l;
        return c && a;
    },
    hi = function (e) {
        const t = e.changedTouches[0];
        (e.screenX = t.screenX), (e.screenY = t.screenY), (e.clientX = t.clientX), (e.clientY = t.clientY), (e.pageX = t.pageX), (e.pageY = t.pageY);
    },
    Xr = function (e, t) {
        const i = !t;
        let s = !1;
        const n = !1;
        e.addEventListener("touchstart", Be(r), n), e.addEventListener("touchmove", Be(o), n), e.addEventListener("touchend", Be(l), n), e.addEventListener("touchcancel", Be(l), n), e.addEventListener("touchleave", Be(l), n);
        function r(c) {
            hi(c), window.setUsingTouch(!0), i && (c.preventDefault(), c.stopPropagation()), e.onmouseover && e.onmouseover(c), (s = !0);
        }
        function o(c) {
            hi(c), window.setUsingTouch(!0), i && (c.preventDefault(), c.stopPropagation()), Wr(e, c.pageX, c.pageY) ? s || (e.onmouseover && e.onmouseover(c), (s = !0)) : s && (e.onmouseout && e.onmouseout(c), (s = !1));
        }
        function l(c) {
            hi(c), window.setUsingTouch(!0), i && (c.preventDefault(), c.stopPropagation()), s && (e.onclick && e.onclick(c), e.onmouseout && e.onmouseout(c), (s = !1));
        }
    },
    ac = function (e) {
        for (; e.hasChildNodes(); ) e.removeChild(e.lastChild);
    },
    lc = function (e) {
        const t = document.createElement(e.tag || "div");
        function i(s, n) {
            e[s] && (t[n] = e[s]);
        }
        i("text", "textContent"), i("html", "innerHTML"), i("class", "className");
        for (const s in e) {
            switch (s) {
                case "tag":
                case "text":
                case "html":
                case "class":
                case "style":
                case "hookTouch":
                case "parent":
                case "children":
                    continue;
            }
            t[s] = e[s];
        }
        if (
            (t.onclick && (t.onclick = Be(t.onclick)),
            t.onmouseover && (t.onmouseover = Be(t.onmouseover)),
            t.onmouseout && (t.onmouseout = Be(t.onmouseout)),
            e.style && (t.style.cssText = e.style),
            e.hookTouch && Xr(t),
            e.parent && e.parent.appendChild(t),
            e.children)
        )
            for (let s = 0; s < e.children.length; s++) t.appendChild(e.children[s]);
        return t;
    },
    Gr = function (e) {
        return e && typeof e.isTrusted == "boolean" ? e.isTrusted : !0;
    },
    Be = function (e) {
        return function (t) {
            t && t instanceof Event && Gr(t) && e(t);
        };
    },
    cc = function (e) {
        let t = "";
        const i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for (let s = 0; s < e; s++) t += i.charAt(Math.floor(Math.random() * i.length));
        return t;
    },
    hc = function (e, t) {
        let i = 0;
        for (let s = 0; s < e.length; s++) e[s] === t && i++;
        return i;
    },
    C = {
        randInt: Yl,
        randFloat: $l,
        lerp: Kl,
        decel: Jl,
        getDistance: Ql,
        getDirection: Zl,
        getAngleDist: jl,
        isNumber: ec,
        isString: tc,
        kFormat: ic,
        capitalizeFirst: nc,
        fixTo: sc,
        sortByPoints: rc,
        lineInRect: oc,
        containsPoint: Wr,
        mousifyTouchEvent: hi,
        hookTouchEvents: Xr,
        removeAllChildren: ac,
        generateElement: lc,
        eventIsTrusted: Gr,
        checkTrusted: Be,
        randomString: cc,
        countInArray: hc,
    },
    fc = function () {
        (this.init = function (e, t, i, s, n, r, o) {
            (this.x = e), (this.y = t), (this.color = o), (this.scale = i), (this.startScale = this.scale), (this.maxScale = i * 1.5), (this.scaleSpeed = 0.7), (this.speed = s), (this.life = n), (this.text = r);
        }),
            (this.update = function (e) {
                this.life &&
                    ((this.life -= e),
                    (this.y -= this.speed * e),
                    (this.scale += this.scaleSpeed * e),
                    this.scale >= this.maxScale ? ((this.scale = this.maxScale), (this.scaleSpeed *= -1)) : this.scale <= this.startScale && ((this.scale = this.startScale), (this.scaleSpeed = 0)),
                    this.life <= 0 && (this.life = 0));
            }),
            (this.render = function (e, t, i) {
                (e.fillStyle = this.color), (e.font = this.scale + "px Hammersmith One"), e.fillText(this.text, this.x - t, this.y - i);
            });
    },
    uc = function () {
        (this.texts = []),
            (this.update = function (e, t, i, s) {
                (t.textBaseline = "middle"), (t.textAlign = "center");
                for (let n = 0; n < this.texts.length; ++n) this.texts[n].life && (this.texts[n].update(e), this.texts[n].render(t, i, s));
            }),
            (this.showText = function (e, t, i, s, n, r, o) {
                let l;
                for (let c = 0; c < this.texts.length; ++c)
                    if (!this.texts[c].life) {
                        l = this.texts[c];
                        break;
                    }
                l || ((l = new fc()), this.texts.push(l)), l.init(e, t, i, s, n, r, o);
            });
    },
    dc = function (e, t) {
        let i;
        (this.sounds = []),
            (this.active = !0),
            (this.play = function (s, n, r) {
                !n ||
                    !this.active ||
                    ((i = this.sounds[s]), i || ((i = new Howl({ src: ".././sound/" + s + ".mp3" })), (this.sounds[s] = i)), (!r || !i.isPlaying) && ((i.isPlaying = !0), i.play(), i.volume((n || 1) * e.volumeMult), i.loop(r)));
            }),
            (this.toggleMute = function (s, n) {
                (i = this.sounds[s]), i && i.mute(n);
            }),
            (this.stop = function (s) {
                (i = this.sounds[s]), i && (i.stop(), (i.isPlaying = !1));
            });
    },
    Os = Math.floor,
    Rs = Math.abs,
    Ot = Math.cos,
    Rt = Math.sin,
    pc = Math.sqrt;
function mc(e, t, i, s, n, r) {
    (this.objects = t), (this.grids = {}), (this.updateObjects = []);
    let o, l;
    const c = s.mapScale / s.colGrid;
    (this.setObjectGrids = function (h) {
        const m = Math.min(s.mapScale, Math.max(0, h.x)),
            w = Math.min(s.mapScale, Math.max(0, h.y));
        for (let v = 0; v < s.colGrid; ++v) {
            o = v * c;
            for (let x = 0; x < s.colGrid; ++x)
                (l = x * c),
                    m + h.scale >= o && m - h.scale <= o + c && w + h.scale >= l && w - h.scale <= l + c && (this.grids[v + "_" + x] || (this.grids[v + "_" + x] = []), this.grids[v + "_" + x].push(h), h.gridLocations.push(v + "_" + x));
        }
    }),
        (this.removeObjGrid = function (h) {
            let m;
            for (let w = 0; w < h.gridLocations.length; ++w) (m = this.grids[h.gridLocations[w]].indexOf(h)), m >= 0 && this.grids[h.gridLocations[w]].splice(m, 1);
        }),
        (this.disableObj = function (h) {
            if (((h.active = !1), r)) {
                h.owner && h.pps && (h.owner.pps -= h.pps), this.removeObjGrid(h);
                const m = this.updateObjects.indexOf(h);
                m >= 0 && this.updateObjects.splice(m, 1);
            }
        }),
        (this.hitObj = function (h, m) {
            for (let w = 0; w < n.length; ++w)
                n[w].active && (h.sentTo[n[w].id] && (h.active ? n[w].canSee(h) && r.send(n[w].id, "L", i.fixTo(m, 1), h.sid) : r.send(n[w].id, "Q", h.sid)), !h.active && h.owner == n[w] && n[w].changeItemCount(h.group.id, -1));
        });
    const a = [];
    let u;
    this.getGridArrays = function (h, m, w) {
        (o = Os(h / c)), (l = Os(m / c)), (a.length = 0);
        try {
            this.grids[o + "_" + l] && a.push(this.grids[o + "_" + l]),
                h + w >= (o + 1) * c &&
                    ((u = this.grids[o + 1 + "_" + l]), u && a.push(u), l && m - w <= l * c ? ((u = this.grids[o + 1 + "_" + (l - 1)]), u && a.push(u)) : m + w >= (l + 1) * c && ((u = this.grids[o + 1 + "_" + (l + 1)]), u && a.push(u))),
                o &&
                    h - w <= o * c &&
                    ((u = this.grids[o - 1 + "_" + l]), u && a.push(u), l && m - w <= l * c ? ((u = this.grids[o - 1 + "_" + (l - 1)]), u && a.push(u)) : m + w >= (l + 1) * c && ((u = this.grids[o - 1 + "_" + (l + 1)]), u && a.push(u))),
                m + w >= (l + 1) * c && ((u = this.grids[o + "_" + (l + 1)]), u && a.push(u)),
                l && m - w <= l * c && ((u = this.grids[o + "_" + (l - 1)]), u && a.push(u));
        } catch {}
        return a;
    };
    let p;
    (this.add = function (h, m, w, v, x, D, k, S, O) {
        p = null;
        for (var U = 0; U < t.length; ++U)
            if (t[U].sid == h) {
                p = t[U];
                break;
            }
        if (!p) {
            for (var U = 0; U < t.length; ++U)
                if (!t[U].active) {
                    p = t[U];
                    break;
                }
        }
        p || ((p = new e(h)), t.push(p)), S && (p.sid = h), p.init(m, w, v, x, D, k, O), r && (this.setObjectGrids(p), p.doUpdate && this.updateObjects.push(p));
    }),
        (this.disableBySid = function (h) {
            for (let m = 0; m < t.length; ++m)
                if (t[m].sid == h) {
                    this.disableObj(t[m]);
                    break;
                }
        }),
        (this.removeAllItems = function (h, m) {
            for (let w = 0; w < t.length; ++w) t[w].active && t[w].owner && t[w].owner.sid == h && this.disableObj(t[w]);
            m && m.broadcast("R", h);
        }),
        (this.fetchSpawnObj = function (h) {
            let m = null;
            for (let w = 0; w < t.length; ++w)
                if (((p = t[w]), p.active && p.owner && p.owner.sid == h && p.spawnPoint)) {
                    (m = [p.x, p.y]), this.disableObj(p), r.broadcast("Q", p.sid), p.owner && p.owner.changeItemCount(p.group.id, -1);
                    break;
                }
            return m;
        }),
        (this.checkItemLocation = function (h, m, w, v, x, D, k) {
            for (let S = 0; S < t.length; ++S) {
                const O = t[S].blocker ? t[S].blocker : t[S].getScale(v, t[S].isItem);
                if (t[S].active && i.getDistance(h, m, t[S].x, t[S].y) < w + O) return !1;
            }
            return !(!D && x != 18 && m >= s.mapScale / 2 - s.riverWidth / 2 && m <= s.mapScale / 2 + s.riverWidth / 2);
        }),
        (this.addProjectile = function (h, m, w, v, x) {
            const D = items.projectiles[x];
            let k;
            for (let S = 0; S < projectiles.length; ++S)
                if (!projectiles[S].active) {
                    k = projectiles[S];
                    break;
                }
            k || ((k = new Projectile(n, i)), projectiles.push(k)), k.init(x, h, m, w, D.speed, v, D.scale);
        }),
        (this.checkCollision = function (h, m, w) {
            w = w || 1;
            const v = h.x - m.x,
                x = h.y - m.y;
            let D = h.scale + m.scale;
            if (Rs(v) <= D || Rs(x) <= D) {
                D = h.scale + (m.getScale ? m.getScale() : m.scale);
                let k = pc(v * v + x * x) - D;
                if (k <= 0) {
                    if (m.ignoreCollision)
                        m.trap && !h.noTrap && m.owner != h && !(m.owner && m.owner.team && m.owner.team == h.team)
                            ? ((h.lockMove = !0), (m.hideFromEnemy = !1))
                            : m.boostSpeed
                            ? ((h.xVel += w * m.boostSpeed * (m.weightM || 1) * Ot(m.dir)), (h.yVel += w * m.boostSpeed * (m.weightM || 1) * Rt(m.dir)))
                            : m.healCol
                            ? (h.healCol = m.healCol)
                            : m.teleport && ((h.x = i.randInt(0, s.mapScale)), (h.y = i.randInt(0, s.mapScale)));
                    else {
                        const S = i.getDirection(h.x, h.y, m.x, m.y);
                        if (
                            (i.getDistance(h.x, h.y, m.x, m.y),
                            m.isPlayer ? ((k = (k * -1) / 2), (h.x += k * Ot(S)), (h.y += k * Rt(S)), (m.x -= k * Ot(S)), (m.y -= k * Rt(S))) : ((h.x = m.x + D * Ot(S)), (h.y = m.y + D * Rt(S)), (h.xVel *= 0.75), (h.yVel *= 0.75)),
                            m.dmg && m.owner != h && !(m.owner && m.owner.team && m.owner.team == h.team))
                        ) {
                            h.changeHealth(-m.dmg, m.owner, m);
                            const O = 1.5 * (m.weightM || 1);
                            (h.xVel += O * Ot(S)),
                                (h.yVel += O * Rt(S)),
                                m.pDmg && !(h.skin && h.skin.poisonRes) && ((h.dmgOverTime.dmg = m.pDmg), (h.dmgOverTime.time = 5), (h.dmgOverTime.doer = m.owner)),
                                h.colDmg && m.health && (m.changeHealth(-h.colDmg) && this.disableObj(m), this.hitObj(m, i.getDirection(h.x, h.y, m.x, m.y)));
                        }
                    }
                    return m.zIndex > h.zIndex && (h.zIndex = m.zIndex), !0;
                }
            }
            return !1;
        });
}
function gc(e, t, i, s, n, r, o, l, c) {
    this.addProjectile = function (a, u, p, h, m, w, v, x, D) {
        const k = r.projectiles[w];
        let S;
        for (let O = 0; O < t.length; ++O)
            if (!t[O].active) {
                S = t[O];
                break;
            }
        return S || ((S = new e(i, s, n, r, o, l, c)), (S.sid = t.length), t.push(S)), S.init(w, a, u, p, m, k.dmg, h, k.scale, v), (S.ignoreObj = x), (S.layer = D || k.layer), (S.src = k.src), S;
    };
}
function yc(e, t, i, s, n, r, o, l, c) {
    (this.aiTypes = [
        { id: 0, src: "cow_1", killScore: 150, health: 500, weightM: 0.8, speed: 95e-5, turnSpeed: 0.001, scale: 72, drop: ["food", 50] },
        { id: 1, src: "pig_1", killScore: 200, health: 800, weightM: 0.6, speed: 85e-5, turnSpeed: 0.001, scale: 72, drop: ["food", 80] },
        { id: 2, name: "Bull", src: "bull_2", hostile: !0, dmg: 20, killScore: 1e3, health: 1800, weightM: 0.5, speed: 94e-5, turnSpeed: 74e-5, scale: 78, viewRange: 800, chargePlayer: !0, drop: ["food", 100] },
        { id: 3, name: "Bully", src: "bull_1", hostile: !0, dmg: 20, killScore: 2e3, health: 2800, weightM: 0.45, speed: 0.001, turnSpeed: 8e-4, scale: 90, viewRange: 900, chargePlayer: !0, drop: ["food", 400] },
        { id: 4, name: "Wolf", src: "wolf_1", hostile: !0, dmg: 8, killScore: 500, health: 300, weightM: 0.45, speed: 0.001, turnSpeed: 0.002, scale: 84, viewRange: 800, chargePlayer: !0, drop: ["food", 200] },
        { id: 5, name: "Quack", src: "chicken_1", dmg: 8, killScore: 2e3, noTrap: !0, health: 300, weightM: 0.2, speed: 0.0018, turnSpeed: 0.006, scale: 70, drop: ["food", 100] },
        {
            id: 6,
            name: "MOOSTAFA",
            nameScale: 50,
            src: "enemy",
            hostile: !0,
            dontRun: !0,
            fixedSpawn: !0,
            spawnDelay: 6e4,
            noTrap: !0,
            colDmg: 100,
            dmg: 40,
            killScore: 8e3,
            health: 18e3,
            weightM: 0.4,
            speed: 7e-4,
            turnSpeed: 0.01,
            scale: 80,
            spriteMlt: 1.8,
            leapForce: 0.9,
            viewRange: 1e3,
            hitRange: 210,
            hitDelay: 1e3,
            chargePlayer: !0,
            drop: ["food", 100],
        },
        { id: 7, name: "Treasure", hostile: !0, nameScale: 35, src: "crate_1", fixedSpawn: !0, spawnDelay: 12e4, colDmg: 200, killScore: 5e3, health: 2e4, weightM: 0.1, speed: 0, turnSpeed: 0, scale: 70, spriteMlt: 1 },
        {
            id: 8,
            name: "MOOFIE",
            src: "wolf_2",
            hostile: !0,
            fixedSpawn: !0,
            dontRun: !0,
            hitScare: 4,
            spawnDelay: 3e4,
            noTrap: !0,
            nameScale: 35,
            dmg: 10,
            colDmg: 100,
            killScore: 3e3,
            health: 7e3,
            weightM: 0.45,
            speed: 0.0015,
            turnSpeed: 0.002,
            scale: 90,
            viewRange: 800,
            chargePlayer: !0,
            drop: ["food", 1e3],
        },
        {
            id: 9,
            name: "💀MOOFIE",
            src: "wolf_2",
            hostile: !0,
            fixedSpawn: !0,
            dontRun: !0,
            hitScare: 50,
            spawnDelay: 6e4,
            noTrap: !0,
            nameScale: 35,
            dmg: 12,
            colDmg: 100,
            killScore: 3e3,
            health: 9e3,
            weightM: 0.45,
            speed: 0.0015,
            turnSpeed: 0.0025,
            scale: 94,
            viewRange: 1440,
            chargePlayer: !0,
            drop: ["food", 3e3],
            minSpawnRange: 0.85,
            maxSpawnRange: 0.9,
        },
        {
            id: 10,
            name: "💀Wolf",
            src: "wolf_1",
            hostile: !0,
            fixedSpawn: !0,
            dontRun: !0,
            hitScare: 50,
            spawnDelay: 3e4,
            dmg: 10,
            killScore: 700,
            health: 500,
            weightM: 0.45,
            speed: 0.00115,
            turnSpeed: 0.0025,
            scale: 88,
            viewRange: 1440,
            chargePlayer: !0,
            drop: ["food", 400],
            minSpawnRange: 0.85,
            maxSpawnRange: 0.9,
        },
        {
            id: 11,
            name: "💀Bully",
            src: "bull_1",
            hostile: !0,
            fixedSpawn: !0,
            dontRun: !0,
            hitScare: 50,
            dmg: 20,
            killScore: 5e3,
            health: 5e3,
            spawnDelay: 1e5,
            weightM: 0.45,
            speed: 0.00115,
            turnSpeed: 0.0025,
            scale: 94,
            viewRange: 1440,
            chargePlayer: !0,
            drop: ["food", 800],
            minSpawnRange: 0.85,
            maxSpawnRange: 0.9,
        },
    ]),
        (this.spawn = function (a, u, p, h) {
            if (!this.aiTypes[h]) return console.error("missing ai type", h), this.spawn(a, u, p, 0);
            let m;
            for (let w = 0; w < e.length; ++w)
                if (!e[w].active) {
                    m = e[w];
                    break;
                }
            return m || ((m = new t(e.length, n, i, s, o, r, l, c)), e.push(m)), m.init(a, u, p, h, this.aiTypes[h]), m;
        });
}
const ot = Math.PI * 2,
    Zi = 0;
function wc(e, t, i, s, n, r, o, l) {
    (this.sid = e),
        (this.isAI = !0),
        (this.nameIndex = n.randInt(0, r.cowNames.length - 1)),
        (this.init = function (p, h, m, w, v) {
            (this.x = p),
                (this.y = h),
                (this.startX = v.fixedSpawn ? p : null),
                (this.startY = v.fixedSpawn ? h : null),
                (this.xVel = 0),
                (this.yVel = 0),
                (this.zIndex = 0),
                (this.dir = m),
                (this.dirPlus = 0),
                (this.index = w),
                (this.src = v.src),
                v.name && (this.name = v.name),
                (this.name || "").startsWith("💀") && (this.isVolcanoAi = !0),
                (this.weightM = v.weightM),
                (this.speed = v.speed),
                (this.killScore = v.killScore),
                (this.turnSpeed = v.turnSpeed),
                (this.scale = v.scale),
                (this.maxHealth = v.health),
                (this.leapForce = v.leapForce),
                (this.health = this.maxHealth),
                (this.chargePlayer = v.chargePlayer),
                (this.viewRange = v.viewRange),
                (this.drop = v.drop),
                (this.dmg = v.dmg),
                (this.hostile = v.hostile),
                (this.dontRun = v.dontRun),
                (this.hitRange = v.hitRange),
                (this.hitDelay = v.hitDelay),
                (this.hitScare = v.hitScare),
                (this.spriteMlt = v.spriteMlt),
                (this.nameScale = v.nameScale),
                (this.colDmg = v.colDmg),
                (this.noTrap = v.noTrap),
                (this.spawnDelay = v.spawnDelay),
                (this.minSpawnRange = v.minSpawnRange),
                (this.maxSpawnRange = v.maxSpawnRange),
                (this.hitWait = 0),
                (this.waitCount = 1e3),
                (this.moveCount = 0),
                (this.targetDir = 0),
                (this.active = !0),
                (this.alive = !0),
                (this.runFrom = null),
                (this.chargeTarget = null),
                (this.dmgOverTime = {});
        }),
        (this.getVolcanoAggression = function () {
            const p = n.getDistance(this.x, this.y, r.volcanoLocationX, r.volcanoLocationY),
                h = p > r.volcanoAggressionRadius ? 0 : r.volcanoAggressionRadius - p;
            return 1 + r.volcanoAggressionPercentage * (1 - h / r.volcanoAggressionRadius);
        });
    let c = 0;
    (this.update = function (p) {
        if (this.active) {
            if (this.spawnCounter) {
                if (((this.spawnCounter -= p * (1 + 0) * this.getVolcanoAggression()), this.spawnCounter <= 0))
                    if (((this.spawnCounter = 0), this.minSpawnRange || this.maxSpawnRange)) {
                        const W = r.mapScale * this.minSpawnRange,
                            F = r.mapScale * this.maxSpawnRange;
                        (this.x = n.randInt(W, F)), (this.y = n.randInt(W, F));
                    } else (this.x = this.startX || n.randInt(0, r.mapScale)), (this.y = this.startY || n.randInt(0, r.mapScale));
                return;
            }
            (c -= p), c <= 0 && (this.dmgOverTime.dmg && (this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer), (this.dmgOverTime.time -= 1), this.dmgOverTime.time <= 0 && (this.dmgOverTime.dmg = 0)), (c = 1e3));
            let k = !1,
                S = 1;
            if ((!this.zIndex && !this.lockMove && this.y >= r.mapScale / 2 - r.riverWidth / 2 && this.y <= r.mapScale / 2 + r.riverWidth / 2 && ((S = 0.33), (this.xVel += r.waterCurrent * p)), this.lockMove))
                (this.xVel = 0), (this.yVel = 0);
            else if (this.waitCount > 0) {
                if (((this.waitCount -= p), this.waitCount <= 0))
                    if (this.chargePlayer) {
                        let W, F, _;
                        for (var h = 0; h < i.length; ++h) i[h].alive && !(i[h].skin && i[h].skin.bullRepel) && ((_ = n.getDistance(this.x, this.y, i[h].x, i[h].y)), _ <= this.viewRange && (!W || _ < F) && ((F = _), (W = i[h])));
                        W ? ((this.chargeTarget = W), (this.moveCount = n.randInt(8e3, 12e3))) : ((this.moveCount = n.randInt(1e3, 2e3)), (this.targetDir = n.randFloat(-Math.PI, Math.PI)));
                    } else (this.moveCount = n.randInt(4e3, 1e4)), (this.targetDir = n.randFloat(-Math.PI, Math.PI));
            } else if (this.moveCount > 0) {
                var m = this.speed * S * (1 + r.MAX_SPEED * Zi) * this.getVolcanoAggression();
                if (
                    (this.runFrom && this.runFrom.active && !(this.runFrom.isPlayer && !this.runFrom.alive)
                        ? ((this.targetDir = n.getDirection(this.x, this.y, this.runFrom.x, this.runFrom.y)), (m *= 1.42))
                        : this.chargeTarget && this.chargeTarget.alive && ((this.targetDir = n.getDirection(this.chargeTarget.x, this.chargeTarget.y, this.x, this.y)), (m *= 1.75), (k = !0)),
                    this.hitWait && (m *= 0.3),
                    this.dir != this.targetDir)
                ) {
                    this.dir %= ot;
                    const W = (this.dir - this.targetDir + ot) % ot,
                        F = Math.min(Math.abs(W - ot), W, this.turnSpeed * p),
                        _ = W - Math.PI >= 0 ? 1 : -1;
                    this.dir += _ * F + ot;
                }
                (this.dir %= ot),
                    (this.xVel += m * p * Math.cos(this.dir)),
                    (this.yVel += m * p * Math.sin(this.dir)),
                    (this.moveCount -= p),
                    this.moveCount <= 0 && ((this.runFrom = null), (this.chargeTarget = null), (this.waitCount = this.hostile ? 1500 : n.randInt(1500, 6e3)));
            }
            (this.zIndex = 0), (this.lockMove = !1);
            var w;
            const O = n.getDistance(0, 0, this.xVel * p, this.yVel * p),
                U = Math.min(4, Math.max(1, Math.round(O / 40))),
                L = 1 / U;
            for (var h = 0; h < U; ++h) {
                this.xVel && (this.x += this.xVel * p * L), this.yVel && (this.y += this.yVel * p * L), (w = t.getGridArrays(this.x, this.y, this.scale));
                for (var v = 0; v < w.length; ++v) for (let F = 0; F < w[v].length; ++F) w[v][F].active && t.checkCollision(this, w[v][F], L);
            }
            let q = !1;
            if (this.hitWait > 0 && ((this.hitWait -= p), this.hitWait <= 0)) {
                (q = !0), (this.hitWait = 0), this.leapForce && !n.randInt(0, 2) && ((this.xVel += this.leapForce * Math.cos(this.dir)), (this.yVel += this.leapForce * Math.sin(this.dir)));
                var w = t.getGridArrays(this.x, this.y, this.hitRange),
                    x,
                    D;
                for (let F = 0; F < w.length; ++F)
                    for (var v = 0; v < w[F].length; ++v)
                        (x = w[F][v]), x.health && ((D = n.getDistance(this.x, this.y, x.x, x.y)), D < x.scale + this.hitRange && (x.changeHealth(-this.dmg * 5) && t.disableObj(x), t.hitObj(x, n.getDirection(this.x, this.y, x.x, x.y))));
                for (var v = 0; v < i.length; ++v) i[v].canSee(this) && l.send(i[v].id, "J", this.sid);
            }
            if (k || q) {
                var x, D;
                let _;
                for (var h = 0; h < i.length; ++h)
                    (x = i[h]),
                        x &&
                            x.alive &&
                            ((D = n.getDistance(this.x, this.y, x.x, x.y)),
                            this.hitRange
                                ? !this.hitWait &&
                                  D <= this.hitRange + x.scale &&
                                  (q
                                      ? ((_ = n.getDirection(x.x, x.y, this.x, this.y)),
                                        x.changeHealth(-this.dmg * (1 + r.MAX_ATTACK * Zi) * this.getVolcanoAggression()),
                                        (x.xVel += 0.6 * Math.cos(_)),
                                        (x.yVel += 0.6 * Math.sin(_)),
                                        (this.runFrom = null),
                                        (this.chargeTarget = null),
                                        (this.waitCount = 3e3),
                                        (this.hitWait = n.randInt(0, 2) ? 0 : 600))
                                      : (this.hitWait = this.hitDelay))
                                : D <= this.scale + x.scale &&
                                  ((_ = n.getDirection(x.x, x.y, this.x, this.y)), x.changeHealth(-this.dmg * (1 + r.MAX_ATTACK * Zi) * this.getVolcanoAggression()), (x.xVel += 0.55 * Math.cos(_)), (x.yVel += 0.55 * Math.sin(_))));
            }
            this.xVel && (this.xVel *= Math.pow(r.playerDecel, p)), this.yVel && (this.yVel *= Math.pow(r.playerDecel, p));
            const P = this.scale;
            this.x - P < 0 ? ((this.x = P), (this.xVel = 0)) : this.x + P > r.mapScale && ((this.x = r.mapScale - P), (this.xVel = 0)),
                this.y - P < 0 ? ((this.y = P), (this.yVel = 0)) : this.y + P > r.mapScale && ((this.y = r.mapScale - P), (this.yVel = 0)),
                this.isVolcanoAi &&
                    (this.chargeTarget && (n.getDistance(this.chargeTarget.x, this.chargeTarget.y, r.volcanoLocationX, r.volcanoLocationY) || 0) > r.volcanoAggressionRadius && (this.chargeTarget = null),
                    this.xVel &&
                        (this.x < r.volcanoLocationX - r.volcanoAggressionRadius
                            ? ((this.x = r.volcanoLocationX - r.volcanoAggressionRadius), (this.xVel = 0))
                            : this.x > r.volcanoLocationX + r.volcanoAggressionRadius && ((this.x = r.volcanoLocationX + r.volcanoAggressionRadius), (this.xVel = 0))),
                    this.yVel &&
                        (this.y < r.volcanoLocationY - r.volcanoAggressionRadius
                            ? ((this.y = r.volcanoLocationY - r.volcanoAggressionRadius), (this.yVel = 0))
                            : this.y > r.volcanoLocationY + r.volcanoAggressionRadius && ((this.y = r.volcanoLocationY + r.volcanoAggressionRadius), (this.yVel = 0))));
        }
    }),
        (this.canSee = function (p) {
            if (!p || (p.skin && p.skin.invisTimer && p.noMovTimer >= p.skin.invisTimer)) return !1;
            const h = Math.abs(p.x - this.x) - p.scale,
                m = Math.abs(p.y - this.y) - p.scale;
            return h <= (r.maxScreenWidth / 2) * 1.3 && m <= (r.maxScreenHeight / 2) * 1.3;
        });
    let a = 0,
        u = 0;
    (this.animate = function (p) {
        this.animTime > 0 &&
            ((this.animTime -= p),
            this.animTime <= 0
                ? ((this.animTime = 0), (this.dirPlus = 0), (a = 0), (u = 0))
                : u == 0
                ? ((a += p / (this.animSpeed * r.hitReturnRatio)), (this.dirPlus = n.lerp(0, this.targetAngle, Math.min(1, a))), a >= 1 && ((a = 1), (u = 1)))
                : ((a -= p / (this.animSpeed * (1 - r.hitReturnRatio))), (this.dirPlus = n.lerp(0, this.targetAngle, Math.max(0, a)))));
    }),
        (this.startAnim = function () {
            (this.animTime = this.animSpeed = 600), (this.targetAngle = Math.PI * 0.8), (a = 0), (u = 0);
        }),
        (this.changeHealth = function (p, h, m) {
            if (
                this.active &&
                ((this.health += p),
                m &&
                    (this.hitScare && !n.randInt(0, this.hitScare)
                        ? ((this.runFrom = m), (this.waitCount = 0), (this.moveCount = 2e3))
                        : this.hostile && this.chargePlayer && m.isPlayer
                        ? ((this.chargeTarget = m), (this.waitCount = 0), (this.moveCount = 8e3))
                        : this.dontRun || ((this.runFrom = m), (this.waitCount = 0), (this.moveCount = 2e3))),
                p < 0 && this.hitRange && n.randInt(0, 1) && (this.hitWait = 500),
                h && h.canSee(this) && p < 0 && l.send(h.id, "8", Math.round(this.x), Math.round(this.y), Math.round(-p), 1),
                this.health <= 0)
            ) {
                if (this.spawnDelay) (this.spawnCounter = this.spawnDelay), (this.x = -1e6), (this.y = -1e6);
                else if (this.minSpawnRange || this.maxSpawnRange) {
                    const w = r.mapScale * this.minSpawnRange,
                        v = r.mapScale * this.maxSpawnRange;
                    (this.x = n.randInt(w, v)), (this.y = n.randInt(w, v));
                } else (this.x = this.startX || n.randInt(0, r.mapScale)), (this.y = this.startY || n.randInt(0, r.mapScale));
                if (((this.health = this.maxHealth), (this.runFrom = null), h && (o(h, this.killScore), this.drop))) for (let w = 0; w < this.drop.length; ) h.addResource(r.resourceTypes.indexOf(this.drop[w]), this.drop[w + 1]), (w += 2);
            }
        });
}
function kc(e) {
    (this.sid = e),
        (this.init = function (t, i, s, n, r, o, l) {
            (o = o || {}),
                (this.sentTo = {}),
                (this.gridLocations = []),
                (this.active = !0),
                (this.doUpdate = o.doUpdate),
                (this.x = t),
                (this.y = i),
                (this.dir = s),
                (this.xWiggle = 0),
                (this.yWiggle = 0),
                (this.scale = n),
                (this.type = r),
                (this.id = o.id),
                (this.owner = l),
                (this.name = o.name),
                (this.isItem = this.id != null),
                (this.group = o.group),
                (this.health = o.health),
                (this.layer = 2),
                this.group != null ? (this.layer = this.group.layer) : this.type == 0 ? (this.layer = 3) : this.type == 2 ? (this.layer = 0) : this.type == 4 && (this.layer = -1),
                (this.colDiv = o.colDiv || 1),
                (this.blocker = o.blocker),
                (this.ignoreCollision = o.ignoreCollision),
                (this.dontGather = o.dontGather),
                (this.hideFromEnemy = o.hideFromEnemy),
                (this.friction = o.friction),
                (this.projDmg = o.projDmg),
                (this.dmg = o.dmg),
                (this.pDmg = o.pDmg),
                (this.pps = o.pps),
                (this.zIndex = o.zIndex || 0),
                (this.turnSpeed = o.turnSpeed),
                (this.req = o.req),
                (this.trap = o.trap),
                (this.healCol = o.healCol),
                (this.teleport = o.teleport),
                (this.boostSpeed = o.boostSpeed),
                (this.projectile = o.projectile),
                (this.shootRange = o.shootRange),
                (this.shootRate = o.shootRate),
                (this.shootCount = this.shootRate),
                (this.spawnPoint = o.spawnPoint);
        }),
        (this.changeHealth = function (t, i) {
            return (this.health += t), this.health <= 0;
        }),
        (this.getScale = function (t, i) {
            return (t = t || 1), this.scale * (this.isItem || this.type == 2 || this.type == 3 || this.type == 4 ? 1 : 0.6 * t) * (i ? 1 : this.colDiv);
        }),
        (this.visibleToPlayer = function (t) {
            return !this.hideFromEnemy || (this.owner && (this.owner == t || (this.owner.team && t.team == this.owner.team)));
        }),
        (this.update = function (t) {
            this.active && (this.xWiggle && (this.xWiggle *= Math.pow(0.99, t)), this.yWiggle && (this.yWiggle *= Math.pow(0.99, t)), this.turnSpeed && (this.dir += this.turnSpeed * t));
        });
}
const j = [
        { id: 0, name: "food", layer: 0 },
        { id: 1, name: "walls", place: !0, limit: 30, layer: 0 },
        { id: 2, name: "spikes", place: !0, limit: 15, layer: 0 },
        { id: 3, name: "mill", place: !0, limit: 7, sandboxLimit: 299, layer: 1 },
        { id: 4, name: "mine", place: !0, limit: 1, layer: 0 },
        { id: 5, name: "trap", place: !0, limit: 6, layer: -1 },
        { id: 6, name: "booster", place: !0, limit: 12, sandboxLimit: 299, layer: -1 },
        { id: 7, name: "turret", place: !0, limit: 2, layer: 1 },
        { id: 8, name: "watchtower", place: !0, limit: 12, layer: 1 },
        { id: 9, name: "buff", place: !0, limit: 4, layer: -1 },
        { id: 10, name: "spawn", place: !0, limit: 1, layer: -1 },
        { id: 11, name: "sapling", place: !0, limit: 2, layer: 0 },
        { id: 12, name: "blocker", place: !0, limit: 3, layer: -1 },
        { id: 13, name: "teleporter", place: !0, limit: 2, sandboxLimit: 299, layer: -1 },
    ],
    vc = [
        { indx: 0, layer: 0, src: "arrow_1", dmg: 25, speed: 1.6, scale: 103, range: 1e3 },
        { indx: 1, layer: 1, dmg: 25, scale: 20 },
        { indx: 0, layer: 0, src: "arrow_1", dmg: 35, speed: 2.5, scale: 103, range: 1200 },
        { indx: 0, layer: 0, src: "arrow_1", dmg: 30, speed: 2, scale: 103, range: 1200 },
        { indx: 1, layer: 1, dmg: 16, scale: 20 },
        { indx: 0, layer: 0, src: "bullet_1", dmg: 50, speed: 3.6, scale: 160, range: 1400 },
    ],
    xc = [
        { id: 0, type: 0, name: "tool hammer", desc: "tool for gathering all resources", src: "hammer_1", length: 140, width: 140, xOff: -3, yOff: 18, dmg: 25, range: 65, gather: 1, speed: 300 },
        { id: 1, type: 0, age: 2, name: "hand axe", desc: "gathers resources at a higher rate", src: "axe_1", length: 140, width: 140, xOff: 3, yOff: 24, dmg: 30, spdMult: 1, range: 70, gather: 2, speed: 400 },
        { id: 2, type: 0, age: 8, pre: 1, name: "great axe", desc: "deal more damage and gather more resources", src: "great_axe_1", length: 140, width: 140, xOff: -8, yOff: 25, dmg: 35, spdMult: 1, range: 75, gather: 4, speed: 400 },
        {
            id: 3,
            type: 0,
            age: 2,
            name: "short sword",
            desc: "increased attack power but slower move speed",
            src: "sword_1",
            iPad: 1.3,
            length: 130,
            width: 210,
            xOff: -8,
            yOff: 46,
            dmg: 35,
            spdMult: 0.85,
            range: 110,
            gather: 1,
            speed: 300,
        },
        { id: 4, type: 0, age: 8, pre: 3, name: "katana", desc: "greater range and damage", src: "samurai_1", iPad: 1.3, length: 130, width: 210, xOff: -8, yOff: 59, dmg: 40, spdMult: 0.8, range: 118, gather: 1, speed: 300 },
        { id: 5, type: 0, age: 2, name: "polearm", desc: "long range melee weapon", src: "spear_1", iPad: 1.3, length: 130, width: 210, xOff: -8, yOff: 53, dmg: 45, knock: 0.2, spdMult: 0.82, range: 142, gather: 1, speed: 700 },
        { id: 6, type: 0, age: 2, name: "bat", desc: "fast long range melee weapon", src: "bat_1", iPad: 1.3, length: 110, width: 180, xOff: -8, yOff: 53, dmg: 20, knock: 0.7, range: 110, gather: 1, speed: 300 },
        {
            id: 7,
            type: 0,
            age: 2,
            name: "daggers",
            desc: "really fast short range weapon",
            src: "dagger_1",
            iPad: 0.8,
            length: 110,
            width: 110,
            xOff: 18,
            yOff: 0,
            dmg: 20,
            knock: 0.1,
            range: 65,
            gather: 1,
            hitSlow: 0.1,
            spdMult: 1.13,
            speed: 100,
        },
        { id: 8, type: 0, age: 2, name: "stick", desc: "great for gathering but very weak", src: "stick_1", length: 140, width: 140, xOff: 3, yOff: 24, dmg: 1, spdMult: 1, range: 70, gather: 7, speed: 400 },
        { id: 9, type: 1, age: 6, name: "hunting bow", desc: "bow used for ranged combat and hunting", src: "bow_1", req: ["wood", 4], length: 120, width: 120, xOff: -6, yOff: 0, projectile: 0, spdMult: 0.75, speed: 600 },
        {
            id: 10,
            type: 1,
            age: 6,
            name: "great hammer",
            desc: "hammer used for destroying structures",
            src: "great_hammer_1",
            length: 140,
            width: 140,
            xOff: -9,
            yOff: 25,
            dmg: 10,
            spdMult: 0.88,
            range: 75,
            sDmg: 7.5,
            gather: 1,
            speed: 400,
        },
        { id: 11, type: 1, age: 6, name: "wooden shield", desc: "blocks projectiles and reduces melee damage", src: "shield_1", length: 120, width: 120, shield: 0.2, xOff: 6, yOff: 0, spdMult: 0.7 },
        {
            id: 12,
            type: 1,
            age: 8,
            pre: 9,
            name: "crossbow",
            desc: "deals more damage and has greater range",
            src: "crossbow_1",
            req: ["wood", 5],
            aboveHand: !0,
            armS: 0.75,
            length: 120,
            width: 120,
            xOff: -4,
            yOff: 0,
            projectile: 2,
            spdMult: 0.7,
            speed: 700,
        },
        {
            id: 13,
            type: 1,
            age: 9,
            pre: 12,
            name: "repeater crossbow",
            desc: "high firerate crossbow with reduced damage",
            src: "crossbow_2",
            req: ["wood", 10],
            aboveHand: !0,
            armS: 0.75,
            length: 120,
            width: 120,
            xOff: -4,
            yOff: 0,
            projectile: 3,
            spdMult: 0.7,
            speed: 230,
        },
        { id: 14, type: 1, age: 6, name: "mc grabby", desc: "steals resources from enemies", src: "grab_1", length: 130, width: 210, xOff: -8, yOff: 53, dmg: 0, steal: 250, knock: 0.2, spdMult: 1.05, range: 125, gather: 0, speed: 700 },
        {
            id: 15,
            type: 1,
            age: 9,
            pre: 12,
            name: "musket",
            desc: "slow firerate but high damage and range",
            src: "musket_1",
            req: ["stone", 10],
            aboveHand: !0,
            rec: 0.35,
            armS: 0.6,
            hndS: 0.3,
            hndD: 1.6,
            length: 205,
            width: 205,
            xOff: 25,
            yOff: 0,
            projectile: 5,
            hideProjectile: !0,
            spdMult: 0.6,
            speed: 1500,
        },
    ],
    dt = [
        {
            group: j[0],
            name: "apple",
            desc: "restores 20 health when consumed",
            req: ["food", 10],
            consume: function (e) {
                return e.changeHealth(20, e);
            },
            scale: 22,
            holdOffset: 15,
        },
        {
            age: 3,
            group: j[0],
            name: "cookie",
            desc: "restores 40 health when consumed",
            req: ["food", 15],
            consume: function (e) {
                return e.changeHealth(40, e);
            },
            scale: 27,
            holdOffset: 15,
        },
        {
            age: 7,
            group: j[0],
            name: "cheese",
            desc: "restores 30 health and another 50 over 5 seconds",
            req: ["food", 25],
            consume: function (e) {
                return e.changeHealth(30, e) || e.health < 100 ? ((e.dmgOverTime.dmg = -10), (e.dmgOverTime.doer = e), (e.dmgOverTime.time = 5), !0) : !1;
            },
            scale: 27,
            holdOffset: 15,
        },
        { group: j[1], name: "wood wall", desc: "provides protection for your village", req: ["wood", 10], projDmg: !0, health: 380, scale: 50, holdOffset: 20, placeOffset: -5 },
        { age: 3, group: j[1], name: "stone wall", desc: "provides improved protection for your village", req: ["stone", 25], health: 900, scale: 50, holdOffset: 20, placeOffset: -5 },
        { age: 7, pre: 1, group: j[1], name: "castle wall", desc: "provides powerful protection for your village", req: ["stone", 35], health: 1500, scale: 52, holdOffset: 20, placeOffset: -5 },
        { group: j[2], name: "spikes", desc: "damages enemies when they touch them", req: ["wood", 20, "stone", 5], health: 400, dmg: 20, scale: 49, spritePadding: -23, holdOffset: 8, placeOffset: -5 },
        { age: 5, group: j[2], name: "greater spikes", desc: "damages enemies when they touch them", req: ["wood", 30, "stone", 10], health: 500, dmg: 35, scale: 52, spritePadding: -23, holdOffset: 8, placeOffset: -5 },
        { age: 9, pre: 1, group: j[2], name: "poison spikes", desc: "poisons enemies when they touch them", req: ["wood", 35, "stone", 15], health: 600, dmg: 30, pDmg: 5, scale: 52, spritePadding: -23, holdOffset: 8, placeOffset: -5 },
        {
            age: 9,
            pre: 2,
            group: j[2],
            name: "spinning spikes",
            desc: "damages enemies when they touch them",
            req: ["wood", 30, "stone", 20],
            health: 500,
            dmg: 45,
            turnSpeed: 0.003,
            scale: 52,
            spritePadding: -23,
            holdOffset: 8,
            placeOffset: -5,
        },
        { group: j[3], name: "windmill", desc: "generates gold over time", req: ["wood", 50, "stone", 10], health: 400, pps: 1, turnSpeed: 0.0016, spritePadding: 25, iconLineMult: 12, scale: 45, holdOffset: 20, placeOffset: 5 },
        {
            age: 5,
            pre: 1,
            group: j[3],
            name: "faster windmill",
            desc: "generates more gold over time",
            req: ["wood", 60, "stone", 20],
            health: 500,
            pps: 1.5,
            turnSpeed: 0.0025,
            spritePadding: 25,
            iconLineMult: 12,
            scale: 47,
            holdOffset: 20,
            placeOffset: 5,
        },
        {
            age: 8,
            pre: 1,
            group: j[3],
            name: "power mill",
            desc: "generates more gold over time",
            req: ["wood", 100, "stone", 50],
            health: 800,
            pps: 2,
            turnSpeed: 0.005,
            spritePadding: 25,
            iconLineMult: 12,
            scale: 47,
            holdOffset: 20,
            placeOffset: 5,
        },
        { age: 5, group: j[4], type: 2, name: "mine", desc: "allows you to mine stone", req: ["wood", 20, "stone", 100], iconLineMult: 12, scale: 65, holdOffset: 20, placeOffset: 0 },
        { age: 5, group: j[11], type: 0, name: "sapling", desc: "allows you to farm wood", req: ["wood", 150], iconLineMult: 12, colDiv: 0.5, scale: 110, holdOffset: 50, placeOffset: -15 },
        {
            age: 4,
            group: j[5],
            name: "pit trap",
            desc: "pit that traps enemies if they walk over it",
            req: ["wood", 30, "stone", 30],
            trap: !0,
            ignoreCollision: !0,
            hideFromEnemy: !0,
            health: 500,
            colDiv: 0.2,
            scale: 50,
            holdOffset: 20,
            placeOffset: -5,
        },
        { age: 4, group: j[6], name: "boost pad", desc: "provides boost when stepped on", req: ["stone", 20, "wood", 5], ignoreCollision: !0, boostSpeed: 1.5, health: 150, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5 },
        {
            age: 7,
            group: j[7],
            doUpdate: !0,
            name: "turret",
            desc: "defensive structure that shoots at enemies",
            req: ["wood", 200, "stone", 150],
            health: 800,
            projectile: 1,
            shootRange: 700,
            shootRate: 2200,
            scale: 43,
            holdOffset: 20,
            placeOffset: -5,
        },
        { age: 7, group: j[8], name: "platform", desc: "platform to shoot over walls and cross over water", req: ["wood", 20], ignoreCollision: !0, zIndex: 1, health: 300, scale: 43, holdOffset: 20, placeOffset: -5 },
        { age: 7, group: j[9], name: "healing pad", desc: "standing on it will slowly heal you", req: ["wood", 30, "food", 10], ignoreCollision: !0, healCol: 15, health: 400, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5 },
        {
            age: 9,
            group: j[10],
            name: "spawn pad",
            desc: "you will spawn here when you die but it will dissapear",
            req: ["wood", 100, "stone", 100],
            health: 400,
            ignoreCollision: !0,
            spawnPoint: !0,
            scale: 45,
            holdOffset: 20,
            placeOffset: -5,
        },
        { age: 7, group: j[12], name: "blocker", desc: "blocks building in radius", req: ["wood", 30, "stone", 25], ignoreCollision: !0, blocker: 300, health: 400, colDiv: 0.7, scale: 45, holdOffset: 20, placeOffset: -5 },
        {
            age: 7,
            group: j[13],
            name: "teleporter",
            desc: "teleports you to a random point on the map",
            req: ["wood", 60, "stone", 60],
            ignoreCollision: !0,
            teleport: !0,
            health: 200,
            colDiv: 0.7,
            scale: 45,
            holdOffset: 20,
            placeOffset: -5,
        },
    ];
for (let e = 0; e < dt.length; ++e) (dt[e].id = e), dt[e].pre && (dt[e].pre = e - dt[e].pre);
const R = { groups: j, projectiles: vc, weapons: xc, list: dt },
    bc = [
        "ahole",
        "anus",
        "ash0le",
        "ash0les",
        "asholes",
        "ass",
        "Ass Monkey",
        "Assface",
        "assh0le",
        "assh0lez",
        "asshole",
        "assholes",
        "assholz",
        "asswipe",
        "azzhole",
        "bassterds",
        "bastard",
        "bastards",
        "bastardz",
        "basterds",
        "basterdz",
        "Biatch",
        "bitch",
        "bitches",
        "Blow Job",
        "boffing",
        "butthole",
        "buttwipe",
        "c0ck",
        "c0cks",
        "c0k",
        "Carpet Muncher",
        "cawk",
        "cawks",
        "Clit",
        "cnts",
        "cntz",
        "cock",
        "cockhead",
        "cock-head",
        "cocks",
        "CockSucker",
        "cock-sucker",
        "crap",
        "cum",
        "cunt",
        "cunts",
        "cuntz",
        "dick",
        "dild0",
        "dild0s",
        "dildo",
        "dildos",
        "dilld0",
        "dilld0s",
        "dominatricks",
        "dominatrics",
        "dominatrix",
        "dyke",
        "enema",
        "f u c k",
        "f u c k e r",
        "fag",
        "fag1t",
        "faget",
        "fagg1t",
        "faggit",
        "faggot",
        "fagg0t",
        "fagit",
        "fags",
        "fagz",
        "faig",
        "faigs",
        "fart",
        "flipping the bird",
        "fuck",
        "fucker",
        "fuckin",
        "fucking",
        "fucks",
        "Fudge Packer",
        "fuk",
        "Fukah",
        "Fuken",
        "fuker",
        "Fukin",
        "Fukk",
        "Fukkah",
        "Fukken",
        "Fukker",
        "Fukkin",
        "g00k",
        "God-damned",
        "h00r",
        "h0ar",
        "h0re",
        "hells",
        "hoar",
        "hoor",
        "hoore",
        "jackoff",
        "jap",
        "japs",
        "jerk-off",
        "jisim",
        "jiss",
        "jizm",
        "jizz",
        "knob",
        "knobs",
        "knobz",
        "kunt",
        "kunts",
        "kuntz",
        "Lezzian",
        "Lipshits",
        "Lipshitz",
        "masochist",
        "masokist",
        "massterbait",
        "masstrbait",
        "masstrbate",
        "masterbaiter",
        "masterbate",
        "masterbates",
        "Motha Fucker",
        "Motha Fuker",
        "Motha Fukkah",
        "Motha Fukker",
        "Mother Fucker",
        "Mother Fukah",
        "Mother Fuker",
        "Mother Fukkah",
        "Mother Fukker",
        "mother-fucker",
        "Mutha Fucker",
        "Mutha Fukah",
        "Mutha Fuker",
        "Mutha Fukkah",
        "Mutha Fukker",
        "n1gr",
        "nastt",
        "nigger;",
        "nigur;",
        "niiger;",
        "niigr;",
        "orafis",
        "orgasim;",
        "orgasm",
        "orgasum",
        "oriface",
        "orifice",
        "orifiss",
        "packi",
        "packie",
        "packy",
        "paki",
        "pakie",
        "paky",
        "pecker",
        "peeenus",
        "peeenusss",
        "peenus",
        "peinus",
        "pen1s",
        "penas",
        "penis",
        "penis-breath",
        "penus",
        "penuus",
        "Phuc",
        "Phuck",
        "Phuk",
        "Phuker",
        "Phukker",
        "polac",
        "polack",
        "polak",
        "Poonani",
        "pr1c",
        "pr1ck",
        "pr1k",
        "pusse",
        "pussee",
        "pussy",
        "puuke",
        "puuker",
        "qweir",
        "recktum",
        "rectum",
        "retard",
        "sadist",
        "scank",
        "schlong",
        "screwing",
        "semen",
        "sex",
        "sexy",
        "Sh!t",
        "sh1t",
        "sh1ter",
        "sh1ts",
        "sh1tter",
        "sh1tz",
        "shit",
        "shits",
        "shitter",
        "Shitty",
        "Shity",
        "shitz",
        "Shyt",
        "Shyte",
        "Shytty",
        "Shyty",
        "skanck",
        "skank",
        "skankee",
        "skankey",
        "skanks",
        "Skanky",
        "slag",
        "slut",
        "sluts",
        "Slutty",
        "slutz",
        "son-of-a-bitch",
        "tit",
        "turd",
        "va1jina",
        "vag1na",
        "vagiina",
        "vagina",
        "vaj1na",
        "vajina",
        "vullva",
        "vulva",
        "w0p",
        "wh00r",
        "wh0re",
        "whore",
        "xrated",
        "xxx",
        "b!+ch",
        "bitch",
        "blowjob",
        "clit",
        "arschloch",
        "fuck",
        "shit",
        "ass",
        "asshole",
        "b!tch",
        "b17ch",
        "b1tch",
        "bastard",
        "bi+ch",
        "boiolas",
        "buceta",
        "c0ck",
        "cawk",
        "chink",
        "cipa",
        "clits",
        "cock",
        "cum",
        "cunt",
        "dildo",
        "dirsa",
        "ejakulate",
        "fatass",
        "fcuk",
        "fuk",
        "fux0r",
        "hoer",
        "hore",
        "jism",
        "kawk",
        "l3itch",
        "l3i+ch",
        "masturbate",
        "masterbat*",
        "masterbat3",
        "motherfucker",
        "s.o.b.",
        "mofo",
        "nazi",
        "nigga",
        "nigger",
        "nutsack",
        "phuck",
        "pimpis",
        "pusse",
        "pussy",
        "scrotum",
        "sh!t",
        "shemale",
        "shi+",
        "sh!+",
        "slut",
        "smut",
        "teets",
        "tits",
        "boobs",
        "b00bs",
        "teez",
        "testical",
        "testicle",
        "titt",
        "w00se",
        "jackoff",
        "wank",
        "whoar",
        "whore",
        "*damn",
        "*dyke",
        "*fuck*",
        "*shit*",
        "@$$",
        "amcik",
        "andskota",
        "arse*",
        "assrammer",
        "ayir",
        "bi7ch",
        "bitch*",
        "bollock*",
        "breasts",
        "butt-pirate",
        "cabron",
        "cazzo",
        "chraa",
        "chuj",
        "Cock*",
        "cunt*",
        "d4mn",
        "daygo",
        "dego",
        "dick*",
        "dike*",
        "dupa",
        "dziwka",
        "ejackulate",
        "Ekrem*",
        "Ekto",
        "enculer",
        "faen",
        "fag*",
        "fanculo",
        "fanny",
        "feces",
        "feg",
        "Felcher",
        "ficken",
        "fitt*",
        "Flikker",
        "foreskin",
        "Fotze",
        "Fu(*",
        "fuk*",
        "futkretzn",
        "gook",
        "guiena",
        "h0r",
        "h4x0r",
        "hell",
        "helvete",
        "hoer*",
        "honkey",
        "Huevon",
        "hui",
        "injun",
        "jizz",
        "kanker*",
        "kike",
        "klootzak",
        "kraut",
        "knulle",
        "kuk",
        "kuksuger",
        "Kurac",
        "kurwa",
        "kusi*",
        "kyrpa*",
        "lesbo",
        "mamhoon",
        "masturbat*",
        "merd*",
        "mibun",
        "monkleigh",
        "mouliewop",
        "muie",
        "mulkku",
        "muschi",
        "nazis",
        "nepesaurio",
        "nigger*",
        "orospu",
        "paska*",
        "perse",
        "picka",
        "pierdol*",
        "pillu*",
        "pimmel",
        "piss*",
        "pizda",
        "poontsee",
        "poop",
        "porn",
        "p0rn",
        "pr0n",
        "preteen",
        "pula",
        "pule",
        "puta",
        "puto",
        "qahbeh",
        "queef*",
        "rautenberg",
        "schaffer",
        "scheiss*",
        "schlampe",
        "schmuck",
        "screw",
        "sh!t*",
        "sharmuta",
        "sharmute",
        "shipal",
        "shiz",
        "skribz",
        "skurwysyn",
        "sphencter",
        "spic",
        "spierdalaj",
        "splooge",
        "suka",
        "b00b*",
        "testicle*",
        "titt*",
        "twat",
        "vittu",
        "wank*",
        "wetback*",
        "wichser",
        "wop*",
        "yed",
        "zabourah",
    ],
    Sc = { words: bc };
var Tc = {
        "4r5e": 1,
        "5h1t": 1,
        "5hit": 1,
        a55: 1,
        anal: 1,
        anus: 1,
        ar5e: 1,
        arrse: 1,
        arse: 1,
        ass: 1,
        "ass-fucker": 1,
        asses: 1,
        assfucker: 1,
        assfukka: 1,
        asshole: 1,
        assholes: 1,
        asswhole: 1,
        a_s_s: 1,
        "b!tch": 1,
        b00bs: 1,
        b17ch: 1,
        b1tch: 1,
        ballbag: 1,
        balls: 1,
        ballsack: 1,
        bastard: 1,
        beastial: 1,
        beastiality: 1,
        bellend: 1,
        bestial: 1,
        bestiality: 1,
        "bi+ch": 1,
        biatch: 1,
        bitch: 1,
        bitcher: 1,
        bitchers: 1,
        bitches: 1,
        bitchin: 1,
        bitching: 1,
        bloody: 1,
        "blow job": 1,
        blowjob: 1,
        blowjobs: 1,
        boiolas: 1,
        bollock: 1,
        bollok: 1,
        boner: 1,
        boob: 1,
        boobs: 1,
        booobs: 1,
        boooobs: 1,
        booooobs: 1,
        booooooobs: 1,
        breasts: 1,
        buceta: 1,
        bugger: 1,
        bum: 1,
        "bunny fucker": 1,
        butt: 1,
        butthole: 1,
        buttmuch: 1,
        buttplug: 1,
        c0ck: 1,
        c0cksucker: 1,
        "carpet muncher": 1,
        cawk: 1,
        chink: 1,
        cipa: 1,
        cl1t: 1,
        clit: 1,
        clitoris: 1,
        clits: 1,
        cnut: 1,
        cock: 1,
        "cock-sucker": 1,
        cockface: 1,
        cockhead: 1,
        cockmunch: 1,
        cockmuncher: 1,
        cocks: 1,
        cocksuck: 1,
        cocksucked: 1,
        cocksucker: 1,
        cocksucking: 1,
        cocksucks: 1,
        cocksuka: 1,
        cocksukka: 1,
        cok: 1,
        cokmuncher: 1,
        coksucka: 1,
        coon: 1,
        cox: 1,
        crap: 1,
        cum: 1,
        cummer: 1,
        cumming: 1,
        cums: 1,
        cumshot: 1,
        cunilingus: 1,
        cunillingus: 1,
        cunnilingus: 1,
        cunt: 1,
        cuntlick: 1,
        cuntlicker: 1,
        cuntlicking: 1,
        cunts: 1,
        cyalis: 1,
        cyberfuc: 1,
        cyberfuck: 1,
        cyberfucked: 1,
        cyberfucker: 1,
        cyberfuckers: 1,
        cyberfucking: 1,
        d1ck: 1,
        damn: 1,
        dick: 1,
        dickhead: 1,
        dildo: 1,
        dildos: 1,
        dink: 1,
        dinks: 1,
        dirsa: 1,
        dlck: 1,
        "dog-fucker": 1,
        doggin: 1,
        dogging: 1,
        donkeyribber: 1,
        doosh: 1,
        duche: 1,
        dyke: 1,
        ejaculate: 1,
        ejaculated: 1,
        ejaculates: 1,
        ejaculating: 1,
        ejaculatings: 1,
        ejaculation: 1,
        ejakulate: 1,
        "f u c k": 1,
        "f u c k e r": 1,
        f4nny: 1,
        fag: 1,
        fagging: 1,
        faggitt: 1,
        faggot: 1,
        faggs: 1,
        fagot: 1,
        fagots: 1,
        fags: 1,
        fanny: 1,
        fannyflaps: 1,
        fannyfucker: 1,
        fanyy: 1,
        fatass: 1,
        fcuk: 1,
        fcuker: 1,
        fcuking: 1,
        feck: 1,
        fecker: 1,
        felching: 1,
        fellate: 1,
        fellatio: 1,
        fingerfuck: 1,
        fingerfucked: 1,
        fingerfucker: 1,
        fingerfuckers: 1,
        fingerfucking: 1,
        fingerfucks: 1,
        fistfuck: 1,
        fistfucked: 1,
        fistfucker: 1,
        fistfuckers: 1,
        fistfucking: 1,
        fistfuckings: 1,
        fistfucks: 1,
        flange: 1,
        fook: 1,
        fooker: 1,
        fuck: 1,
        fucka: 1,
        fucked: 1,
        fucker: 1,
        fuckers: 1,
        fuckhead: 1,
        fuckheads: 1,
        fuckin: 1,
        fucking: 1,
        fuckings: 1,
        fuckingshitmotherfucker: 1,
        fuckme: 1,
        fucks: 1,
        fuckwhit: 1,
        fuckwit: 1,
        "fudge packer": 1,
        fudgepacker: 1,
        fuk: 1,
        fuker: 1,
        fukker: 1,
        fukkin: 1,
        fuks: 1,
        fukwhit: 1,
        fukwit: 1,
        fux: 1,
        fux0r: 1,
        f_u_c_k: 1,
        gangbang: 1,
        gangbanged: 1,
        gangbangs: 1,
        gaylord: 1,
        gaysex: 1,
        goatse: 1,
        God: 1,
        "god-dam": 1,
        "god-damned": 1,
        goddamn: 1,
        goddamned: 1,
        hardcoresex: 1,
        hell: 1,
        heshe: 1,
        hoar: 1,
        hoare: 1,
        hoer: 1,
        homo: 1,
        hore: 1,
        horniest: 1,
        horny: 1,
        hotsex: 1,
        "jack-off": 1,
        jackoff: 1,
        jap: 1,
        "jerk-off": 1,
        jism: 1,
        jiz: 1,
        jizm: 1,
        jizz: 1,
        kawk: 1,
        knob: 1,
        knobead: 1,
        knobed: 1,
        knobend: 1,
        knobhead: 1,
        knobjocky: 1,
        knobjokey: 1,
        kock: 1,
        kondum: 1,
        kondums: 1,
        kum: 1,
        kummer: 1,
        kumming: 1,
        kums: 1,
        kunilingus: 1,
        "l3i+ch": 1,
        l3itch: 1,
        labia: 1,
        lust: 1,
        lusting: 1,
        m0f0: 1,
        m0fo: 1,
        m45terbate: 1,
        ma5terb8: 1,
        ma5terbate: 1,
        masochist: 1,
        "master-bate": 1,
        masterb8: 1,
        "masterbat*": 1,
        masterbat3: 1,
        masterbate: 1,
        masterbation: 1,
        masterbations: 1,
        masturbate: 1,
        "mo-fo": 1,
        mof0: 1,
        mofo: 1,
        mothafuck: 1,
        mothafucka: 1,
        mothafuckas: 1,
        mothafuckaz: 1,
        mothafucked: 1,
        mothafucker: 1,
        mothafuckers: 1,
        mothafuckin: 1,
        mothafucking: 1,
        mothafuckings: 1,
        mothafucks: 1,
        "mother fucker": 1,
        motherfuck: 1,
        motherfucked: 1,
        motherfucker: 1,
        motherfuckers: 1,
        motherfuckin: 1,
        motherfucking: 1,
        motherfuckings: 1,
        motherfuckka: 1,
        motherfucks: 1,
        muff: 1,
        mutha: 1,
        muthafecker: 1,
        muthafuckker: 1,
        muther: 1,
        mutherfucker: 1,
        n1gga: 1,
        n1gger: 1,
        nazi: 1,
        nigg3r: 1,
        nigg4h: 1,
        nigga: 1,
        niggah: 1,
        niggas: 1,
        niggaz: 1,
        nigger: 1,
        niggers: 1,
        nob: 1,
        "nob jokey": 1,
        nobhead: 1,
        nobjocky: 1,
        nobjokey: 1,
        numbnuts: 1,
        nutsack: 1,
        orgasim: 1,
        orgasims: 1,
        orgasm: 1,
        orgasms: 1,
        p0rn: 1,
        pawn: 1,
        pecker: 1,
        penis: 1,
        penisfucker: 1,
        phonesex: 1,
        phuck: 1,
        phuk: 1,
        phuked: 1,
        phuking: 1,
        phukked: 1,
        phukking: 1,
        phuks: 1,
        phuq: 1,
        pigfucker: 1,
        pimpis: 1,
        piss: 1,
        pissed: 1,
        pisser: 1,
        pissers: 1,
        pisses: 1,
        pissflaps: 1,
        pissin: 1,
        pissing: 1,
        pissoff: 1,
        poop: 1,
        porn: 1,
        porno: 1,
        pornography: 1,
        pornos: 1,
        prick: 1,
        pricks: 1,
        pron: 1,
        pube: 1,
        pusse: 1,
        pussi: 1,
        pussies: 1,
        pussy: 1,
        pussys: 1,
        rectum: 1,
        retard: 1,
        rimjaw: 1,
        rimming: 1,
        "s hit": 1,
        "s.o.b.": 1,
        sadist: 1,
        schlong: 1,
        screwing: 1,
        scroat: 1,
        scrote: 1,
        scrotum: 1,
        semen: 1,
        sex: 1,
        "sh!+": 1,
        "sh!t": 1,
        sh1t: 1,
        shag: 1,
        shagger: 1,
        shaggin: 1,
        shagging: 1,
        shemale: 1,
        "shi+": 1,
        shit: 1,
        shitdick: 1,
        shite: 1,
        shited: 1,
        shitey: 1,
        shitfuck: 1,
        shitfull: 1,
        shithead: 1,
        shiting: 1,
        shitings: 1,
        shits: 1,
        shitted: 1,
        shitter: 1,
        shitters: 1,
        shitting: 1,
        shittings: 1,
        shitty: 1,
        skank: 1,
        slut: 1,
        sluts: 1,
        smegma: 1,
        smut: 1,
        snatch: 1,
        "son-of-a-bitch": 1,
        spac: 1,
        spunk: 1,
        s_h_i_t: 1,
        t1tt1e5: 1,
        t1tties: 1,
        teets: 1,
        teez: 1,
        testical: 1,
        testicle: 1,
        tit: 1,
        titfuck: 1,
        tits: 1,
        titt: 1,
        tittie5: 1,
        tittiefucker: 1,
        titties: 1,
        tittyfuck: 1,
        tittywank: 1,
        titwank: 1,
        tosser: 1,
        turd: 1,
        tw4t: 1,
        twat: 1,
        twathead: 1,
        twatty: 1,
        twunt: 1,
        twunter: 1,
        v14gra: 1,
        v1gra: 1,
        vagina: 1,
        viagra: 1,
        vulva: 1,
        w00se: 1,
        wang: 1,
        wank: 1,
        wanker: 1,
        wanky: 1,
        whoar: 1,
        whore: 1,
        willies: 1,
        willy: 1,
        xrated: 1,
        xxx: 1,
    },
    Ic = [
        "4r5e",
        "5h1t",
        "5hit",
        "a55",
        "anal",
        "anus",
        "ar5e",
        "arrse",
        "arse",
        "ass",
        "ass-fucker",
        "asses",
        "assfucker",
        "assfukka",
        "asshole",
        "assholes",
        "asswhole",
        "a_s_s",
        "b!tch",
        "b00bs",
        "b17ch",
        "b1tch",
        "ballbag",
        "balls",
        "ballsack",
        "bastard",
        "beastial",
        "beastiality",
        "bellend",
        "bestial",
        "bestiality",
        "bi+ch",
        "biatch",
        "bitch",
        "bitcher",
        "bitchers",
        "bitches",
        "bitchin",
        "bitching",
        "bloody",
        "blow job",
        "blowjob",
        "blowjobs",
        "boiolas",
        "bollock",
        "bollok",
        "boner",
        "boob",
        "boobs",
        "booobs",
        "boooobs",
        "booooobs",
        "booooooobs",
        "breasts",
        "buceta",
        "bugger",
        "bum",
        "bunny fucker",
        "butt",
        "butthole",
        "buttmuch",
        "buttplug",
        "c0ck",
        "c0cksucker",
        "carpet muncher",
        "cawk",
        "chink",
        "cipa",
        "cl1t",
        "clit",
        "clitoris",
        "clits",
        "cnut",
        "cock",
        "cock-sucker",
        "cockface",
        "cockhead",
        "cockmunch",
        "cockmuncher",
        "cocks",
        "cocksuck",
        "cocksucked",
        "cocksucker",
        "cocksucking",
        "cocksucks",
        "cocksuka",
        "cocksukka",
        "cok",
        "cokmuncher",
        "coksucka",
        "coon",
        "cox",
        "crap",
        "cum",
        "cummer",
        "cumming",
        "cums",
        "cumshot",
        "cunilingus",
        "cunillingus",
        "cunnilingus",
        "cunt",
        "cuntlick",
        "cuntlicker",
        "cuntlicking",
        "cunts",
        "cyalis",
        "cyberfuc",
        "cyberfuck",
        "cyberfucked",
        "cyberfucker",
        "cyberfuckers",
        "cyberfucking",
        "d1ck",
        "damn",
        "dick",
        "dickhead",
        "dildo",
        "dildos",
        "dink",
        "dinks",
        "dirsa",
        "dlck",
        "dog-fucker",
        "doggin",
        "dogging",
        "donkeyribber",
        "doosh",
        "duche",
        "dyke",
        "ejaculate",
        "ejaculated",
        "ejaculates",
        "ejaculating",
        "ejaculatings",
        "ejaculation",
        "ejakulate",
        "f u c k",
        "f u c k e r",
        "f4nny",
        "fag",
        "fagging",
        "faggitt",
        "faggot",
        "faggs",
        "fagot",
        "fagots",
        "fags",
        "fanny",
        "fannyflaps",
        "fannyfucker",
        "fanyy",
        "fatass",
        "fcuk",
        "fcuker",
        "fcuking",
        "feck",
        "fecker",
        "felching",
        "fellate",
        "fellatio",
        "fingerfuck",
        "fingerfucked",
        "fingerfucker",
        "fingerfuckers",
        "fingerfucking",
        "fingerfucks",
        "fistfuck",
        "fistfucked",
        "fistfucker",
        "fistfuckers",
        "fistfucking",
        "fistfuckings",
        "fistfucks",
        "flange",
        "fook",
        "fooker",
        "fuck",
        "fucka",
        "fucked",
        "fucker",
        "fuckers",
        "fuckhead",
        "fuckheads",
        "fuckin",
        "fucking",
        "fuckings",
        "fuckingshitmotherfucker",
        "fuckme",
        "fucks",
        "fuckwhit",
        "fuckwit",
        "fudge packer",
        "fudgepacker",
        "fuk",
        "fuker",
        "fukker",
        "fukkin",
        "fuks",
        "fukwhit",
        "fukwit",
        "fux",
        "fux0r",
        "f_u_c_k",
        "gangbang",
        "gangbanged",
        "gangbangs",
        "gaylord",
        "gaysex",
        "goatse",
        "God",
        "god-dam",
        "god-damned",
        "goddamn",
        "goddamned",
        "hardcoresex",
        "hell",
        "heshe",
        "hoar",
        "hoare",
        "hoer",
        "homo",
        "hore",
        "horniest",
        "horny",
        "hotsex",
        "jack-off",
        "jackoff",
        "jap",
        "jerk-off",
        "jism",
        "jiz",
        "jizm",
        "jizz",
        "kawk",
        "knob",
        "knobead",
        "knobed",
        "knobend",
        "knobhead",
        "knobjocky",
        "knobjokey",
        "kock",
        "kondum",
        "kondums",
        "kum",
        "kummer",
        "kumming",
        "kums",
        "kunilingus",
        "l3i+ch",
        "l3itch",
        "labia",
        "lust",
        "lusting",
        "m0f0",
        "m0fo",
        "m45terbate",
        "ma5terb8",
        "ma5terbate",
        "masochist",
        "master-bate",
        "masterb8",
        "masterbat*",
        "masterbat3",
        "masterbate",
        "masterbation",
        "masterbations",
        "masturbate",
        "mo-fo",
        "mof0",
        "mofo",
        "mothafuck",
        "mothafucka",
        "mothafuckas",
        "mothafuckaz",
        "mothafucked",
        "mothafucker",
        "mothafuckers",
        "mothafuckin",
        "mothafucking",
        "mothafuckings",
        "mothafucks",
        "mother fucker",
        "motherfuck",
        "motherfucked",
        "motherfucker",
        "motherfuckers",
        "motherfuckin",
        "motherfucking",
        "motherfuckings",
        "motherfuckka",
        "motherfucks",
        "muff",
        "mutha",
        "muthafecker",
        "muthafuckker",
        "muther",
        "mutherfucker",
        "n1gga",
        "n1gger",
        "nazi",
        "nigg3r",
        "nigg4h",
        "nigga",
        "niggah",
        "niggas",
        "niggaz",
        "nigger",
        "niggers",
        "nob",
        "nob jokey",
        "nobhead",
        "nobjocky",
        "nobjokey",
        "numbnuts",
        "nutsack",
        "orgasim",
        "orgasims",
        "orgasm",
        "orgasms",
        "p0rn",
        "pawn",
        "pecker",
        "penis",
        "penisfucker",
        "phonesex",
        "phuck",
        "phuk",
        "phuked",
        "phuking",
        "phukked",
        "phukking",
        "phuks",
        "phuq",
        "pigfucker",
        "pimpis",
        "piss",
        "pissed",
        "pisser",
        "pissers",
        "pisses",
        "pissflaps",
        "pissin",
        "pissing",
        "pissoff",
        "poop",
        "porn",
        "porno",
        "pornography",
        "pornos",
        "prick",
        "pricks",
        "pron",
        "pube",
        "pusse",
        "pussi",
        "pussies",
        "pussy",
        "pussys",
        "rectum",
        "retard",
        "rimjaw",
        "rimming",
        "s hit",
        "s.o.b.",
        "sadist",
        "schlong",
        "screwing",
        "scroat",
        "scrote",
        "scrotum",
        "semen",
        "sex",
        "sh!+",
        "sh!t",
        "sh1t",
        "shag",
        "shagger",
        "shaggin",
        "shagging",
        "shemale",
        "shi+",
        "shit",
        "shitdick",
        "shite",
        "shited",
        "shitey",
        "shitfuck",
        "shitfull",
        "shithead",
        "shiting",
        "shitings",
        "shits",
        "shitted",
        "shitter",
        "shitters",
        "shitting",
        "shittings",
        "shitty",
        "skank",
        "slut",
        "sluts",
        "smegma",
        "smut",
        "snatch",
        "son-of-a-bitch",
        "spac",
        "spunk",
        "s_h_i_t",
        "t1tt1e5",
        "t1tties",
        "teets",
        "teez",
        "testical",
        "testicle",
        "tit",
        "titfuck",
        "tits",
        "titt",
        "tittie5",
        "tittiefucker",
        "titties",
        "tittyfuck",
        "tittywank",
        "titwank",
        "tosser",
        "turd",
        "tw4t",
        "twat",
        "twathead",
        "twatty",
        "twunt",
        "twunter",
        "v14gra",
        "v1gra",
        "vagina",
        "viagra",
        "vulva",
        "w00se",
        "wang",
        "wank",
        "wanker",
        "wanky",
        "whoar",
        "whore",
        "willies",
        "willy",
        "xrated",
        "xxx",
    ],
    Mc = /\b(4r5e|5h1t|5hit|a55|anal|anus|ar5e|arrse|arse|ass|ass-fucker|asses|assfucker|assfukka|asshole|assholes|asswhole|a_s_s|b!tch|b00bs|b17ch|b1tch|ballbag|balls|ballsack|bastard|beastial|beastiality|bellend|bestial|bestiality|bi\+ch|biatch|bitch|bitcher|bitchers|bitches|bitchin|bitching|bloody|blow job|blowjob|blowjobs|boiolas|bollock|bollok|boner|boob|boobs|booobs|boooobs|booooobs|booooooobs|breasts|buceta|bugger|bum|bunny fucker|butt|butthole|buttmuch|buttplug|c0ck|c0cksucker|carpet muncher|cawk|chink|cipa|cl1t|clit|clitoris|clits|cnut|cock|cock-sucker|cockface|cockhead|cockmunch|cockmuncher|cocks|cocksuck|cocksucked|cocksucker|cocksucking|cocksucks|cocksuka|cocksukka|cok|cokmuncher|coksucka|coon|cox|crap|cum|cummer|cumming|cums|cumshot|cunilingus|cunillingus|cunnilingus|cunt|cuntlick|cuntlicker|cuntlicking|cunts|cyalis|cyberfuc|cyberfuck|cyberfucked|cyberfucker|cyberfuckers|cyberfucking|d1ck|damn|dick|dickhead|dildo|dildos|dink|dinks|dirsa|dlck|dog-fucker|doggin|dogging|donkeyribber|doosh|duche|dyke|ejaculate|ejaculated|ejaculates|ejaculating|ejaculatings|ejaculation|ejakulate|f u c k|f u c k e r|f4nny|fag|fagging|faggitt|faggot|faggs|fagot|fagots|fags|fanny|fannyflaps|fannyfucker|fanyy|fatass|fcuk|fcuker|fcuking|feck|fecker|felching|fellate|fellatio|fingerfuck|fingerfucked|fingerfucker|fingerfuckers|fingerfucking|fingerfucks|fistfuck|fistfucked|fistfucker|fistfuckers|fistfucking|fistfuckings|fistfucks|flange|fook|fooker|fuck|fucka|fucked|fucker|fuckers|fuckhead|fuckheads|fuckin|fucking|fuckings|fuckingshitmotherfucker|fuckme|fucks|fuckwhit|fuckwit|fudge packer|fudgepacker|fuk|fuker|fukker|fukkin|fuks|fukwhit|fukwit|fux|fux0r|f_u_c_k|gangbang|gangbanged|gangbangs|gaylord|gaysex|goatse|God|god-dam|god-damned|goddamn|goddamned|hardcoresex|hell|heshe|hoar|hoare|hoer|homo|hore|horniest|horny|hotsex|jack-off|jackoff|jap|jerk-off|jism|jiz|jizm|jizz|kawk|knob|knobead|knobed|knobend|knobhead|knobjocky|knobjokey|kock|kondum|kondums|kum|kummer|kumming|kums|kunilingus|l3i\+ch|l3itch|labia|lust|lusting|m0f0|m0fo|m45terbate|ma5terb8|ma5terbate|masochist|master-bate|masterb8|masterbat*|masterbat3|masterbate|masterbation|masterbations|masturbate|mo-fo|mof0|mofo|mothafuck|mothafucka|mothafuckas|mothafuckaz|mothafucked|mothafucker|mothafuckers|mothafuckin|mothafucking|mothafuckings|mothafucks|mother fucker|motherfuck|motherfucked|motherfucker|motherfuckers|motherfuckin|motherfucking|motherfuckings|motherfuckka|motherfucks|muff|mutha|muthafecker|muthafuckker|muther|mutherfucker|n1gga|n1gger|nazi|nigg3r|nigg4h|nigga|niggah|niggas|niggaz|nigger|niggers|nob|nob jokey|nobhead|nobjocky|nobjokey|numbnuts|nutsack|orgasim|orgasims|orgasm|orgasms|p0rn|pawn|pecker|penis|penisfucker|phonesex|phuck|phuk|phuked|phuking|phukked|phukking|phuks|phuq|pigfucker|pimpis|piss|pissed|pisser|pissers|pisses|pissflaps|pissin|pissing|pissoff|poop|porn|porno|pornography|pornos|prick|pricks|pron|pube|pusse|pussi|pussies|pussy|pussys|rectum|retard|rimjaw|rimming|s hit|s.o.b.|sadist|schlong|screwing|scroat|scrote|scrotum|semen|sex|sh!\+|sh!t|sh1t|shag|shagger|shaggin|shagging|shemale|shi\+|shit|shitdick|shite|shited|shitey|shitfuck|shitfull|shithead|shiting|shitings|shits|shitted|shitter|shitters|shitting|shittings|shitty|skank|slut|sluts|smegma|smut|snatch|son-of-a-bitch|spac|spunk|s_h_i_t|t1tt1e5|t1tties|teets|teez|testical|testicle|tit|titfuck|tits|titt|tittie5|tittiefucker|titties|tittyfuck|tittywank|titwank|tosser|turd|tw4t|twat|twathead|twatty|twunt|twunter|v14gra|v1gra|vagina|viagra|vulva|w00se|wang|wank|wanker|wanky|whoar|whore|willies|willy|xrated|xxx)\b/gi,
    Ec = { object: Tc, array: Ic, regex: Mc };
const Pc = Sc.words,
    Cc = Ec.array;
class Ac {
    constructor(t = {}) {
        Object.assign(this, {
            list: (t.emptyList && []) || Array.prototype.concat.apply(Pc, [Cc, t.list || []]),
            exclude: t.exclude || [],
            splitRegex: t.splitRegex || /\b/,
            placeHolder: t.placeHolder || "*",
            regex: t.regex || /[^a-zA-Z0-9|\$|\@]|\^/g,
            replaceRegex: t.replaceRegex || /\w/g,
        });
    }
    isProfane(t) {
        return (
            this.list.filter((i) => {
                const s = new RegExp(`\\b${i.replace(/(\W)/g, "\\$1")}\\b`, "gi");
                return !this.exclude.includes(i.toLowerCase()) && s.test(t);
            }).length > 0 || !1
        );
    }
    replaceWord(t) {
        return t.replace(this.regex, "").replace(this.replaceRegex, this.placeHolder);
    }
    clean(t) {
        return t
            .split(this.splitRegex)
            .map((i) => (this.isProfane(i) ? this.replaceWord(i) : i))
            .join(this.splitRegex.exec(t)[0]);
    }
    addWords() {
        let t = Array.from(arguments);
        this.list.push(...t),
            t
                .map((i) => i.toLowerCase())
                .forEach((i) => {
                    this.exclude.includes(i) && this.exclude.splice(this.exclude.indexOf(i), 1);
                });
    }
    removeWords() {
        this.exclude.push(...Array.from(arguments).map((t) => t.toLowerCase()));
    }
}
var Dc = Ac;
const Yr = new Dc(),
    Oc = [
        "jew",
        "black",
        "baby",
        "child",
        "white",
        "porn",
        "pedo",
        "trump",
        "clinton",
        "hitler",
        "nazi",
        "gay",
        "pride",
        "sex",
        "pleasure",
        "touch",
        "poo",
        "kids",
        "rape",
        "white power",
        "nigga",
        "nig nog",
        "doggy",
        "rapist",
        "boner",
        "nigger",
        "nigg",
        "finger",
        "nogger",
        "nagger",
        "nig",
        "fag",
        "gai",
        "pole",
        "stripper",
        "penis",
        "vagina",
        "pussy",
        "nazi",
        "hitler",
        "stalin",
        "burn",
        "chamber",
        "cock",
        "peen",
        "dick",
        "spick",
        "nieger",
        "die",
        "satan",
        "n|ig",
        "nlg",
        "cunt",
        "c0ck",
        "fag",
        "lick",
        "condom",
        "anal",
        "shit",
        "phile",
        "little",
        "kids",
        "free KR",
        "tiny",
        "sidney",
        "ass",
        "kill",
        ".io",
        "(dot)",
        "[dot]",
        "mini",
        "whiore",
        "whore",
        "faggot",
        "github",
        "1337",
        "666",
        "satan",
        "senpa",
        "discord",
        "d1scord",
        "mistik",
        ".io",
        "senpa.io",
        "sidney",
        "sid",
        "senpaio",
        "vries",
        "asa",
    ];
Yr.addWords(...Oc);
const _s = Math.abs,
    at = Math.cos,
    lt = Math.sin,
    Bs = Math.pow,
    Rc = Math.sqrt;
function _c(e, t, i, s, n, r, o, l, c, a, u, p, h, m) {
    (this.id = e), (this.sid = t), (this.tmpScore = 0), (this.team = null), (this.skinIndex = 0), (this.tailIndex = 0), (this.hitTime = 0), (this.tails = {});
    for (var w = 0; w < u.length; ++w) u[w].price <= 0 && (this.tails[u[w].id] = 1);
    this.skins = {};
    for (var w = 0; w < a.length; ++w) a[w].price <= 0 && (this.skins[a[w].id] = 1);
    (this.points = 0),
        (this.dt = 0),
        (this.hidden = !1),
        (this.itemCounts = {}),
        (this.isPlayer = !0),
        (this.pps = 0),
        (this.moveDir = void 0),
        (this.skinRot = 0),
        (this.lastPing = 0),
        (this.iconIndex = 0),
        (this.skinColor = 0),
        (this.spawn = function (k) {
            (this.active = !0),
                (this.alive = !0),
                (this.lockMove = !1),
                (this.lockDir = !1),
                (this.minimapCounter = 0),
                (this.chatCountdown = 0),
                (this.shameCount = 0),
                (this.shameTimer = 0),
                (this.sentTo = {}),
                (this.gathering = 0),
                (this.autoGather = 0),
                (this.animTime = 0),
                (this.animSpeed = 0),
                (this.mouseState = 0),
                (this.buildIndex = -1),
                (this.weaponIndex = 0),
                (this.dmgOverTime = {}),
                (this.noMovTimer = 0),
                (this.maxXP = 300),
                (this.XP = 0),
                (this.age = 1),
                (this.kills = 0),
                (this.upgrAge = 2),
                (this.upgradePoints = 0),
                (this.x = 0),
                (this.y = 0),
                (this.zIndex = 0),
                (this.xVel = 0),
                (this.yVel = 0),
                (this.slowMult = 1),
                (this.dir = 0),
                (this.dirPlus = 0),
                (this.targetDir = 0),
                (this.targetAngle = 0),
                (this.maxHealth = 100),
                (this.health = this.maxHealth),
                (this.scale = i.playerScale),
                (this.speed = i.playerSpeed),
                this.resetMoveDir(),
                this.resetResources(k),
                (this.items = [0, 3, 6, 10]),
                (this.weapons = [0]),
                (this.shootCount = 0),
                (this.weaponXP = []),
                (this.reloads = {}),
                (this.timeSpentNearVolcano = 0);
        }),
        (this.resetMoveDir = function () {
            this.moveDir = void 0;
        }),
        (this.resetResources = function (k) {
            for (let S = 0; S < i.resourceTypes.length; ++S) this[i.resourceTypes[S]] = k ? 100 : 0;
        }),
        (this.addItem = function (k) {
            const S = c.list[k];
            if (S) {
                for (let O = 0; O < this.items.length; ++O) if (c.list[this.items[O]].group == S.group) return this.buildIndex == this.items[O] && (this.buildIndex = k), (this.items[O] = k), !0;
                return this.items.push(k), !0;
            }
            return !1;
        }),
        (this.setUserData = function (k) {
            if (k) {
                this.name = "unknown";
                let S = k.name + "";
                (S = S.slice(0, i.maxNameLength)), (S = S.replace(/[^\w:\(\)\/? -]+/gim, " ")), (S = S.replace(/[^\x00-\x7F]/g, " ")), (S = S.trim());
                let O = !1;
                const U = S.toLowerCase().replace(/\s/g, "").replace(/1/g, "i").replace(/0/g, "o").replace(/5/g, "s");
                for (const L of Yr.list)
                    if (U.indexOf(L) != -1) {
                        O = !0;
                        break;
                    }
                S.length > 0 && !O && (this.name = S), (this.skinColor = 0), i.skinColors[k.skin] && (this.skinColor = k.skin);
            }
        }),
        (this.getData = function () {
            return [this.id, this.sid, this.name, s.fixTo(this.x, 2), s.fixTo(this.y, 2), s.fixTo(this.dir, 3), this.health, this.maxHealth, this.scale, this.skinColor];
        }),
        (this.setData = function (k) {
            (this.id = k[0]), (this.sid = k[1]), (this.name = k[2]), (this.x = k[3]), (this.y = k[4]), (this.dir = k[5]), (this.health = k[6]), (this.maxHealth = k[7]), (this.scale = k[8]), (this.skinColor = k[9]);
        });
    let v = 0;
    (this.update = function (k) {
        if (!this.alive) return;
        if (
            ((s.getDistance(this.x, this.y, i.volcanoLocationX, i.volcanoLocationY) || 0) < i.volcanoAggressionRadius &&
                ((this.timeSpentNearVolcano += k),
                this.timeSpentNearVolcano >= 1e3 && (this.changeHealth(i.volcanoDamagePerSecond, null), p.send(this.id, "8", Math.round(this.x), Math.round(this.y), i.volcanoDamagePerSecond, -1), (this.timeSpentNearVolcano %= 1e3))),
            this.shameTimer > 0 && ((this.shameTimer -= k), this.shameTimer <= 0 && ((this.shameTimer = 0), (this.shameCount = 0))),
            (v -= k),
            v <= 0)
        ) {
            const _ = (this.skin && this.skin.healthRegen ? this.skin.healthRegen : 0) + (this.tail && this.tail.healthRegen ? this.tail.healthRegen : 0);
            _ && this.changeHealth(_, this),
                this.dmgOverTime.dmg && (this.changeHealth(-this.dmgOverTime.dmg, this.dmgOverTime.doer), (this.dmgOverTime.time -= 1), this.dmgOverTime.time <= 0 && (this.dmgOverTime.dmg = 0)),
                this.healCol && this.changeHealth(this.healCol, this),
                (v = 1e3);
        }
        if (!this.alive) return;
        if ((this.slowMult < 1 && ((this.slowMult += 8e-4 * k), this.slowMult > 1 && (this.slowMult = 1)), (this.noMovTimer += k), (this.xVel || this.yVel) && (this.noMovTimer = 0), this.lockMove)) (this.xVel = 0), (this.yVel = 0);
        else {
            let _ =
                (this.buildIndex >= 0 ? 0.5 : 1) *
                (c.weapons[this.weaponIndex].spdMult || 1) *
                ((this.skin && this.skin.spdMult) || 1) *
                ((this.tail && this.tail.spdMult) || 1) *
                (this.y <= i.snowBiomeTop ? (this.skin && this.skin.coldM ? 1 : i.snowSpeed) : 1) *
                this.slowMult;
            !this.zIndex &&
                this.y >= i.mapScale / 2 - i.riverWidth / 2 &&
                this.y <= i.mapScale / 2 + i.riverWidth / 2 &&
                (this.skin && this.skin.watrImm ? ((_ *= 0.75), (this.xVel += i.waterCurrent * 0.4 * k)) : ((_ *= 0.33), (this.xVel += i.waterCurrent * k)));
            let $ = this.moveDir != null ? at(this.moveDir) : 0,
                V = this.moveDir != null ? lt(this.moveDir) : 0;
            const z = Rc($ * $ + V * V);
            z != 0 && (($ /= z), (V /= z)), $ && (this.xVel += $ * this.speed * _ * k), V && (this.yVel += V * this.speed * _ * k);
        }
        (this.zIndex = 0), (this.lockMove = !1), (this.healCol = 0);
        let O;
        const U = s.getDistance(0, 0, this.xVel * k, this.yVel * k),
            L = Math.min(4, Math.max(1, Math.round(U / 40))),
            q = 1 / L;
        let P = {};
        for (var W = 0; W < L; ++W) {
            this.xVel && (this.x += this.xVel * k * q), this.yVel && (this.y += this.yVel * k * q), (O = r.getGridArrays(this.x, this.y, this.scale));
            for (let _ = 0; _ < O.length; ++_) {
                for (let $ = 0; $ < O[_].length && !(O[_][$].active && !P[O[_][$].sid] && r.checkCollision(this, O[_][$], q) && ((P[O[_][$].sid] = !0), !this.alive)); ++$);
                if (!this.alive) break;
            }
            if (!this.alive) break;
        }
        for (var F = o.indexOf(this), W = F + 1; W < o.length; ++W) o[W] != this && o[W].alive && r.checkCollision(this, o[W]);
        if (
            (this.xVel && ((this.xVel *= Bs(i.playerDecel, k)), this.xVel <= 0.01 && this.xVel >= -0.01 && (this.xVel = 0)),
            this.yVel && ((this.yVel *= Bs(i.playerDecel, k)), this.yVel <= 0.01 && this.yVel >= -0.01 && (this.yVel = 0)),
            this.x - this.scale < 0 ? (this.x = this.scale) : this.x + this.scale > i.mapScale && (this.x = i.mapScale - this.scale),
            this.y - this.scale < 0 ? (this.y = this.scale) : this.y + this.scale > i.mapScale && (this.y = i.mapScale - this.scale),
            this.buildIndex < 0)
        ) {
            if (this.reloads[this.weaponIndex] > 0) (this.reloads[this.weaponIndex] -= k), (this.gathering = this.mouseState);
            else if (this.gathering || this.autoGather) {
                let _ = !0;
                if (c.weapons[this.weaponIndex].gather != null) this.gather(o);
                else if (c.weapons[this.weaponIndex].projectile != null && this.hasRes(c.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0)) {
                    this.useRes(c.weapons[this.weaponIndex], this.skin ? this.skin.projCost : 0), (this.noMovTimer = 0);
                    var F = c.weapons[this.weaponIndex].projectile;
                    const V = this.scale * 2,
                        z = this.skin && this.skin.aMlt ? this.skin.aMlt : 1;
                    c.weapons[this.weaponIndex].rec && ((this.xVel -= c.weapons[this.weaponIndex].rec * at(this.dir)), (this.yVel -= c.weapons[this.weaponIndex].rec * lt(this.dir))),
                        n.addProjectile(this.x + V * at(this.dir), this.y + V * lt(this.dir), this.dir, c.projectiles[F].range * z, c.projectiles[F].speed * z, F, this, null, this.zIndex);
                } else _ = !1;
                (this.gathering = this.mouseState), _ && (this.reloads[this.weaponIndex] = c.weapons[this.weaponIndex].speed * ((this.skin && this.skin.atkSpd) || 1));
            }
        }
    }),
        (this.addWeaponXP = function (k) {
            this.weaponXP[this.weaponIndex] || (this.weaponXP[this.weaponIndex] = 0), (this.weaponXP[this.weaponIndex] += k);
        }),
        (this.earnXP = function (k) {
            this.age < i.maxAge &&
                ((this.XP += k),
                this.XP >= this.maxXP
                    ? (this.age < i.maxAge ? (this.age++, (this.XP = 0), (this.maxXP *= 1.2)) : (this.XP = this.maxXP),
                      this.upgradePoints++,
                      p.send(this.id, "U", this.upgradePoints, this.upgrAge),
                      p.send(this.id, "T", this.XP, s.fixTo(this.maxXP, 1), this.age))
                    : p.send(this.id, "T", this.XP));
        }),
        (this.changeHealth = function (k, S) {
            if (k > 0 && this.health >= this.maxHealth) return !1;
            k < 0 && this.skin && (k *= this.skin.dmgMult || 1),
                k < 0 && this.tail && (k *= this.tail.dmgMult || 1),
                k < 0 && (this.hitTime = Date.now()),
                (this.health += k),
                this.health > this.maxHealth && ((k -= this.health - this.maxHealth), (this.health = this.maxHealth)),
                this.health <= 0 && this.kill(S);
            for (let O = 0; O < o.length; ++O) this.sentTo[o[O].id] && p.send(o[O].id, "O", this.sid, this.health);
            return S && S.canSee(this) && !(S == this && k < 0) && p.send(S.id, "8", Math.round(this.x), Math.round(this.y), Math.round(-k), 1), !0;
        }),
        (this.kill = function (k) {
            k && k.alive && (k.kills++, k.skin && k.skin.goldSteal ? h(k, Math.round(this.points / 2)) : h(k, Math.round(this.age * 100 * (k.skin && k.skin.kScrM ? k.skin.kScrM : 1))), p.send(k.id, "N", "kills", k.kills, 1)),
                (this.alive = !1),
                p.send(this.id, "P"),
                m();
        }),
        (this.addResource = function (k, S, O) {
            !O && S > 0 && this.addWeaponXP(S), k == 3 ? h(this, S, !0) : ((this[i.resourceTypes[k]] += S), p.send(this.id, "N", i.resourceTypes[k], this[i.resourceTypes[k]], 1));
        }),
        (this.changeItemCount = function (k, S) {
            (this.itemCounts[k] = this.itemCounts[k] || 0), (this.itemCounts[k] += S), p.send(this.id, "S", k, this.itemCounts[k]);
        }),
        (this.buildItem = function (k) {
            const S = this.scale + k.scale + (k.placeOffset || 0),
                O = this.x + S * at(this.dir),
                U = this.y + S * lt(this.dir);
            if (this.canBuild(k) && !(k.consume && this.skin && this.skin.noEat) && (k.consume || r.checkItemLocation(O, U, k.scale, 0.6, k.id, !1, this))) {
                let L = !1;
                if (k.consume) {
                    if (this.hitTime) {
                        const q = Date.now() - this.hitTime;
                        (this.hitTime = 0), q <= 120 ? (this.shameCount++, this.shameCount >= 8 && ((this.shameTimer = 3e4), (this.shameCount = 0))) : ((this.shameCount -= 2), this.shameCount <= 0 && (this.shameCount = 0));
                    }
                    this.shameTimer <= 0 && (L = k.consume(this));
                } else (L = !0), k.group.limit && this.changeItemCount(k.group.id, 1), k.pps && (this.pps += k.pps), r.add(r.objects.length, O, U, this.dir, k.scale, k.type, k, !1, this);
                L && (this.useRes(k), (this.buildIndex = -1));
            }
        }),
        (this.hasRes = function (k, S) {
            for (let O = 0; O < k.req.length; ) {
                if (this[k.req[O]] < Math.round(k.req[O + 1] * (S || 1))) return !1;
                O += 2;
            }
            return !0;
        }),
        (this.useRes = function (k, S) {
            if (!i.inSandbox) for (let O = 0; O < k.req.length; ) this.addResource(i.resourceTypes.indexOf(k.req[O]), -Math.round(k.req[O + 1] * (S || 1))), (O += 2);
        }),
        (this.canBuild = function (k) {
            const S = i.inSandbox ? k.group.sandboxLimit || Math.max(k.group.limit * 3, 99) : k.group.limit;
            return S && this.itemCounts[k.group.id] >= S ? !1 : i.inSandbox ? !0 : this.hasRes(k);
        }),
        (this.gather = function () {
            (this.noMovTimer = 0), (this.slowMult -= c.weapons[this.weaponIndex].hitSlow || 0.3), this.slowMult < 0 && (this.slowMult = 0);
            const k = i.fetchVariant(this),
                S = k.poison,
                O = k.val,
                U = {};
            let L, q, P, W;
            const F = r.getGridArrays(this.x, this.y, c.weapons[this.weaponIndex].range);
            for (let $ = 0; $ < F.length; ++$)
                for (var _ = 0; _ < F[$].length; ++_)
                    if (
                        ((P = F[$][_]),
                        P.active &&
                            !P.dontGather &&
                            !U[P.sid] &&
                            P.visibleToPlayer(this) &&
                            ((L = s.getDistance(this.x, this.y, P.x, P.y) - P.scale), L <= c.weapons[this.weaponIndex].range && ((q = s.getDirection(P.x, P.y, this.x, this.y)), s.getAngleDist(q, this.dir) <= i.gatherAngle)))
                    ) {
                        if (((U[P.sid] = 1), P.health)) {
                            if (P.changeHealth(-c.weapons[this.weaponIndex].dmg * O * (c.weapons[this.weaponIndex].sDmg || 1) * (this.skin && this.skin.bDmg ? this.skin.bDmg : 1), this)) {
                                for (let V = 0; V < P.req.length; ) this.addResource(i.resourceTypes.indexOf(P.req[V]), P.req[V + 1]), (V += 2);
                                r.disableObj(P);
                            }
                        } else {
                            if (P.name === "volcano") this.hitVolcano(c.weapons[this.weaponIndex].gather);
                            else {
                                this.earnXP(4 * c.weapons[this.weaponIndex].gather);
                                const V = c.weapons[this.weaponIndex].gather + (P.type == 3 ? 4 : 0);
                                this.addResource(P.type, V);
                            }
                            this.skin && this.skin.extraGold && this.addResource(3, 1);
                        }
                        (W = !0), r.hitObj(P, q);
                    }
            for (var _ = 0; _ < o.length + l.length; ++_)
                if (
                    ((P = o[_] || l[_ - o.length]),
                    P != this &&
                        P.alive &&
                        !(P.team && P.team == this.team) &&
                        ((L = s.getDistance(this.x, this.y, P.x, P.y) - P.scale * 1.8), L <= c.weapons[this.weaponIndex].range && ((q = s.getDirection(P.x, P.y, this.x, this.y)), s.getAngleDist(q, this.dir) <= i.gatherAngle)))
                ) {
                    let V = c.weapons[this.weaponIndex].steal;
                    V && P.addResource && ((V = Math.min(P.points || 0, V)), this.addResource(3, V), P.addResource(3, -V));
                    let z = O;
                    P.weaponIndex != null && c.weapons[P.weaponIndex].shield && s.getAngleDist(q + Math.PI, P.dir) <= i.shieldAngle && (z = c.weapons[P.weaponIndex].shield);
                    const X = c.weapons[this.weaponIndex].dmg,
                        G = X * (this.skin && this.skin.dmgMultO ? this.skin.dmgMultO : 1) * (this.tail && this.tail.dmgMultO ? this.tail.dmgMultO : 1),
                        te = 0.3 * (P.weightM || 1) + (c.weapons[this.weaponIndex].knock || 0);
                    (P.xVel += te * at(q)),
                        (P.yVel += te * lt(q)),
                        this.skin && this.skin.healD && this.changeHealth(G * z * this.skin.healD, this),
                        this.tail && this.tail.healD && this.changeHealth(G * z * this.tail.healD, this),
                        P.skin && P.skin.dmg && this.changeHealth(-X * P.skin.dmg, P),
                        P.tail && P.tail.dmg && this.changeHealth(-X * P.tail.dmg, P),
                        P.dmgOverTime && this.skin && this.skin.poisonDmg && !(P.skin && P.skin.poisonRes) && ((P.dmgOverTime.dmg = this.skin.poisonDmg), (P.dmgOverTime.time = this.skin.poisonTime || 1), (P.dmgOverTime.doer = this)),
                        P.dmgOverTime && S && !(P.skin && P.skin.poisonRes) && ((P.dmgOverTime.dmg = 5), (P.dmgOverTime.time = 5), (P.dmgOverTime.doer = this)),
                        P.skin && P.skin.dmgK && ((this.xVel -= P.skin.dmgK * at(q)), (this.yVel -= P.skin.dmgK * lt(q))),
                        P.changeHealth(-G * z, this, this);
                }
            this.sendAnimation(W ? 1 : 0);
        }),
        (this.hitVolcano = function (k) {
            const S = 5 + Math.round(k / 3.5);
            this.addResource(2, S), this.addResource(3, S);
        }),
        (this.sendAnimation = function (k) {
            for (let S = 0; S < o.length; ++S) this.sentTo[o[S].id] && this.canSee(o[S]) && p.send(o[S].id, "K", this.sid, k ? 1 : 0, this.weaponIndex);
        });
    let x = 0,
        D = 0;
    (this.animate = function (k) {
        this.animTime > 0 &&
            ((this.animTime -= k),
            this.animTime <= 0
                ? ((this.animTime = 0), (this.dirPlus = 0), (x = 0), (D = 0))
                : D == 0
                ? ((x += k / (this.animSpeed * i.hitReturnRatio)), (this.dirPlus = s.lerp(0, this.targetAngle, Math.min(1, x))), x >= 1 && ((x = 1), (D = 1)))
                : ((x -= k / (this.animSpeed * (1 - i.hitReturnRatio))), (this.dirPlus = s.lerp(0, this.targetAngle, Math.max(0, x)))));
    }),
        (this.startAnim = function (k, S) {
            (this.animTime = this.animSpeed = c.weapons[S].speed), (this.targetAngle = k ? -i.hitAngle : -Math.PI), (x = 0), (D = 0);
        }),
        (this.canSee = function (k) {
            if (!k || (k.skin && k.skin.invisTimer && k.noMovTimer >= k.skin.invisTimer)) return !1;
            const S = _s(k.x - this.x) - k.scale,
                O = _s(k.y - this.y) - k.scale;
            return S <= (i.maxScreenWidth / 2) * 1.3 && O <= (i.maxScreenHeight / 2) * 1.3;
        });
}
const Bc = [
        { id: 45, name: "Shame!", dontSell: !0, price: 0, scale: 120, desc: "hacks are for losers" },
        { id: 51, name: "Moo Cap", price: 0, scale: 120, desc: "coolest mooer around" },
        { id: 50, name: "Apple Cap", price: 0, scale: 120, desc: "apple farms remembers" },
        { id: 28, name: "Moo Head", price: 0, scale: 120, desc: "no effect" },
        { id: 29, name: "Pig Head", price: 0, scale: 120, desc: "no effect" },
        { id: 30, name: "Fluff Head", price: 0, scale: 120, desc: "no effect" },
        { id: 36, name: "Pandou Head", price: 0, scale: 120, desc: "no effect" },
        { id: 37, name: "Bear Head", price: 0, scale: 120, desc: "no effect" },
        { id: 38, name: "Monkey Head", price: 0, scale: 120, desc: "no effect" },
        { id: 44, name: "Polar Head", price: 0, scale: 120, desc: "no effect" },
        { id: 35, name: "Fez Hat", price: 0, scale: 120, desc: "no effect" },
        { id: 42, name: "Enigma Hat", price: 0, scale: 120, desc: "join the enigma army" },
        { id: 43, name: "Blitz Hat", price: 0, scale: 120, desc: "hey everybody i'm blitz" },
        { id: 49, name: "Bob XIII Hat", price: 0, scale: 120, desc: "like and subscribe" },
        { id: 57, name: "Pumpkin", price: 50, scale: 120, desc: "Spooooky" },
        { id: 8, name: "Bummle Hat", price: 100, scale: 120, desc: "no effect" },
        { id: 2, name: "Straw Hat", price: 500, scale: 120, desc: "no effect" },
        { id: 15, name: "Winter Cap", price: 600, scale: 120, desc: "allows you to move at normal speed in snow", coldM: 1 },
        { id: 5, name: "Cowboy Hat", price: 1e3, scale: 120, desc: "no effect" },
        { id: 4, name: "Ranger Hat", price: 2e3, scale: 120, desc: "no effect" },
        { id: 18, name: "Explorer Hat", price: 2e3, scale: 120, desc: "no effect" },
        { id: 31, name: "Flipper Hat", price: 2500, scale: 120, desc: "have more control while in water", watrImm: !0 },
        { id: 1, name: "Marksman Cap", price: 3e3, scale: 120, desc: "increases arrow speed and range", aMlt: 1.3 },
        { id: 10, name: "Bush Gear", price: 3e3, scale: 160, desc: "allows you to disguise yourself as a bush" },
        { id: 48, name: "Halo", price: 3e3, scale: 120, desc: "no effect" },
        { id: 6, name: "Soldier Helmet", price: 4e3, scale: 120, desc: "reduces damage taken but slows movement", spdMult: 0.94, dmgMult: 0.75 },
        { id: 23, name: "Anti Venom Gear", price: 4e3, scale: 120, desc: "makes you immune to poison", poisonRes: 1 },
        { id: 13, name: "Medic Gear", price: 5e3, scale: 110, desc: "slowly regenerates health over time", healthRegen: 3 },
        { id: 9, name: "Miners Helmet", price: 5e3, scale: 120, desc: "earn 1 extra gold per resource", extraGold: 1 },
        { id: 32, name: "Musketeer Hat", price: 5e3, scale: 120, desc: "reduces cost of projectiles", projCost: 0.5 },
        { id: 7, name: "Bull Helmet", price: 6e3, scale: 120, desc: "increases damage done but drains health", healthRegen: -5, dmgMultO: 1.5, spdMult: 0.96 },
        { id: 22, name: "Emp Helmet", price: 6e3, scale: 120, desc: "turrets won't attack but you move slower", antiTurret: 1, spdMult: 0.7 },
        { id: 12, name: "Booster Hat", price: 6e3, scale: 120, desc: "increases your movement speed", spdMult: 1.16 },
        { id: 26, name: "Barbarian Armor", price: 8e3, scale: 120, desc: "knocks back enemies that attack you", dmgK: 0.6 },
        { id: 21, name: "Plague Mask", price: 1e4, scale: 120, desc: "melee attacks deal poison damage", poisonDmg: 5, poisonTime: 6 },
        { id: 46, name: "Bull Mask", price: 1e4, scale: 120, desc: "bulls won't target you unless you attack them", bullRepel: 1 },
        { id: 14, name: "Windmill Hat", topSprite: !0, price: 1e4, scale: 120, desc: "generates points while worn", pps: 1.5 },
        { id: 11, name: "Spike Gear", topSprite: !0, price: 1e4, scale: 120, desc: "deal damage to players that damage you", dmg: 0.45 },
        { id: 53, name: "Turret Gear", topSprite: !0, price: 1e4, scale: 120, desc: "you become a walking turret", turret: { proj: 1, range: 700, rate: 2500 }, spdMult: 0.7 },
        { id: 20, name: "Samurai Armor", price: 12e3, scale: 120, desc: "increased attack speed and fire rate", atkSpd: 0.78 },
        { id: 58, name: "Dark Knight", price: 12e3, scale: 120, desc: "restores health when you deal damage", healD: 0.4 },
        { id: 27, name: "Scavenger Gear", price: 15e3, scale: 120, desc: "earn double points for each kill", kScrM: 2 },
        { id: 40, name: "Tank Gear", price: 15e3, scale: 120, desc: "increased damage to buildings but slower movement", spdMult: 0.3, bDmg: 3.3 },
        { id: 52, name: "Thief Gear", price: 15e3, scale: 120, desc: "steal half of a players gold when you kill them", goldSteal: 0.5 },
        { id: 55, name: "Bloodthirster", price: 2e4, scale: 120, desc: "Restore Health when dealing damage. And increased damage", healD: 0.25, dmgMultO: 1.2 },
        { id: 56, name: "Assassin Gear", price: 2e4, scale: 120, desc: "Go invisible when not moving. Can't eat. Increased speed", noEat: !0, spdMult: 1.1, invisTimer: 1e3 },
    ],
    zc = [
        { id: 12, name: "Snowball", price: 1e3, scale: 105, xOff: 18, desc: "no effect" },
        { id: 9, name: "Tree Cape", price: 1e3, scale: 90, desc: "no effect" },
        { id: 10, name: "Stone Cape", price: 1e3, scale: 90, desc: "no effect" },
        { id: 3, name: "Cookie Cape", price: 1500, scale: 90, desc: "no effect" },
        { id: 8, name: "Cow Cape", price: 2e3, scale: 90, desc: "no effect" },
        { id: 11, name: "Monkey Tail", price: 2e3, scale: 97, xOff: 25, desc: "Super speed but reduced damage", spdMult: 1.35, dmgMultO: 0.2 },
        { id: 17, name: "Apple Basket", price: 3e3, scale: 80, xOff: 12, desc: "slowly regenerates health over time", healthRegen: 1 },
        { id: 6, name: "Winter Cape", price: 3e3, scale: 90, desc: "no effect" },
        { id: 4, name: "Skull Cape", price: 4e3, scale: 90, desc: "no effect" },
        { id: 5, name: "Dash Cape", price: 5e3, scale: 90, desc: "no effect" },
        { id: 2, name: "Dragon Cape", price: 6e3, scale: 90, desc: "no effect" },
        { id: 1, name: "Super Cape", price: 8e3, scale: 90, desc: "no effect" },
        { id: 7, name: "Troll Cape", price: 8e3, scale: 90, desc: "no effect" },
        { id: 14, name: "Thorns", price: 1e4, scale: 115, xOff: 20, desc: "no effect" },
        { id: 15, name: "Blockades", price: 1e4, scale: 95, xOff: 15, desc: "no effect" },
        { id: 20, name: "Devils Tail", price: 1e4, scale: 95, xOff: 20, desc: "no effect" },
        { id: 16, name: "Sawblade", price: 12e3, scale: 90, spin: !0, xOff: 0, desc: "deal damage to players that damage you", dmg: 0.15 },
        { id: 13, name: "Angel Wings", price: 15e3, scale: 138, xOff: 22, desc: "slowly regenerates health over time", healthRegen: 3 },
        { id: 19, name: "Shadow Wings", price: 15e3, scale: 138, xOff: 22, desc: "increased movement speed", spdMult: 1.1 },
        { id: 18, name: "Blood Wings", price: 2e4, scale: 178, xOff: 26, desc: "restores health when you deal damage", healD: 0.2 },
        { id: 21, name: "Corrupt X Wings", price: 2e4, scale: 178, xOff: 26, desc: "deal damage to players that damage you", dmg: 0.25 },
    ],
    $r = { hats: Bc, accessories: zc };
function Hc(e, t, i, s, n, r, o) {
    this.init = function (a, u, p, h, m, w, v, x, D) {
        (this.active = !0), (this.indx = a), (this.x = u), (this.y = p), (this.dir = h), (this.skipMov = !0), (this.speed = m), (this.dmg = w), (this.scale = x), (this.range = v), (this.owner = D), o && (this.sentTo = {});
    };
    const l = [];
    let c;
    this.update = function (a) {
        if (this.active) {
            let p = this.speed * a,
                h;
            if (
                (this.skipMov
                    ? (this.skipMov = !1)
                    : ((this.x += p * Math.cos(this.dir)),
                      (this.y += p * Math.sin(this.dir)),
                      (this.range -= p),
                      this.range <= 0 && ((this.x += this.range * Math.cos(this.dir)), (this.y += this.range * Math.sin(this.dir)), (p = 1), (this.range = 0), (this.active = !1))),
                o)
            ) {
                for (var u = 0; u < e.length; ++u)
                    !this.sentTo[e[u].id] &&
                        e[u].canSee(this) &&
                        ((this.sentTo[e[u].id] = 1), o.send(e[u].id, "X", r.fixTo(this.x, 1), r.fixTo(this.y, 1), r.fixTo(this.dir, 2), r.fixTo(this.range, 1), this.speed, this.indx, this.layer, this.sid));
                l.length = 0;
                for (var u = 0; u < e.length + t.length; ++u)
                    (c = e[u] || t[u - e.length]),
                        c.alive &&
                            c != this.owner &&
                            !(this.owner.team && c.team == this.owner.team) &&
                            r.lineInRect(c.x - c.scale, c.y - c.scale, c.x + c.scale, c.y + c.scale, this.x, this.y, this.x + p * Math.cos(this.dir), this.y + p * Math.sin(this.dir)) &&
                            l.push(c);
                const m = i.getGridArrays(this.x, this.y, this.scale);
                for (let w = 0; w < m.length; ++w)
                    for (let v = 0; v < m[w].length; ++v)
                        (c = m[w][v]),
                            (h = c.getScale()),
                            c.active &&
                                this.ignoreObj != c.sid &&
                                this.layer <= c.layer &&
                                l.indexOf(c) < 0 &&
                                !c.ignoreCollision &&
                                r.lineInRect(c.x - h, c.y - h, c.x + h, c.y + h, this.x, this.y, this.x + p * Math.cos(this.dir), this.y + p * Math.sin(this.dir)) &&
                                l.push(c);
                if (l.length > 0) {
                    let w = null,
                        v = null,
                        x = null;
                    for (var u = 0; u < l.length; ++u) (x = r.getDistance(this.x, this.y, l[u].x, l[u].y)), (v == null || x < v) && ((v = x), (w = l[u]));
                    if (w.isPlayer || w.isAI) {
                        const D = 0.3 * (w.weightM || 1);
                        (w.xVel += D * Math.cos(this.dir)),
                            (w.yVel += D * Math.sin(this.dir)),
                            (w.weaponIndex == null || !(s.weapons[w.weaponIndex].shield && r.getAngleDist(this.dir + Math.PI, w.dir) <= n.shieldAngle)) && w.changeHealth(-this.dmg, this.owner, this.owner);
                    } else {
                        w.projDmg && w.health && w.changeHealth(-this.dmg) && i.disableObj(w);
                        for (var u = 0; u < e.length; ++u)
                            e[u].active &&
                                (w.sentTo[e[u].id] && (w.active ? e[u].canSee(w) && o.send(e[u].id, "L", r.fixTo(this.dir, 2), w.sid) : o.send(e[u].id, "Q", w.sid)), !w.active && w.owner == e[u] && e[u].changeItemCount(w.group.id, -1));
                    }
                    this.active = !1;
                    for (var u = 0; u < e.length; ++u) this.sentTo[e[u].id] && o.send(e[u].id, "Y", this.sid, r.fixTo(v, 1));
                }
            }
        }
    };
}
var On = {},
    Fc = {
        get exports() {
            return On;
        },
        set exports(e) {
            On = e;
        },
    },
    Rn = {},
    Vc = {
        get exports() {
            return Rn;
        },
        set exports(e) {
            Rn = e;
        },
    };
(function () {
    var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
        t = {
            rotl: function (i, s) {
                return (i << s) | (i >>> (32 - s));
            },
            rotr: function (i, s) {
                return (i << (32 - s)) | (i >>> s);
            },
            endian: function (i) {
                if (i.constructor == Number) return (t.rotl(i, 8) & 16711935) | (t.rotl(i, 24) & 4278255360);
                for (var s = 0; s < i.length; s++) i[s] = t.endian(i[s]);
                return i;
            },
            randomBytes: function (i) {
                for (var s = []; i > 0; i--) s.push(Math.floor(Math.random() * 256));
                return s;
            },
            bytesToWords: function (i) {
                for (var s = [], n = 0, r = 0; n < i.length; n++, r += 8) s[r >>> 5] |= i[n] << (24 - (r % 32));
                return s;
            },
            wordsToBytes: function (i) {
                for (var s = [], n = 0; n < i.length * 32; n += 8) s.push((i[n >>> 5] >>> (24 - (n % 32))) & 255);
                return s;
            },
            bytesToHex: function (i) {
                for (var s = [], n = 0; n < i.length; n++) s.push((i[n] >>> 4).toString(16)), s.push((i[n] & 15).toString(16));
                return s.join("");
            },
            hexToBytes: function (i) {
                for (var s = [], n = 0; n < i.length; n += 2) s.push(parseInt(i.substr(n, 2), 16));
                return s;
            },
            bytesToBase64: function (i) {
                for (var s = [], n = 0; n < i.length; n += 3) for (var r = (i[n] << 16) | (i[n + 1] << 8) | i[n + 2], o = 0; o < 4; o++) n * 8 + o * 6 <= i.length * 8 ? s.push(e.charAt((r >>> (6 * (3 - o))) & 63)) : s.push("=");
                return s.join("");
            },
            base64ToBytes: function (i) {
                i = i.replace(/[^A-Z0-9+\/]/gi, "");
                for (var s = [], n = 0, r = 0; n < i.length; r = ++n % 4) r != 0 && s.push(((e.indexOf(i.charAt(n - 1)) & (Math.pow(2, -2 * r + 8) - 1)) << (r * 2)) | (e.indexOf(i.charAt(n)) >>> (6 - r * 2)));
                return s;
            },
        };
    Vc.exports = t;
})();
var _n = {
        utf8: {
            stringToBytes: function (e) {
                return _n.bin.stringToBytes(unescape(encodeURIComponent(e)));
            },
            bytesToString: function (e) {
                return decodeURIComponent(escape(_n.bin.bytesToString(e)));
            },
        },
        bin: {
            stringToBytes: function (e) {
                for (var t = [], i = 0; i < e.length; i++) t.push(e.charCodeAt(i) & 255);
                return t;
            },
            bytesToString: function (e) {
                for (var t = [], i = 0; i < e.length; i++) t.push(String.fromCharCode(e[i]));
                return t.join("");
            },
        },
    },
    zs = _n;
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */ var Uc = function (e) {
    return e != null && (Kr(e) || Lc(e) || !!e._isBuffer);
};
function Kr(e) {
    return !!e.constructor && typeof e.constructor.isBuffer == "function" && e.constructor.isBuffer(e);
}
function Lc(e) {
    return typeof e.readFloatLE == "function" && typeof e.slice == "function" && Kr(e.slice(0, 0));
}
(function () {
    var e = Rn,
        t = zs.utf8,
        i = Uc,
        s = zs.bin,
        n = function (r, o) {
            r.constructor == String
                ? o && o.encoding === "binary"
                    ? (r = s.stringToBytes(r))
                    : (r = t.stringToBytes(r))
                : i(r)
                ? (r = Array.prototype.slice.call(r, 0))
                : !Array.isArray(r) && r.constructor !== Uint8Array && (r = r.toString());
            for (var l = e.bytesToWords(r), c = r.length * 8, a = 1732584193, u = -271733879, p = -1732584194, h = 271733878, m = 0; m < l.length; m++)
                l[m] = (((l[m] << 8) | (l[m] >>> 24)) & 16711935) | (((l[m] << 24) | (l[m] >>> 8)) & 4278255360);
            (l[c >>> 5] |= 128 << c % 32), (l[(((c + 64) >>> 9) << 4) + 14] = c);
            for (var w = n._ff, v = n._gg, x = n._hh, D = n._ii, m = 0; m < l.length; m += 16) {
                var k = a,
                    S = u,
                    O = p,
                    U = h;
                (a = w(a, u, p, h, l[m + 0], 7, -680876936)),
                    (h = w(h, a, u, p, l[m + 1], 12, -389564586)),
                    (p = w(p, h, a, u, l[m + 2], 17, 606105819)),
                    (u = w(u, p, h, a, l[m + 3], 22, -1044525330)),
                    (a = w(a, u, p, h, l[m + 4], 7, -176418897)),
                    (h = w(h, a, u, p, l[m + 5], 12, 1200080426)),
                    (p = w(p, h, a, u, l[m + 6], 17, -1473231341)),
                    (u = w(u, p, h, a, l[m + 7], 22, -45705983)),
                    (a = w(a, u, p, h, l[m + 8], 7, 1770035416)),
                    (h = w(h, a, u, p, l[m + 9], 12, -1958414417)),
                    (p = w(p, h, a, u, l[m + 10], 17, -42063)),
                    (u = w(u, p, h, a, l[m + 11], 22, -1990404162)),
                    (a = w(a, u, p, h, l[m + 12], 7, 1804603682)),
                    (h = w(h, a, u, p, l[m + 13], 12, -40341101)),
                    (p = w(p, h, a, u, l[m + 14], 17, -1502002290)),
                    (u = w(u, p, h, a, l[m + 15], 22, 1236535329)),
                    (a = v(a, u, p, h, l[m + 1], 5, -165796510)),
                    (h = v(h, a, u, p, l[m + 6], 9, -1069501632)),
                    (p = v(p, h, a, u, l[m + 11], 14, 643717713)),
                    (u = v(u, p, h, a, l[m + 0], 20, -373897302)),
                    (a = v(a, u, p, h, l[m + 5], 5, -701558691)),
                    (h = v(h, a, u, p, l[m + 10], 9, 38016083)),
                    (p = v(p, h, a, u, l[m + 15], 14, -660478335)),
                    (u = v(u, p, h, a, l[m + 4], 20, -405537848)),
                    (a = v(a, u, p, h, l[m + 9], 5, 568446438)),
                    (h = v(h, a, u, p, l[m + 14], 9, -1019803690)),
                    (p = v(p, h, a, u, l[m + 3], 14, -187363961)),
                    (u = v(u, p, h, a, l[m + 8], 20, 1163531501)),
                    (a = v(a, u, p, h, l[m + 13], 5, -1444681467)),
                    (h = v(h, a, u, p, l[m + 2], 9, -51403784)),
                    (p = v(p, h, a, u, l[m + 7], 14, 1735328473)),
                    (u = v(u, p, h, a, l[m + 12], 20, -1926607734)),
                    (a = x(a, u, p, h, l[m + 5], 4, -378558)),
                    (h = x(h, a, u, p, l[m + 8], 11, -2022574463)),
                    (p = x(p, h, a, u, l[m + 11], 16, 1839030562)),
                    (u = x(u, p, h, a, l[m + 14], 23, -35309556)),
                    (a = x(a, u, p, h, l[m + 1], 4, -1530992060)),
                    (h = x(h, a, u, p, l[m + 4], 11, 1272893353)),
                    (p = x(p, h, a, u, l[m + 7], 16, -155497632)),
                    (u = x(u, p, h, a, l[m + 10], 23, -1094730640)),
                    (a = x(a, u, p, h, l[m + 13], 4, 681279174)),
                    (h = x(h, a, u, p, l[m + 0], 11, -358537222)),
                    (p = x(p, h, a, u, l[m + 3], 16, -722521979)),
                    (u = x(u, p, h, a, l[m + 6], 23, 76029189)),
                    (a = x(a, u, p, h, l[m + 9], 4, -640364487)),
                    (h = x(h, a, u, p, l[m + 12], 11, -421815835)),
                    (p = x(p, h, a, u, l[m + 15], 16, 530742520)),
                    (u = x(u, p, h, a, l[m + 2], 23, -995338651)),
                    (a = D(a, u, p, h, l[m + 0], 6, -198630844)),
                    (h = D(h, a, u, p, l[m + 7], 10, 1126891415)),
                    (p = D(p, h, a, u, l[m + 14], 15, -1416354905)),
                    (u = D(u, p, h, a, l[m + 5], 21, -57434055)),
                    (a = D(a, u, p, h, l[m + 12], 6, 1700485571)),
                    (h = D(h, a, u, p, l[m + 3], 10, -1894986606)),
                    (p = D(p, h, a, u, l[m + 10], 15, -1051523)),
                    (u = D(u, p, h, a, l[m + 1], 21, -2054922799)),
                    (a = D(a, u, p, h, l[m + 8], 6, 1873313359)),
                    (h = D(h, a, u, p, l[m + 15], 10, -30611744)),
                    (p = D(p, h, a, u, l[m + 6], 15, -1560198380)),
                    (u = D(u, p, h, a, l[m + 13], 21, 1309151649)),
                    (a = D(a, u, p, h, l[m + 4], 6, -145523070)),
                    (h = D(h, a, u, p, l[m + 11], 10, -1120210379)),
                    (p = D(p, h, a, u, l[m + 2], 15, 718787259)),
                    (u = D(u, p, h, a, l[m + 9], 21, -343485551)),
                    (a = (a + k) >>> 0),
                    (u = (u + S) >>> 0),
                    (p = (p + O) >>> 0),
                    (h = (h + U) >>> 0);
            }
            return e.endian([a, u, p, h]);
        };
    (n._ff = function (r, o, l, c, a, u, p) {
        var h = r + ((o & l) | (~o & c)) + (a >>> 0) + p;
        return ((h << u) | (h >>> (32 - u))) + o;
    }),
        (n._gg = function (r, o, l, c, a, u, p) {
            var h = r + ((o & c) | (l & ~c)) + (a >>> 0) + p;
            return ((h << u) | (h >>> (32 - u))) + o;
        }),
        (n._hh = function (r, o, l, c, a, u, p) {
            var h = r + (o ^ l ^ c) + (a >>> 0) + p;
            return ((h << u) | (h >>> (32 - u))) + o;
        }),
        (n._ii = function (r, o, l, c, a, u, p) {
            var h = r + (l ^ (o | ~c)) + (a >>> 0) + p;
            return ((h << u) | (h >>> (32 - u))) + o;
        }),
        (n._blocksize = 16),
        (n._digestsize = 16),
        (Fc.exports = function (r, o) {
            if (r == null) throw new Error("Illegal argument " + r);
            var l = e.wordsToBytes(n(r, o));
            return o && o.asBytes ? l : o && o.asString ? s.bytesToString(l) : e.bytesToHex(l);
        });
})();
var ji, Hs;
function Ge() {
    if (Hs) return ji;
    Hs = 1;
    function e(t, i, s, n, r, o) {
        return { tag: t, key: i, attrs: s, children: n, text: r, dom: o, domSize: void 0, state: void 0, events: void 0, instance: void 0 };
    }
    return (
        (e.normalize = function (t) {
            return Array.isArray(t) ? e("[", void 0, void 0, e.normalizeChildren(t), void 0, void 0) : t == null || typeof t == "boolean" ? null : typeof t == "object" ? t : e("#", void 0, void 0, String(t), void 0, void 0);
        }),
        (e.normalizeChildren = function (t) {
            var i = [];
            if (t.length) {
                for (var s = t[0] != null && t[0].key != null, n = 1; n < t.length; n++)
                    if ((t[n] != null && t[n].key != null) !== s)
                        throw new TypeError(
                            s && (t[n] != null || typeof t[n] == "boolean")
                                ? "In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole."
                                : "In fragments, vnodes must either all have keys or none have keys."
                        );
                for (var n = 0; n < t.length; n++) i[n] = e.normalize(t[n]);
            }
            return i;
        }),
        (ji = e),
        ji
    );
}
var Nc = Ge(),
    Jr = function () {
        var e = arguments[this],
            t = this + 1,
            i;
        if ((e == null ? (e = {}) : (typeof e != "object" || e.tag != null || Array.isArray(e)) && ((e = {}), (t = this)), arguments.length === t + 1)) (i = arguments[t]), Array.isArray(i) || (i = [i]);
        else for (i = []; t < arguments.length; ) i.push(arguments[t++]);
        return Nc("", e.key, e, i);
    },
    Ci = {}.hasOwnProperty,
    qc = Ge(),
    Wc = Jr,
    pt = Ci,
    Xc = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g,
    Qr = {};
function Fs(e) {
    for (var t in e) if (pt.call(e, t)) return !1;
    return !0;
}
function Gc(e) {
    for (var t, i = "div", s = [], n = {}; (t = Xc.exec(e)); ) {
        var r = t[1],
            o = t[2];
        if (r === "" && o !== "") i = o;
        else if (r === "#") n.id = o;
        else if (r === ".") s.push(o);
        else if (t[3][0] === "[") {
            var l = t[6];
            l && (l = l.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\")), t[4] === "class" ? s.push(l) : (n[t[4]] = l === "" ? l : l || !0);
        }
    }
    return s.length > 0 && (n.className = s.join(" ")), (Qr[e] = { tag: i, attrs: n });
}
function Yc(e, t) {
    var i = t.attrs,
        s = pt.call(i, "class"),
        n = s ? i.class : i.className;
    if (((t.tag = e.tag), (t.attrs = {}), !Fs(e.attrs) && !Fs(i))) {
        var r = {};
        for (var o in i) pt.call(i, o) && (r[o] = i[o]);
        i = r;
    }
    for (var o in e.attrs) pt.call(e.attrs, o) && o !== "className" && !pt.call(i, o) && (i[o] = e.attrs[o]);
    (n != null || e.attrs.className != null) && (i.className = n != null ? (e.attrs.className != null ? String(e.attrs.className) + " " + String(n) : n) : e.attrs.className != null ? e.attrs.className : null), s && (i.class = null);
    for (var o in i)
        if (pt.call(i, o) && o !== "key") {
            t.attrs = i;
            break;
        }
    return t;
}
function $c(e) {
    if (e == null || (typeof e != "string" && typeof e != "function" && typeof e.view != "function")) throw Error("The selector must be either a string or a component.");
    var t = Wc.apply(1, arguments);
    return typeof e == "string" && ((t.children = qc.normalizeChildren(t.children)), e !== "[") ? Yc(Qr[e] || Gc(e), t) : ((t.tag = e), t);
}
var Zr = $c,
    Kc = Ge(),
    Jc = function (e) {
        return e == null && (e = ""), Kc("<", void 0, void 0, e, void 0, void 0);
    },
    Qc = Ge(),
    Zc = Jr,
    jc = function () {
        var e = Zc.apply(0, arguments);
        return (e.tag = "["), (e.children = Qc.normalizeChildren(e.children)), e;
    },
    ns = Zr;
ns.trust = Jc;
ns.fragment = jc;
var eh = ns,
    yi = {},
    en = {
        get exports() {
            return yi;
        },
        set exports(e) {
            yi = e;
        },
    },
    tn,
    Vs;
function jr() {
    if (Vs) return tn;
    Vs = 1;
    var e = function (t) {
        if (!(this instanceof e)) throw new Error("Promise must be called with 'new'.");
        if (typeof t != "function") throw new TypeError("executor must be a function.");
        var i = this,
            s = [],
            n = [],
            r = a(s, !0),
            o = a(n, !1),
            l = (i._instance = { resolvers: s, rejectors: n }),
            c = typeof setImmediate == "function" ? setImmediate : setTimeout;
        function a(p, h) {
            return function m(w) {
                var v;
                try {
                    if (h && w != null && (typeof w == "object" || typeof w == "function") && typeof (v = w.then) == "function") {
                        if (w === i) throw new TypeError("Promise can't be resolved with itself.");
                        u(v.bind(w));
                    } else
                        c(function () {
                            !h && p.length === 0 && console.error("Possible unhandled promise rejection:", w);
                            for (var x = 0; x < p.length; x++) p[x](w);
                            (s.length = 0),
                                (n.length = 0),
                                (l.state = h),
                                (l.retry = function () {
                                    m(w);
                                });
                        });
                } catch (x) {
                    o(x);
                }
            };
        }
        function u(p) {
            var h = 0;
            function m(v) {
                return function (x) {
                    h++ > 0 || v(x);
                };
            }
            var w = m(o);
            try {
                p(m(r), w);
            } catch (v) {
                w(v);
            }
        }
        u(t);
    };
    return (
        (e.prototype.then = function (t, i) {
            var s = this,
                n = s._instance;
            function r(a, u, p, h) {
                u.push(function (m) {
                    if (typeof a != "function") p(m);
                    else
                        try {
                            o(a(m));
                        } catch (w) {
                            l && l(w);
                        }
                }),
                    typeof n.retry == "function" && h === n.state && n.retry();
            }
            var o,
                l,
                c = new e(function (a, u) {
                    (o = a), (l = u);
                });
            return r(t, n.resolvers, o, !0), r(i, n.rejectors, l, !1), c;
        }),
        (e.prototype.catch = function (t) {
            return this.then(null, t);
        }),
        (e.prototype.finally = function (t) {
            return this.then(
                function (i) {
                    return e.resolve(t()).then(function () {
                        return i;
                    });
                },
                function (i) {
                    return e.resolve(t()).then(function () {
                        return e.reject(i);
                    });
                }
            );
        }),
        (e.resolve = function (t) {
            return t instanceof e
                ? t
                : new e(function (i) {
                      i(t);
                  });
        }),
        (e.reject = function (t) {
            return new e(function (i, s) {
                s(t);
            });
        }),
        (e.all = function (t) {
            return new e(function (i, s) {
                var n = t.length,
                    r = 0,
                    o = [];
                if (t.length === 0) i([]);
                else
                    for (var l = 0; l < t.length; l++)
                        (function (c) {
                            function a(u) {
                                r++, (o[c] = u), r === n && i(o);
                            }
                            t[c] != null && (typeof t[c] == "object" || typeof t[c] == "function") && typeof t[c].then == "function" ? t[c].then(a, s) : a(t[c]);
                        })(l);
            });
        }),
        (e.race = function (t) {
            return new e(function (i, s) {
                for (var n = 0; n < t.length; n++) t[n].then(i, s);
            });
        }),
        (tn = e),
        tn
    );
}
var _t = jr();
typeof window < "u"
    ? (typeof window.Promise > "u" ? (window.Promise = _t) : window.Promise.prototype.finally || (window.Promise.prototype.finally = _t.prototype.finally), (en.exports = window.Promise))
    : typeof rt < "u"
    ? (typeof rt.Promise > "u" ? (rt.Promise = _t) : rt.Promise.prototype.finally || (rt.Promise.prototype.finally = _t.prototype.finally), (en.exports = rt.Promise))
    : (en.exports = _t);
var nn, Us;
function th() {
    if (Us) return nn;
    Us = 1;
    var e = Ge();
    return (
        (nn = function (t) {
            var i = t && t.document,
                s,
                n = { svg: "http://www.w3.org/2000/svg", math: "http://www.w3.org/1998/Math/MathML" };
            function r(d) {
                return (d.attrs && d.attrs.xmlns) || n[d.tag];
            }
            function o(d, f) {
                if (d.state !== f) throw new Error("'vnode.state' must not be modified.");
            }
            function l(d) {
                var f = d.state;
                try {
                    return this.apply(f, arguments);
                } finally {
                    o(d, f);
                }
            }
            function c() {
                try {
                    return i.activeElement;
                } catch {
                    return null;
                }
            }
            function a(d, f, g, b, I, A, H) {
                for (var N = g; N < b; N++) {
                    var B = f[N];
                    B != null && u(d, B, I, H, A);
                }
            }
            function u(d, f, g, b, I) {
                var A = f.tag;
                if (typeof A == "string")
                    switch (((f.state = {}), f.attrs != null && Fi(f.attrs, f, g), A)) {
                        case "#":
                            p(d, f, I);
                            break;
                        case "<":
                            m(d, f, b, I);
                            break;
                        case "[":
                            w(d, f, g, b, I);
                            break;
                        default:
                            v(d, f, g, b, I);
                    }
                else D(d, f, g, b, I);
            }
            function p(d, f, g) {
                (f.dom = i.createTextNode(f.children)), X(d, f.dom, g);
            }
            var h = { caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup" };
            function m(d, f, g, b) {
                var I = f.children.match(/^\s*?<(\w+)/im) || [],
                    A = i.createElement(h[I[1]] || "div");
                g === "http://www.w3.org/2000/svg" ? ((A.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg">' + f.children + "</svg>"), (A = A.firstChild)) : (A.innerHTML = f.children),
                    (f.dom = A.firstChild),
                    (f.domSize = A.childNodes.length),
                    (f.instance = []);
                for (var H = i.createDocumentFragment(), N; (N = A.firstChild); ) f.instance.push(N), H.appendChild(N);
                X(d, H, b);
            }
            function w(d, f, g, b, I) {
                var A = i.createDocumentFragment();
                if (f.children != null) {
                    var H = f.children;
                    a(A, H, 0, H.length, g, null, b);
                }
                (f.dom = A.firstChild), (f.domSize = A.childNodes.length), X(d, A, I);
            }
            function v(d, f, g, b, I) {
                var A = f.tag,
                    H = f.attrs,
                    N = H && H.is;
                b = r(f) || b;
                var B = b ? (N ? i.createElementNS(b, A, { is: N }) : i.createElementNS(b, A)) : N ? i.createElement(A, { is: N }) : i.createElement(A);
                if (((f.dom = B), H != null && Bi(f, H, b), X(d, B, I), !G(f) && f.children != null)) {
                    var Y = f.children;
                    a(B, Y, 0, Y.length, g, null, b), f.tag === "select" && H != null && No(f, H);
                }
            }
            function x(d, f) {
                var g;
                if (typeof d.tag.view == "function") {
                    if (((d.state = Object.create(d.tag)), (g = d.state.view), g.$$reentrantLock$$ != null)) return;
                    g.$$reentrantLock$$ = !0;
                } else {
                    if (((d.state = void 0), (g = d.tag), g.$$reentrantLock$$ != null)) return;
                    (g.$$reentrantLock$$ = !0), (d.state = d.tag.prototype != null && typeof d.tag.prototype.view == "function" ? new d.tag(d) : d.tag(d));
                }
                if ((Fi(d.state, d, f), d.attrs != null && Fi(d.attrs, d, f), (d.instance = e.normalize(l.call(d.state.view, d))), d.instance === d)) throw Error("A view cannot return the vnode it received as argument");
                g.$$reentrantLock$$ = null;
            }
            function D(d, f, g, b, I) {
                x(f, g), f.instance != null ? (u(d, f.instance, g, b, I), (f.dom = f.instance.dom), (f.domSize = f.dom != null ? f.instance.domSize : 0)) : (f.domSize = 0);
            }
            function k(d, f, g, b, I, A) {
                if (!(f === g || (f == null && g == null)))
                    if (f == null || f.length === 0) a(d, g, 0, g.length, b, I, A);
                    else if (g == null || g.length === 0) te(d, f, 0, f.length);
                    else {
                        var H = f[0] != null && f[0].key != null,
                            N = g[0] != null && g[0].key != null,
                            B = 0,
                            Y = 0;
                        if (!H) for (; Y < f.length && f[Y] == null; ) Y++;
                        if (!N) for (; B < g.length && g[B] == null; ) B++;
                        if (H !== N) te(d, f, Y, f.length), a(d, g, B, g.length, b, I, A);
                        else if (N) {
                            for (var ve = f.length - 1, fe = g.length - 1, ni, xe, oe, ge, Z, Li; ve >= Y && fe >= B && ((ge = f[ve]), (Z = g[fe]), ge.key === Z.key); )
                                ge !== Z && S(d, ge, Z, b, I, A), Z.dom != null && (I = Z.dom), ve--, fe--;
                            for (; ve >= Y && fe >= B && ((xe = f[Y]), (oe = g[B]), xe.key === oe.key); ) Y++, B++, xe !== oe && S(d, xe, oe, b, $(f, Y, I), A);
                            for (; ve >= Y && fe >= B && !(B === fe || xe.key !== Z.key || ge.key !== oe.key); )
                                (Li = $(f, Y, I)),
                                    V(d, ge, Li),
                                    ge !== oe && S(d, ge, oe, b, Li, A),
                                    ++B <= --fe && V(d, xe, I),
                                    xe !== Z && S(d, xe, Z, b, I, A),
                                    Z.dom != null && (I = Z.dom),
                                    Y++,
                                    ve--,
                                    (ge = f[ve]),
                                    (Z = g[fe]),
                                    (xe = f[Y]),
                                    (oe = g[B]);
                            for (; ve >= Y && fe >= B && ge.key === Z.key; ) ge !== Z && S(d, ge, Z, b, I, A), Z.dom != null && (I = Z.dom), ve--, fe--, (ge = f[ve]), (Z = g[fe]);
                            if (B > fe) te(d, f, Y, ve + 1);
                            else if (Y > ve) a(d, g, B, fe + 1, b, I, A);
                            else {
                                var $o = I,
                                    Ps = fe - B + 1,
                                    At = new Array(Ps),
                                    Ni = 0,
                                    ne = 0,
                                    qi = 2147483647,
                                    Wi = 0,
                                    ni,
                                    Xi;
                                for (ne = 0; ne < Ps; ne++) At[ne] = -1;
                                for (ne = fe; ne >= B; ne--) {
                                    ni == null && (ni = W(f, Y, ve + 1)), (Z = g[ne]);
                                    var st = ni[Z.key];
                                    st != null && ((qi = st < qi ? st : -1), (At[ne - B] = st), (ge = f[st]), (f[st] = null), ge !== Z && S(d, ge, Z, b, I, A), Z.dom != null && (I = Z.dom), Wi++);
                                }
                                if (((I = $o), Wi !== ve - Y + 1 && te(d, f, Y, ve + 1), Wi === 0)) a(d, g, B, fe + 1, b, I, A);
                                else if (qi === -1)
                                    for (Xi = _(At), Ni = Xi.length - 1, ne = fe; ne >= B; ne--) (oe = g[ne]), At[ne - B] === -1 ? u(d, oe, b, A, I) : Xi[Ni] === ne - B ? Ni-- : V(d, oe, I), oe.dom != null && (I = g[ne].dom);
                                else for (ne = fe; ne >= B; ne--) (oe = g[ne]), At[ne - B] === -1 && u(d, oe, b, A, I), oe.dom != null && (I = g[ne].dom);
                            }
                        } else {
                            var Ui = f.length < g.length ? f.length : g.length;
                            for (B = B < Y ? B : Y; B < Ui; B++)
                                (xe = f[B]), (oe = g[B]), !(xe === oe || (xe == null && oe == null)) && (xe == null ? u(d, oe, b, A, $(f, B + 1, I)) : oe == null ? ie(d, xe) : S(d, xe, oe, b, $(f, B + 1, I), A));
                            f.length > Ui && te(d, f, B, f.length), g.length > Ui && a(d, g, B, g.length, b, I, A);
                        }
                    }
            }
            function S(d, f, g, b, I, A) {
                var H = f.tag,
                    N = g.tag;
                if (H === N) {
                    if (((g.state = f.state), (g.events = f.events), Yo(g, f))) return;
                    if (typeof H == "string")
                        switch ((g.attrs != null && Vi(g.attrs, g, b), H)) {
                            case "#":
                                O(f, g);
                                break;
                            case "<":
                                U(d, f, g, A, I);
                                break;
                            case "[":
                                L(d, f, g, b, I, A);
                                break;
                            default:
                                q(f, g, b, A);
                        }
                    else P(d, f, g, b, I, A);
                } else ie(d, f), u(d, g, b, A, I);
            }
            function O(d, f) {
                d.children.toString() !== f.children.toString() && (d.dom.nodeValue = f.children), (f.dom = d.dom);
            }
            function U(d, f, g, b, I) {
                f.children !== g.children ? (K(d, f), m(d, g, b, I)) : ((g.dom = f.dom), (g.domSize = f.domSize), (g.instance = f.instance));
            }
            function L(d, f, g, b, I, A) {
                k(d, f.children, g.children, b, I, A);
                var H = 0,
                    N = g.children;
                if (((g.dom = null), N != null)) {
                    for (var B = 0; B < N.length; B++) {
                        var Y = N[B];
                        Y != null && Y.dom != null && (g.dom == null && (g.dom = Y.dom), (H += Y.domSize || 1));
                    }
                    H !== 1 && (g.domSize = H);
                }
            }
            function q(d, f, g, b) {
                var I = (f.dom = d.dom);
                (b = r(f) || b), f.tag === "textarea" && f.attrs == null && (f.attrs = {}), qo(f, d.attrs, f.attrs, b), G(f) || k(I, d.children, f.children, g, null, b);
            }
            function P(d, f, g, b, I, A) {
                if (((g.instance = e.normalize(l.call(g.state.view, g))), g.instance === g)) throw Error("A view cannot return the vnode it received as argument");
                Vi(g.state, g, b),
                    g.attrs != null && Vi(g.attrs, g, b),
                    g.instance != null
                        ? (f.instance == null ? u(d, g.instance, b, A, I) : S(d, f.instance, g.instance, b, I, A), (g.dom = g.instance.dom), (g.domSize = g.instance.domSize))
                        : f.instance != null
                        ? (ie(d, f.instance), (g.dom = void 0), (g.domSize = 0))
                        : ((g.dom = f.dom), (g.domSize = f.domSize));
            }
            function W(d, f, g) {
                for (var b = Object.create(null); f < g; f++) {
                    var I = d[f];
                    if (I != null) {
                        var A = I.key;
                        A != null && (b[A] = f);
                    }
                }
                return b;
            }
            var F = [];
            function _(d) {
                for (var f = [0], g = 0, b = 0, I = 0, A = (F.length = d.length), I = 0; I < A; I++) F[I] = d[I];
                for (var I = 0; I < A; ++I)
                    if (d[I] !== -1) {
                        var H = f[f.length - 1];
                        if (d[H] < d[I]) {
                            (F[I] = H), f.push(I);
                            continue;
                        }
                        for (g = 0, b = f.length - 1; g < b; ) {
                            var N = (g >>> 1) + (b >>> 1) + (g & b & 1);
                            d[f[N]] < d[I] ? (g = N + 1) : (b = N);
                        }
                        d[I] < d[f[g]] && (g > 0 && (F[I] = f[g - 1]), (f[g] = I));
                    }
                for (g = f.length, b = f[g - 1]; g-- > 0; ) (f[g] = b), (b = F[b]);
                return (F.length = 0), f;
            }
            function $(d, f, g) {
                for (; f < d.length; f++) if (d[f] != null && d[f].dom != null) return d[f].dom;
                return g;
            }
            function V(d, f, g) {
                var b = i.createDocumentFragment();
                z(d, b, f), X(d, b, g);
            }
            function z(d, f, g) {
                for (; g.dom != null && g.dom.parentNode === d; ) {
                    if (typeof g.tag != "string") {
                        if (((g = g.instance), g != null)) continue;
                    } else if (g.tag === "<") for (var b = 0; b < g.instance.length; b++) f.appendChild(g.instance[b]);
                    else if (g.tag !== "[") f.appendChild(g.dom);
                    else if (g.children.length === 1) {
                        if (((g = g.children[0]), g != null)) continue;
                    } else
                        for (var b = 0; b < g.children.length; b++) {
                            var I = g.children[b];
                            I != null && z(d, f, I);
                        }
                    break;
                }
            }
            function X(d, f, g) {
                g != null ? d.insertBefore(f, g) : d.appendChild(f);
            }
            function G(d) {
                if (d.attrs == null || (d.attrs.contenteditable == null && d.attrs.contentEditable == null)) return !1;
                var f = d.children;
                if (f != null && f.length === 1 && f[0].tag === "<") {
                    var g = f[0].children;
                    d.dom.innerHTML !== g && (d.dom.innerHTML = g);
                } else if (f != null && f.length !== 0) throw new Error("Child node of a contenteditable must be trusted.");
                return !0;
            }
            function te(d, f, g, b) {
                for (var I = g; I < b; I++) {
                    var A = f[I];
                    A != null && ie(d, A);
                }
            }
            function ie(d, f) {
                var g = 0,
                    b = f.state,
                    I,
                    A;
                if (typeof f.tag != "string" && typeof f.state.onbeforeremove == "function") {
                    var H = l.call(f.state.onbeforeremove, f);
                    H != null && typeof H.then == "function" && ((g = 1), (I = H));
                }
                if (f.attrs && typeof f.attrs.onbeforeremove == "function") {
                    var H = l.call(f.attrs.onbeforeremove, f);
                    H != null && typeof H.then == "function" && ((g |= 2), (A = H));
                }
                if ((o(f, b), !g)) nt(f), ke(d, f);
                else {
                    if (I != null) {
                        var N = function () {
                            g & 1 && ((g &= 2), g || B());
                        };
                        I.then(N, N);
                    }
                    if (A != null) {
                        var N = function () {
                            g & 2 && ((g &= 1), g || B());
                        };
                        A.then(N, N);
                    }
                }
                function B() {
                    o(f, b), nt(f), ke(d, f);
                }
            }
            function K(d, f) {
                for (var g = 0; g < f.instance.length; g++) d.removeChild(f.instance[g]);
            }
            function ke(d, f) {
                for (; f.dom != null && f.dom.parentNode === d; ) {
                    if (typeof f.tag != "string") {
                        if (((f = f.instance), f != null)) continue;
                    } else if (f.tag === "<") K(d, f);
                    else {
                        if (f.tag !== "[" && (d.removeChild(f.dom), !Array.isArray(f.children))) break;
                        if (f.children.length === 1) {
                            if (((f = f.children[0]), f != null)) continue;
                        } else
                            for (var g = 0; g < f.children.length; g++) {
                                var b = f.children[g];
                                b != null && ke(d, b);
                            }
                    }
                    break;
                }
            }
            function nt(d) {
                if ((typeof d.tag != "string" && typeof d.state.onremove == "function" && l.call(d.state.onremove, d), d.attrs && typeof d.attrs.onremove == "function" && l.call(d.attrs.onremove, d), typeof d.tag != "string"))
                    d.instance != null && nt(d.instance);
                else {
                    var f = d.children;
                    if (Array.isArray(f))
                        for (var g = 0; g < f.length; g++) {
                            var b = f[g];
                            b != null && nt(b);
                        }
                }
            }
            function Bi(d, f, g) {
                d.tag === "input" && f.type != null && d.dom.setAttribute("type", f.type);
                var b = f != null && d.tag === "input" && f.type === "file";
                for (var I in f) Ue(d, I, null, f[I], g, b);
            }
            function Ue(d, f, g, b, I, A) {
                if (!(f === "key" || f === "is" || b == null || Ts(f) || (g === b && !Wo(d, f) && typeof b != "object") || (f === "type" && d.tag === "input"))) {
                    if (f[0] === "o" && f[1] === "n") return Es(d, f, b);
                    if (f.slice(0, 6) === "xlink:") d.dom.setAttributeNS("http://www.w3.org/1999/xlink", f.slice(6), b);
                    else if (f === "style") Ms(d.dom, g, b);
                    else if (Is(d, f, I)) {
                        if (f === "value") {
                            if (
                                ((d.tag === "input" || d.tag === "textarea") && d.dom.value === "" + b && (A || d.dom === c())) ||
                                (d.tag === "select" && g !== null && d.dom.value === "" + b) ||
                                (d.tag === "option" && g !== null && d.dom.value === "" + b)
                            )
                                return;
                            if (A && "" + b != "") {
                                console.error("`value` is read-only on file inputs!");
                                return;
                            }
                        }
                        d.dom[f] = b;
                    } else typeof b == "boolean" ? (b ? d.dom.setAttribute(f, "") : d.dom.removeAttribute(f)) : d.dom.setAttribute(f === "className" ? "class" : f, b);
                }
            }
            function Ye(d, f, g, b) {
                if (!(f === "key" || f === "is" || g == null || Ts(f)))
                    if (f[0] === "o" && f[1] === "n") Es(d, f, void 0);
                    else if (f === "style") Ms(d.dom, g, null);
                    else if (Is(d, f, b) && f !== "className" && f !== "title" && !(f === "value" && (d.tag === "option" || (d.tag === "select" && d.dom.selectedIndex === -1 && d.dom === c()))) && !(d.tag === "input" && f === "type"))
                        d.dom[f] = null;
                    else {
                        var I = f.indexOf(":");
                        I !== -1 && (f = f.slice(I + 1)), g !== !1 && d.dom.removeAttribute(f === "className" ? "class" : f);
                    }
            }
            function No(d, f) {
                if ("value" in f)
                    if (f.value === null) d.dom.selectedIndex !== -1 && (d.dom.value = null);
                    else {
                        var g = "" + f.value;
                        (d.dom.value !== g || d.dom.selectedIndex === -1) && (d.dom.value = g);
                    }
                "selectedIndex" in f && Ue(d, "selectedIndex", null, f.selectedIndex, void 0);
            }
            function qo(d, f, g, b) {
                if ((f && f === g && console.warn("Don't reuse attrs object, use new object for every redraw, this will throw in next major"), g != null)) {
                    d.tag === "input" && g.type != null && d.dom.setAttribute("type", g.type);
                    var I = d.tag === "input" && g.type === "file";
                    for (var A in g) Ue(d, A, f && f[A], g[A], b, I);
                }
                var H;
                if (f != null) for (var A in f) (H = f[A]) != null && (g == null || g[A] == null) && Ye(d, A, H, b);
            }
            function Wo(d, f) {
                return f === "value" || f === "checked" || f === "selectedIndex" || (f === "selected" && d.dom === c()) || (d.tag === "option" && d.dom.parentNode === i.activeElement);
            }
            function Ts(d) {
                return d === "oninit" || d === "oncreate" || d === "onupdate" || d === "onremove" || d === "onbeforeremove" || d === "onbeforeupdate";
            }
            function Is(d, f, g) {
                return g === void 0 && (d.tag.indexOf("-") > -1 || (d.attrs != null && d.attrs.is) || (f !== "href" && f !== "list" && f !== "form" && f !== "width" && f !== "height")) && f in d.dom;
            }
            var Xo = /[A-Z]/g;
            function Go(d) {
                return "-" + d.toLowerCase();
            }
            function zi(d) {
                return d[0] === "-" && d[1] === "-" ? d : d === "cssFloat" ? "float" : d.replace(Xo, Go);
            }
            function Ms(d, f, g) {
                if (f !== g)
                    if (g == null) d.style.cssText = "";
                    else if (typeof g != "object") d.style.cssText = g;
                    else if (f == null || typeof f != "object") {
                        d.style.cssText = "";
                        for (var b in g) {
                            var I = g[b];
                            I != null && d.style.setProperty(zi(b), String(I));
                        }
                    } else {
                        for (var b in g) {
                            var I = g[b];
                            I != null && (I = String(I)) !== String(f[b]) && d.style.setProperty(zi(b), I);
                        }
                        for (var b in f) f[b] != null && g[b] == null && d.style.removeProperty(zi(b));
                    }
            }
            function Hi() {
                this._ = s;
            }
            (Hi.prototype = Object.create(null)),
                (Hi.prototype.handleEvent = function (d) {
                    var f = this["on" + d.type],
                        g;
                    typeof f == "function" ? (g = f.call(d.currentTarget, d)) : typeof f.handleEvent == "function" && f.handleEvent(d), this._ && d.redraw !== !1 && (0, this._)(), g === !1 && (d.preventDefault(), d.stopPropagation());
                });
            function Es(d, f, g) {
                if (d.events != null) {
                    if (((d.events._ = s), d.events[f] === g)) return;
                    g != null && (typeof g == "function" || typeof g == "object")
                        ? (d.events[f] == null && d.dom.addEventListener(f.slice(2), d.events, !1), (d.events[f] = g))
                        : (d.events[f] != null && d.dom.removeEventListener(f.slice(2), d.events, !1), (d.events[f] = void 0));
                } else g != null && (typeof g == "function" || typeof g == "object") && ((d.events = new Hi()), d.dom.addEventListener(f.slice(2), d.events, !1), (d.events[f] = g));
            }
            function Fi(d, f, g) {
                typeof d.oninit == "function" && l.call(d.oninit, f), typeof d.oncreate == "function" && g.push(l.bind(d.oncreate, f));
            }
            function Vi(d, f, g) {
                typeof d.onupdate == "function" && g.push(l.bind(d.onupdate, f));
            }
            function Yo(d, f) {
                do {
                    if (d.attrs != null && typeof d.attrs.onbeforeupdate == "function") {
                        var g = l.call(d.attrs.onbeforeupdate, d, f);
                        if (g !== void 0 && !g) break;
                    }
                    if (typeof d.tag != "string" && typeof d.state.onbeforeupdate == "function") {
                        var g = l.call(d.state.onbeforeupdate, d, f);
                        if (g !== void 0 && !g) break;
                    }
                    return !1;
                } while (!1);
                return (d.dom = f.dom), (d.domSize = f.domSize), (d.instance = f.instance), (d.attrs = f.attrs), (d.children = f.children), (d.text = f.text), !0;
            }
            var Ct;
            return function (d, f, g) {
                if (!d) throw new TypeError("DOM element being rendered to does not exist.");
                if (Ct != null && d.contains(Ct)) throw new TypeError("Node is currently being rendered to and thus is locked.");
                var b = s,
                    I = Ct,
                    A = [],
                    H = c(),
                    N = d.namespaceURI;
                (Ct = d), (s = typeof g == "function" ? g : void 0);
                try {
                    d.vnodes == null && (d.textContent = ""),
                        (f = e.normalizeChildren(Array.isArray(f) ? f : [f])),
                        k(d, d.vnodes, f, A, null, N === "http://www.w3.org/1999/xhtml" ? void 0 : N),
                        (d.vnodes = f),
                        H != null && c() !== H && typeof H.focus == "function" && H.focus();
                    for (var B = 0; B < A.length; B++) A[B]();
                } finally {
                    (s = b), (Ct = I);
                }
            };
        }),
        nn
    );
}
var sn, Ls;
function eo() {
    return Ls || ((Ls = 1), (sn = th()(typeof window < "u" ? window : null))), sn;
}
var Ns = Ge(),
    ih = function (e, t, i) {
        var s = [],
            n = !1,
            r = -1;
        function o() {
            for (r = 0; r < s.length; r += 2)
                try {
                    e(s[r], Ns(s[r + 1]), l);
                } catch (a) {
                    i.error(a);
                }
            r = -1;
        }
        function l() {
            n ||
                ((n = !0),
                t(function () {
                    (n = !1), o();
                }));
        }
        l.sync = o;
        function c(a, u) {
            if (u != null && u.view == null && typeof u != "function") throw new TypeError("m.mount expects a component, not a vnode.");
            var p = s.indexOf(a);
            p >= 0 && (s.splice(p, 2), p <= r && (r -= 2), e(a, [])), u != null && (s.push(a, u), e(a, Ns(u), l));
        }
        return { mount: c, redraw: l };
    },
    nh = eo(),
    ss = ih(nh, typeof requestAnimationFrame < "u" ? requestAnimationFrame : null, typeof console < "u" ? console : null),
    rn,
    qs;
function to() {
    return (
        qs ||
            ((qs = 1),
            (rn = function (e) {
                if (Object.prototype.toString.call(e) !== "[object Object]") return "";
                var t = [];
                for (var i in e) s(i, e[i]);
                return t.join("&");
                function s(n, r) {
                    if (Array.isArray(r)) for (var o = 0; o < r.length; o++) s(n + "[" + o + "]", r[o]);
                    else if (Object.prototype.toString.call(r) === "[object Object]") for (var o in r) s(n + "[" + o + "]", r[o]);
                    else t.push(encodeURIComponent(n) + (r != null && r !== "" ? "=" + encodeURIComponent(r) : ""));
                }
            })),
        rn
    );
}
var on, Ws;
function io() {
    if (Ws) return on;
    Ws = 1;
    var e = Ci;
    return (
        (on =
            Object.assign ||
            function (t, i) {
                for (var s in i) e.call(i, s) && (t[s] = i[s]);
            }),
        on
    );
}
var an, Xs;
function rs() {
    if (Xs) return an;
    Xs = 1;
    var e = to(),
        t = io();
    return (
        (an = function (i, s) {
            if (/:([^\/\.-]+)(\.{3})?:/.test(i)) throw new SyntaxError("Template parameter names must be separated by either a '/', '-', or '.'.");
            if (s == null) return i;
            var n = i.indexOf("?"),
                r = i.indexOf("#"),
                o = r < 0 ? i.length : r,
                l = n < 0 ? o : n,
                c = i.slice(0, l),
                a = {};
            t(a, s);
            var u = c.replace(/:([^\/\.-]+)(\.{3})?/g, function (D, k, S) {
                    return delete a[k], s[k] == null ? D : S ? s[k] : encodeURIComponent(String(s[k]));
                }),
                p = u.indexOf("?"),
                h = u.indexOf("#"),
                m = h < 0 ? u.length : h,
                w = p < 0 ? m : p,
                v = u.slice(0, w);
            n >= 0 && (v += i.slice(n, o)), p >= 0 && (v += (n < 0 ? "?" : "&") + u.slice(p, m));
            var x = e(a);
            return x && (v += (n < 0 && p < 0 ? "?" : "&") + x), r >= 0 && (v += i.slice(r)), h >= 0 && (v += (r < 0 ? "" : "&") + u.slice(h)), v;
        }),
        an
    );
}
var sh = rs(),
    Gs = Ci,
    rh = function (e, t, i) {
        var s = 0;
        function n(l) {
            return new t(l);
        }
        (n.prototype = t.prototype), (n.__proto__ = t);
        function r(l) {
            return function (c, a) {
                typeof c != "string" ? ((a = c), (c = c.url)) : a == null && (a = {});
                var u = new t(function (w, v) {
                    l(
                        sh(c, a.params),
                        a,
                        function (x) {
                            if (typeof a.type == "function")
                                if (Array.isArray(x)) for (var D = 0; D < x.length; D++) x[D] = new a.type(x[D]);
                                else x = new a.type(x);
                            w(x);
                        },
                        v
                    );
                });
                if (a.background === !0) return u;
                var p = 0;
                function h() {
                    --p === 0 && typeof i == "function" && i();
                }
                return m(u);
                function m(w) {
                    var v = w.then;
                    return (
                        (w.constructor = n),
                        (w.then = function () {
                            p++;
                            var x = v.apply(w, arguments);
                            return (
                                x.then(h, function (D) {
                                    if ((h(), p === 0)) throw D;
                                }),
                                m(x)
                            );
                        }),
                        w
                    );
                }
            };
        }
        function o(l, c) {
            for (var a in l.headers) if (Gs.call(l.headers, a) && a.toLowerCase() === c) return !0;
            return !1;
        }
        return {
            request: r(function (l, c, a, u) {
                var p = c.method != null ? c.method.toUpperCase() : "GET",
                    h = c.body,
                    m = (c.serialize == null || c.serialize === JSON.serialize) && !(h instanceof e.FormData || h instanceof e.URLSearchParams),
                    w = c.responseType || (typeof c.extract == "function" ? "" : "json"),
                    v = new e.XMLHttpRequest(),
                    x = !1,
                    D = !1,
                    k = v,
                    S,
                    O = v.abort;
                (v.abort = function () {
                    (x = !0), O.call(this);
                }),
                    v.open(p, l, c.async !== !1, typeof c.user == "string" ? c.user : void 0, typeof c.password == "string" ? c.password : void 0),
                    m && h != null && !o(c, "content-type") && v.setRequestHeader("Content-Type", "application/json; charset=utf-8"),
                    typeof c.deserialize != "function" && !o(c, "accept") && v.setRequestHeader("Accept", "application/json, text/*"),
                    c.withCredentials && (v.withCredentials = c.withCredentials),
                    c.timeout && (v.timeout = c.timeout),
                    (v.responseType = w);
                for (var U in c.headers) Gs.call(c.headers, U) && v.setRequestHeader(U, c.headers[U]);
                (v.onreadystatechange = function (L) {
                    if (!x && L.target.readyState === 4)
                        try {
                            var q = (L.target.status >= 200 && L.target.status < 300) || L.target.status === 304 || /^file:\/\//i.test(l),
                                P = L.target.response,
                                W;
                            if (w === "json") {
                                if (!L.target.responseType && typeof c.extract != "function")
                                    try {
                                        P = JSON.parse(L.target.responseText);
                                    } catch {
                                        P = null;
                                    }
                            } else (!w || w === "text") && P == null && (P = L.target.responseText);
                            if ((typeof c.extract == "function" ? ((P = c.extract(L.target, c)), (q = !0)) : typeof c.deserialize == "function" && (P = c.deserialize(P)), q)) a(P);
                            else {
                                var F = function () {
                                    try {
                                        W = L.target.responseText;
                                    } catch {
                                        W = P;
                                    }
                                    var _ = new Error(W);
                                    (_.code = L.target.status), (_.response = P), u(_);
                                };
                                v.status === 0
                                    ? setTimeout(function () {
                                          D || F();
                                      })
                                    : F();
                            }
                        } catch (_) {
                            u(_);
                        }
                }),
                    (v.ontimeout = function (L) {
                        D = !0;
                        var q = new Error("Request timed out");
                        (q.code = L.target.status), u(q);
                    }),
                    typeof c.config == "function" &&
                        ((v = c.config(v, c, l) || v),
                        v !== k &&
                            ((S = v.abort),
                            (v.abort = function () {
                                (x = !0), S.call(this);
                            }))),
                    h == null ? v.send() : typeof c.serialize == "function" ? v.send(c.serialize(h)) : h instanceof e.FormData || h instanceof e.URLSearchParams ? v.send(h) : v.send(JSON.stringify(h));
            }),
            jsonp: r(function (l, c, a, u) {
                var p = c.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + s++,
                    h = e.document.createElement("script");
                (e[p] = function (m) {
                    delete e[p], h.parentNode.removeChild(h), a(m);
                }),
                    (h.onerror = function () {
                        delete e[p], h.parentNode.removeChild(h), u(new Error("JSONP request failed"));
                    }),
                    (h.src = l + (l.indexOf("?") < 0 ? "?" : "&") + encodeURIComponent(c.callbackKey || "callback") + "=" + encodeURIComponent(p)),
                    e.document.documentElement.appendChild(h);
            }),
        };
    },
    oh = yi,
    ah = ss,
    lh = rh(typeof window < "u" ? window : null, oh, ah.redraw),
    ln,
    Ys;
function no() {
    if (Ys) return ln;
    Ys = 1;
    function e(t) {
        try {
            return decodeURIComponent(t);
        } catch {
            return t;
        }
    }
    return (
        (ln = function (t) {
            if (t === "" || t == null) return {};
            t.charAt(0) === "?" && (t = t.slice(1));
            for (var i = t.split("&"), s = {}, n = {}, r = 0; r < i.length; r++) {
                var o = i[r].split("="),
                    l = e(o[0]),
                    c = o.length === 2 ? e(o[1]) : "";
                c === "true" ? (c = !0) : c === "false" && (c = !1);
                var a = l.split(/\]\[?|\[/),
                    u = n;
                l.indexOf("[") > -1 && a.pop();
                for (var p = 0; p < a.length; p++) {
                    var h = a[p],
                        m = a[p + 1],
                        w = m == "" || !isNaN(parseInt(m, 10));
                    if (h === "") {
                        var l = a.slice(0, p).join();
                        s[l] == null && (s[l] = Array.isArray(u) ? u.length : 0), (h = s[l]++);
                    } else if (h === "__proto__") break;
                    if (p === a.length - 1) u[h] = c;
                    else {
                        var v = Object.getOwnPropertyDescriptor(u, h);
                        v != null && (v = v.value), v == null && (u[h] = v = w ? [] : {}), (u = v);
                    }
                }
            }
            return n;
        }),
        ln
    );
}
var cn, $s;
function os() {
    if ($s) return cn;
    $s = 1;
    var e = no();
    return (
        (cn = function (t) {
            var i = t.indexOf("?"),
                s = t.indexOf("#"),
                n = s < 0 ? t.length : s,
                r = i < 0 ? n : i,
                o = t.slice(0, r).replace(/\/{2,}/g, "/");
            return o ? (o[0] !== "/" && (o = "/" + o), o.length > 1 && o[o.length - 1] === "/" && (o = o.slice(0, -1))) : (o = "/"), { path: o, params: i < 0 ? {} : e(t.slice(i + 1, n)) };
        }),
        cn
    );
}
var hn, Ks;
function ch() {
    if (Ks) return hn;
    Ks = 1;
    var e = os();
    return (
        (hn = function (t) {
            var i = e(t),
                s = Object.keys(i.params),
                n = [],
                r = new RegExp(
                    "^" +
                        i.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function (o, l, c) {
                            return l == null ? "\\" + o : (n.push({ k: l, r: c === "..." }), c === "..." ? "(.*)" : c === "." ? "([^/]+)\\." : "([^/]+)" + (c || ""));
                        }) +
                        "$"
                );
            return function (o) {
                for (var l = 0; l < s.length; l++) if (i.params[s[l]] !== o.params[s[l]]) return !1;
                if (!n.length) return r.test(o.path);
                var c = r.exec(o.path);
                if (c == null) return !1;
                for (var l = 0; l < n.length; l++) o.params[n[l].k] = n[l].r ? c[l + 1] : decodeURIComponent(c[l + 1]);
                return !0;
            };
        }),
        hn
    );
}
var fn, Js;
function so() {
    if (Js) return fn;
    Js = 1;
    var e = Ci,
        t = new RegExp("^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$");
    return (
        (fn = function (i, s) {
            var n = {};
            if (s != null) for (var r in i) e.call(i, r) && !t.test(r) && s.indexOf(r) < 0 && (n[r] = i[r]);
            else for (var r in i) e.call(i, r) && !t.test(r) && (n[r] = i[r]);
            return n;
        }),
        fn
    );
}
var un, Qs;
function hh() {
    if (Qs) return un;
    Qs = 1;
    var e = Ge(),
        t = Zr,
        i = yi,
        s = rs(),
        n = os(),
        r = ch(),
        o = io(),
        l = so(),
        c = {};
    function a(u) {
        try {
            return decodeURIComponent(u);
        } catch {
            return u;
        }
    }
    return (
        (un = function (u, p) {
            var h = u == null ? null : typeof u.setImmediate == "function" ? u.setImmediate : u.setTimeout,
                m = i.resolve(),
                w = !1,
                v = !1,
                x = 0,
                D,
                k,
                S = c,
                O,
                U,
                L,
                q,
                P = {
                    onbeforeupdate: function () {
                        return (x = x ? 2 : 1), !(!x || c === S);
                    },
                    onremove: function () {
                        u.removeEventListener("popstate", _, !1), u.removeEventListener("hashchange", F, !1);
                    },
                    view: function () {
                        if (!(!x || c === S)) {
                            var z = [e(O, U.key, U)];
                            return S && (z = S.render(z[0])), z;
                        }
                    },
                },
                W = (V.SKIP = {});
            function F() {
                w = !1;
                var z = u.location.hash;
                V.prefix[0] !== "#" && ((z = u.location.search + z), V.prefix[0] !== "?" && ((z = u.location.pathname + z), z[0] !== "/" && (z = "/" + z)));
                var X = z
                        .concat()
                        .replace(/(?:%[a-f89][a-f0-9])+/gim, a)
                        .slice(V.prefix.length),
                    G = n(X);
                o(G.params, u.history.state);
                function te(K) {
                    console.error(K), $(k, null, { replace: !0 });
                }
                ie(0);
                function ie(K) {
                    for (; K < D.length; K++)
                        if (D[K].check(G)) {
                            var ke = D[K].component,
                                nt = D[K].route,
                                Bi = ke,
                                Ue = (q = function (Ye) {
                                    if (Ue === q) {
                                        if (Ye === W) return ie(K + 1);
                                        (O = Ye != null && (typeof Ye.view == "function" || typeof Ye == "function") ? Ye : "div"),
                                            (U = G.params),
                                            (L = X),
                                            (q = null),
                                            (S = ke.render ? ke : null),
                                            x === 2 ? p.redraw() : ((x = 2), p.redraw.sync());
                                    }
                                });
                            ke.view || typeof ke == "function"
                                ? ((ke = {}), Ue(Bi))
                                : ke.onmatch
                                ? m
                                      .then(function () {
                                          return ke.onmatch(G.params, X, nt);
                                      })
                                      .then(Ue, X === k ? null : te)
                                : Ue("div");
                            return;
                        }
                    if (X === k) throw new Error("Could not resolve default route " + k + ".");
                    $(k, null, { replace: !0 });
                }
            }
            function _() {
                w || ((w = !0), h(F));
            }
            function $(z, X, G) {
                if (((z = s(z, X)), v)) {
                    _();
                    var te = G ? G.state : null,
                        ie = G ? G.title : null;
                    G && G.replace ? u.history.replaceState(te, ie, V.prefix + z) : u.history.pushState(te, ie, V.prefix + z);
                } else u.location.href = V.prefix + z;
            }
            function V(z, X, G) {
                if (!z) throw new TypeError("DOM element being rendered to does not exist.");
                if (
                    ((D = Object.keys(G).map(function (ie) {
                        if (ie[0] !== "/") throw new SyntaxError("Routes must start with a '/'.");
                        if (/:([^\/\.-]+)(\.{3})?:/.test(ie)) throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'.");
                        return { route: ie, component: G[ie], check: r(ie) };
                    })),
                    (k = X),
                    X != null)
                ) {
                    var te = n(X);
                    if (
                        !D.some(function (ie) {
                            return ie.check(te);
                        })
                    )
                        throw new ReferenceError("Default route doesn't match any known routes.");
                }
                typeof u.history.pushState == "function" ? u.addEventListener("popstate", _, !1) : V.prefix[0] === "#" && u.addEventListener("hashchange", F, !1), (v = !0), p.mount(z, P), F();
            }
            return (
                (V.set = function (z, X, G) {
                    q != null && ((G = G || {}), (G.replace = !0)), (q = null), $(z, X, G);
                }),
                (V.get = function () {
                    return L;
                }),
                (V.prefix = "#!"),
                (V.Link = {
                    view: function (z) {
                        var X = t(z.attrs.selector || "a", l(z.attrs, ["options", "params", "selector", "onclick"]), z.children),
                            G,
                            te,
                            ie;
                        return (
                            (X.attrs.disabled = Boolean(X.attrs.disabled))
                                ? ((X.attrs.href = null), (X.attrs["aria-disabled"] = "true"))
                                : ((G = z.attrs.options),
                                  (te = z.attrs.onclick),
                                  (ie = s(X.attrs.href, z.attrs.params)),
                                  (X.attrs.href = V.prefix + ie),
                                  (X.attrs.onclick = function (K) {
                                      var ke;
                                      typeof te == "function" ? (ke = te.call(K.currentTarget, K)) : te == null || typeof te != "object" || (typeof te.handleEvent == "function" && te.handleEvent(K)),
                                          ke !== !1 &&
                                              !K.defaultPrevented &&
                                              (K.button === 0 || K.which === 0 || K.which === 1) &&
                                              (!K.currentTarget.target || K.currentTarget.target === "_self") &&
                                              !K.ctrlKey &&
                                              !K.metaKey &&
                                              !K.shiftKey &&
                                              !K.altKey &&
                                              (K.preventDefault(), (K.redraw = !1), V.set(ie, null, G));
                                  })),
                            X
                        );
                    },
                }),
                (V.param = function (z) {
                    return U && z != null ? U[z] : U;
                }),
                V
            );
        }),
        un
    );
}
var dn, Zs;
function fh() {
    if (Zs) return dn;
    Zs = 1;
    var e = ss;
    return (dn = hh()(typeof window < "u" ? window : null, e)), dn;
}
var Ai = eh,
    ro = lh,
    oo = ss,
    pe = function () {
        return Ai.apply(this, arguments);
    };
pe.m = Ai;
pe.trust = Ai.trust;
pe.fragment = Ai.fragment;
pe.Fragment = "[";
pe.mount = oo.mount;
pe.route = fh();
pe.render = eo();
pe.redraw = oo.redraw;
pe.request = ro.request;
pe.jsonp = ro.jsonp;
pe.parseQueryString = no();
pe.buildQueryString = to();
pe.parsePathname = os();
pe.buildPathname = rs();
pe.vnode = Ge();
pe.PromisePolyfill = jr();
pe.censor = so();
var Ne = pe;
function we(e, t, i, s, n) {
    (this.debugLog = !1), (this.baseUrl = e), (this.lobbySize = i), (this.devPort = t), (this.lobbySpread = s), (this.rawIPs = !!n), (this.server = void 0), (this.gameIndex = void 0), (this.callback = void 0), (this.errorCallback = void 0);
}
we.prototype.regionInfo = {
    0: { name: "Local", latitude: 0, longitude: 0 },
    "us-east": { name: "Miami", latitude: 40.1393329, longitude: -75.8521818 },
    "us-west": { name: "Silicon Valley", latitude: 47.6149942, longitude: -122.4759879 },
    gb: { name: "London", latitude: 51.5283063, longitude: -0.382486 },
    "eu-west": { name: "Frankfurt", latitude: 50.1211273, longitude: 8.496137 },
    au: { name: "Sydney", latitude: -33.8479715, longitude: 150.651084 },
    sg: { name: "Singapore", latitude: 1.3147268, longitude: 103.7065876 },
};
we.prototype.start = function (e, t, i, s) {
    if (((this.callback = t), (this.errorCallback = i), s)) return t();
    const n = this.parseServerQuery(e);
    n && n.length > 0 ? (this.log("Found server in query."), (this.password = n[3]), this.connect(n[0], n[1], n[2])) : this.errorCallback("Unable to find server");
};
we.prototype.parseServerQuery = function (e) {
    const t = new URLSearchParams(location.search, !0),
        i = e || t.get("server");
    if (typeof i != "string") return [];
    const [s, n] = i.split(":");
    return [s, n, t.get("password")];
};
we.prototype.findServer = function (e, t) {
    var i = this.servers[e];
    for (let s = 0; s < i.length; s++) {
        const n = i[s];
        if (n.name === t) return n;
    }
    console.warn("Could not find server in region " + e + " with serverName " + t + ".");
};
we.prototype.seekServer = function (e, t, i) {
    i == null && (i = "random"), t == null && (t = !1);
    const s = ["random"],
        n = this.lobbySize,
        r = this.lobbySpread,
        o = this.servers[e]
            .flatMap(function (h) {
                let m = 0;
                return h.games.map(function (w) {
                    const v = m++;
                    return { region: h.region, index: h.index * h.games.length + v, gameIndex: v, gameCount: h.games.length, playerCount: w.playerCount, playerCapacity: w.playerCapacity, isPrivate: w.isPrivate };
                });
            })
            .filter(function (h) {
                return !h.isPrivate;
            })
            .filter(function (h) {
                return t ? h.playerCount == 0 && h.gameIndex >= h.gameCount / 2 : !0;
            })
            .filter(function (h) {
                return i == "random" ? !0 : s[h.index % s.length].key == i;
            })
            .sort(function (h, m) {
                return m.playerCount - h.playerCount;
            })
            .filter(function (h) {
                return h.playerCount < n;
            });
    if ((t && o.reverse(), o.length == 0)) {
        this.errorCallback("No open servers.");
        return;
    }
    const l = Math.min(r, o.length);
    var u = Math.floor(Math.random() * l);
    u = Math.min(u, o.length - 1);
    const c = o[u],
        a = c.region;
    var u = Math.floor(c.index / c.gameCount);
    const p = c.index % c.gameCount;
    return this.log("Found server."), [a, u, p];
};
we.prototype.connect = function (e, t, i) {
    if (this.connected) return;
    const s = this.findServer(e, t);
    if (s == null) {
        this.errorCallback("Failed to find server for region " + e + " and serverName " + t);
        return;
    }
    if ((this.log("Connecting to server", s, "with game index", i), s.playerCount >= s.playerCapacity)) {
        this.errorCallback("Server is already full.");
        return;
    }
    window.history.replaceState(document.title, document.title, this.generateHref(e, t, this.password)),
        (this.server = s),
        (this.gameIndex = i),
        this.log("Calling callback with address", this.serverAddress(s), "on port", this.serverPort(s)),
        this.callback(this.serverAddress(s), this.serverPort(s), i),
        Lt && clearInterval(Lt);
};
we.prototype.switchServer = function (e, t) {
    (this.switchingServers = !0), (window.location = this.generateHref(e, t, null));
};
we.prototype.generateHref = function (e, t, i) {
    let s = window.location.href.split("?")[0];
    return (s += "?server=" + e + ":" + t), i && (s += "&password=" + encodeURIComponent(i)), s;
};
we.prototype.serverAddress = function (e) {
    return e.region == 0 ? "localhost" : e.key + "." + e.region + "." + this.baseUrl;
};
we.prototype.serverPort = function (e) {
    return e.port;
};
let Lt;
function uh(e) {
    e = e.filter((n) => n.playerCount !== n.playerCapacity);
    const t = Math.min(...e.map((n) => n.ping || 1 / 0)),
        i = e.filter((n) => n.ping === t);
    return !i.length > 0 ? null : i.reduce((n, r) => (n.playerCount > r.playerCount ? n : r));
}
we.prototype.processServers = function (e) {
    return (
        Lt && clearInterval(Lt),
        new Promise((t) => {
            const i = {},
                s = (c) => {
                    const a = i[c],
                        u = a[0];
                    let p = this.serverAddress(u);
                    const h = this.serverPort(u);
                    h && (p += `:${h}`);
                    const m = `https://${p}/ping`,
                        w = new Date().getTime();
                    return Promise.race([
                        fetch(m)
                            .then(() => {
                                const v = new Date().getTime() - w;
                                a.forEach((x) => {
                                    (x.pings = x.pings ?? []), x.pings.push(v), x.pings.length > 10 && x.pings.shift(), (x.ping = Math.floor(x.pings.reduce((D, k) => D + k, 0) / x.pings.length));
                                });
                            })
                            .catch(() => {}),
                        new Promise((v) => setTimeout(() => v(), 100)),
                    ]);
                },
                n = async () => {
                    await Promise.all(Object.keys(i).map(s)), window.blockRedraw || Ne.redraw();
                };
            e.forEach((c) => {
                (i[c.region] = i[c.region] || []), i[c.region].push(c);
            });
            for (const c in i)
                i[c] = i[c].sort(function (a, u) {
                    return u.playerCount - a.playerCount;
                });
            this.servers = i;
            let r;
            const [o, l] = this.parseServerQuery();
            e.forEach((c) => {
                o === c.region && l === c.name && ((c.selected = !0), (r = c));
            }),
                n()
                    .then(n)
                    .then(() => {
                        if (r) return;
                        let c = uh(e);
                        c || (c = e[0]), c && ((c.selected = !0), window.history.replaceState(document.title, document.title, this.generateHref(c.region, c.name, this.password))), window.blockRedraw || Ne.redraw();
                    })
                    .then(n)
                    .catch((c) => {})
                    .finally(t),
                (Lt = setInterval(n, 5e3));
        })
    );
};
we.prototype.ipToHex = function (e) {
    return e
        .split(".")
        .map((i) => ("00" + parseInt(i).toString(16)).substr(-2))
        .join("")
        .toLowerCase();
};
we.prototype.hashIP = function (e) {
    return On(this.ipToHex(e));
};
we.prototype.log = function () {
    if (this.debugLog) return console.log.apply(void 0, arguments);
    if (console.verbose) return console.verbose.apply(void 0, arguments);
};
we.prototype.stripRegion = function (e) {
    return e.startsWith("vultr:") ? (e = e.slice(6)) : e.startsWith("do:") && (e = e.slice(3)), e;
};
const dh = function (e, t) {
        return e.concat(t);
    },
    ph = function (e, t) {
        return t.map(e).reduce(dh, []);
    };
Array.prototype.flatMap = function (e) {
    return ph(e, this);
};
const fi = (e, t) => {
        const i = t.x - e.x,
            s = t.y - e.y;
        return Math.sqrt(i * i + s * s);
    },
    mh = (e, t) => {
        const i = t.x - e.x,
            s = t.y - e.y;
        return yh(Math.atan2(s, i));
    },
    gh = (e, t, i) => {
        const s = { x: 0, y: 0 };
        return (i = Bn(i)), (s.x = e.x - t * Math.cos(i)), (s.y = e.y - t * Math.sin(i)), s;
    },
    Bn = (e) => e * (Math.PI / 180),
    yh = (e) => e * (180 / Math.PI),
    wh = (e) => (isNaN(e.buttons) ? e.pressure !== 0 : e.buttons !== 0),
    pn = new Map(),
    js = (e) => {
        pn.has(e) && clearTimeout(pn.get(e)), pn.set(e, setTimeout(e, 100));
    },
    wi = (e, t, i) => {
        const s = t.split(/[ ,]+/g);
        let n;
        for (let r = 0; r < s.length; r += 1) (n = s[r]), e.addEventListener ? e.addEventListener(n, i, !1) : e.attachEvent && e.attachEvent(n, i);
    },
    er = (e, t, i) => {
        const s = t.split(/[ ,]+/g);
        let n;
        for (let r = 0; r < s.length; r += 1) (n = s[r]), e.removeEventListener ? e.removeEventListener(n, i) : e.detachEvent && e.detachEvent(n, i);
    },
    ao = (e) => (e.preventDefault(), e.type.match(/^touch/) ? e.changedTouches : e),
    tr = () => {
        const e = window.pageXOffset !== void 0 ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft,
            t = window.pageYOffset !== void 0 ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
        return { x: e, y: t };
    },
    ir = (e, t) => {
        t.top || t.right || t.bottom || t.left ? ((e.style.top = t.top), (e.style.right = t.right), (e.style.bottom = t.bottom), (e.style.left = t.left)) : ((e.style.left = t.x + "px"), (e.style.top = t.y + "px"));
    },
    as = (e, t, i) => {
        const s = lo(e);
        for (let n in s)
            if (s.hasOwnProperty(n))
                if (typeof t == "string") s[n] = t + " " + i;
                else {
                    let r = "";
                    for (let o = 0, l = t.length; o < l; o += 1) r += t[o] + " " + i + ", ";
                    s[n] = r.slice(0, -2);
                }
        return s;
    },
    kh = (e, t) => {
        const i = lo(e);
        for (let s in i) i.hasOwnProperty(s) && (i[s] = t);
        return i;
    },
    lo = (e) => {
        const t = {};
        return (
            (t[e] = ""),
            ["webkit", "Moz", "o"].forEach(function (s) {
                t[s + e.charAt(0).toUpperCase() + e.slice(1)] = "";
            }),
            t
        );
    },
    mn = (e, t) => {
        for (let i in t) t.hasOwnProperty(i) && (e[i] = t[i]);
        return e;
    },
    vh = (e, t) => {
        const i = {};
        for (let s in e) e.hasOwnProperty(s) && t.hasOwnProperty(s) ? (i[s] = t[s]) : e.hasOwnProperty(s) && (i[s] = e[s]);
        return i;
    },
    zn = (e, t) => {
        if (e.length) for (let i = 0, s = e.length; i < s; i += 1) t(e[i]);
        else t(e);
    },
    xh = (e, t, i) => ({ x: Math.min(Math.max(e.x, t.x - i), t.x + i), y: Math.min(Math.max(e.y, t.y - i), t.y + i) });
var bh = "ontouchstart" in window,
    Sh = !!window.PointerEvent,
    Th = !!window.MSPointerEvent,
    Bt = {
        touch: { start: "touchstart", move: "touchmove", end: "touchend, touchcancel" },
        mouse: { start: "mousedown", move: "mousemove", end: "mouseup" },
        pointer: { start: "pointerdown", move: "pointermove", end: "pointerup, pointercancel" },
        MSPointer: { start: "MSPointerDown", move: "MSPointerMove", end: "MSPointerUp" },
    },
    vt,
    Kt = {};
Sh ? (vt = Bt.pointer) : Th ? (vt = Bt.MSPointer) : bh ? ((vt = Bt.touch), (Kt = Bt.mouse)) : (vt = Bt.mouse);
function Ve() {}
Ve.prototype.on = function (e, t) {
    var i = this,
        s = e.split(/[ ,]+/g),
        n;
    i._handlers_ = i._handlers_ || {};
    for (var r = 0; r < s.length; r += 1) (n = s[r]), (i._handlers_[n] = i._handlers_[n] || []), i._handlers_[n].push(t);
    return i;
};
Ve.prototype.off = function (e, t) {
    var i = this;
    return (i._handlers_ = i._handlers_ || {}), e === void 0 ? (i._handlers_ = {}) : t === void 0 ? (i._handlers_[e] = null) : i._handlers_[e] && i._handlers_[e].indexOf(t) >= 0 && i._handlers_[e].splice(i._handlers_[e].indexOf(t), 1), i;
};
Ve.prototype.trigger = function (e, t) {
    var i = this,
        s = e.split(/[ ,]+/g),
        n;
    i._handlers_ = i._handlers_ || {};
    for (var r = 0; r < s.length; r += 1)
        (n = s[r]),
            i._handlers_[n] &&
                i._handlers_[n].length &&
                i._handlers_[n].forEach(function (o) {
                    o.call(i, { type: n, target: i }, t);
                });
};
Ve.prototype.config = function (e) {
    var t = this;
    (t.options = t.defaults || {}), e && (t.options = vh(t.options, e));
};
Ve.prototype.bindEvt = function (e, t) {
    var i = this;
    return (
        (i._domHandlers_ = i._domHandlers_ || {}),
        (i._domHandlers_[t] = function () {
            typeof i["on" + t] == "function" ? i["on" + t].apply(i, arguments) : console.warn('[WARNING] : Missing "on' + t + '" handler.');
        }),
        wi(e, vt[t], i._domHandlers_[t]),
        Kt[t] && wi(e, Kt[t], i._domHandlers_[t]),
        i
    );
};
Ve.prototype.unbindEvt = function (e, t) {
    var i = this;
    return (i._domHandlers_ = i._domHandlers_ || {}), er(e, vt[t], i._domHandlers_[t]), Kt[t] && er(e, Kt[t], i._domHandlers_[t]), delete i._domHandlers_[t], this;
};
function he(e, t) {
    return (
        (this.identifier = t.identifier),
        (this.position = t.position),
        (this.frontPosition = t.frontPosition),
        (this.collection = e),
        (this.defaults = { size: 100, threshold: 0.1, color: "white", fadeTime: 250, dataOnly: !1, restJoystick: !0, restOpacity: 0.5, mode: "dynamic", zone: document.body, lockX: !1, lockY: !1, shape: "circle" }),
        this.config(t),
        this.options.mode === "dynamic" && (this.options.restOpacity = 0),
        (this.id = he.id),
        (he.id += 1),
        this.buildEl().stylize(),
        (this.instance = {
            el: this.ui.el,
            on: this.on.bind(this),
            off: this.off.bind(this),
            show: this.show.bind(this),
            hide: this.hide.bind(this),
            add: this.addToDom.bind(this),
            remove: this.removeFromDom.bind(this),
            destroy: this.destroy.bind(this),
            setPosition: this.setPosition.bind(this),
            resetDirection: this.resetDirection.bind(this),
            computeDirection: this.computeDirection.bind(this),
            trigger: this.trigger.bind(this),
            position: this.position,
            frontPosition: this.frontPosition,
            ui: this.ui,
            identifier: this.identifier,
            id: this.id,
            options: this.options,
        }),
        this.instance
    );
}
he.prototype = new Ve();
he.constructor = he;
he.id = 0;
he.prototype.buildEl = function (e) {
    return (
        (this.ui = {}),
        this.options.dataOnly
            ? this
            : ((this.ui.el = document.createElement("div")),
              (this.ui.back = document.createElement("div")),
              (this.ui.front = document.createElement("div")),
              (this.ui.el.className = "nipple collection_" + this.collection.id),
              (this.ui.back.className = "back"),
              (this.ui.front.className = "front"),
              this.ui.el.setAttribute("id", "nipple_" + this.collection.id + "_" + this.id),
              this.ui.el.appendChild(this.ui.back),
              this.ui.el.appendChild(this.ui.front),
              this)
    );
};
he.prototype.stylize = function () {
    if (this.options.dataOnly) return this;
    var e = this.options.fadeTime + "ms",
        t = kh("borderRadius", "50%"),
        i = as("transition", "opacity", e),
        s = {};
    return (
        (s.el = { position: "absolute", opacity: this.options.restOpacity, display: "block", zIndex: 999 }),
        (s.back = {
            position: "absolute",
            display: "block",
            width: this.options.size + "px",
            height: this.options.size + "px",
            marginLeft: -this.options.size / 2 + "px",
            marginTop: -this.options.size / 2 + "px",
            background: this.options.color,
            opacity: ".5",
        }),
        (s.front = {
            width: this.options.size / 2 + "px",
            height: this.options.size / 2 + "px",
            position: "absolute",
            display: "block",
            marginLeft: -this.options.size / 4 + "px",
            marginTop: -this.options.size / 4 + "px",
            background: this.options.color,
            opacity: ".5",
            transform: "translate(0px, 0px)",
        }),
        mn(s.el, i),
        this.options.shape === "circle" && mn(s.back, t),
        mn(s.front, t),
        this.applyStyles(s),
        this
    );
};
he.prototype.applyStyles = function (e) {
    for (var t in this.ui) if (this.ui.hasOwnProperty(t)) for (var i in e[t]) this.ui[t].style[i] = e[t][i];
    return this;
};
he.prototype.addToDom = function () {
    return this.options.dataOnly || document.body.contains(this.ui.el) ? this : (this.options.zone.appendChild(this.ui.el), this);
};
he.prototype.removeFromDom = function () {
    return this.options.dataOnly || !document.body.contains(this.ui.el) ? this : (this.options.zone.removeChild(this.ui.el), this);
};
he.prototype.destroy = function () {
    clearTimeout(this.removeTimeout), clearTimeout(this.showTimeout), clearTimeout(this.restTimeout), this.trigger("destroyed", this.instance), this.removeFromDom(), this.off();
};
he.prototype.show = function (e) {
    var t = this;
    return (
        t.options.dataOnly ||
            (clearTimeout(t.removeTimeout),
            clearTimeout(t.showTimeout),
            clearTimeout(t.restTimeout),
            t.addToDom(),
            t.restCallback(),
            setTimeout(function () {
                t.ui.el.style.opacity = 1;
            }, 0),
            (t.showTimeout = setTimeout(function () {
                t.trigger("shown", t.instance), typeof e == "function" && e.call(this);
            }, t.options.fadeTime))),
        t
    );
};
he.prototype.hide = function (e) {
    var t = this;
    if (t.options.dataOnly) return t;
    if (
        ((t.ui.el.style.opacity = t.options.restOpacity),
        clearTimeout(t.removeTimeout),
        clearTimeout(t.showTimeout),
        clearTimeout(t.restTimeout),
        (t.removeTimeout = setTimeout(function () {
            var i = t.options.mode === "dynamic" ? "none" : "block";
            (t.ui.el.style.display = i), typeof e == "function" && e.call(t), t.trigger("hidden", t.instance);
        }, t.options.fadeTime)),
        t.options.restJoystick)
    ) {
        const i = t.options.restJoystick,
            s = {};
        (s.x = i === !0 || i.x !== !1 ? 0 : t.instance.frontPosition.x), (s.y = i === !0 || i.y !== !1 ? 0 : t.instance.frontPosition.y), t.setPosition(e, s);
    }
    return t;
};
he.prototype.setPosition = function (e, t) {
    var i = this;
    i.frontPosition = { x: t.x, y: t.y };
    var s = i.options.fadeTime + "ms",
        n = {};
    n.front = as("transition", ["transform"], s);
    var r = { front: {} };
    (r.front = { transform: "translate(" + i.frontPosition.x + "px," + i.frontPosition.y + "px)" }),
        i.applyStyles(n),
        i.applyStyles(r),
        (i.restTimeout = setTimeout(function () {
            typeof e == "function" && e.call(i), i.restCallback();
        }, i.options.fadeTime));
};
he.prototype.restCallback = function () {
    var e = this,
        t = {};
    (t.front = as("transition", "none", "")), e.applyStyles(t), e.trigger("rested", e.instance);
};
he.prototype.resetDirection = function () {
    this.direction = { x: !1, y: !1, angle: !1 };
};
he.prototype.computeDirection = function (e) {
    var t = e.angle.radian,
        i = Math.PI / 4,
        s = Math.PI / 2,
        n,
        r,
        o;
    if (
        (t > i && t < i * 3 && !e.lockX ? (n = "up") : t > -i && t <= i && !e.lockY ? (n = "left") : t > -i * 3 && t <= -i && !e.lockX ? (n = "down") : e.lockY || (n = "right"),
        e.lockY || (t > -s && t < s ? (r = "left") : (r = "right")),
        e.lockX || (t > 0 ? (o = "up") : (o = "down")),
        e.force > this.options.threshold)
    ) {
        var l = {},
            c;
        for (c in this.direction) this.direction.hasOwnProperty(c) && (l[c] = this.direction[c]);
        var a = {};
        (this.direction = { x: r, y: o, angle: n }), (e.direction = this.direction);
        for (c in l) l[c] === this.direction[c] && (a[c] = !0);
        if (a.x && a.y && a.angle) return e;
        (!a.x || !a.y) && this.trigger("plain", e), a.x || this.trigger("plain:" + r, e), a.y || this.trigger("plain:" + o, e), a.angle || this.trigger("dir dir:" + n, e);
    } else this.resetDirection();
    return e;
};
function ae(e, t) {
    var i = this;
    (i.nipples = []),
        (i.idles = []),
        (i.actives = []),
        (i.ids = []),
        (i.pressureIntervals = {}),
        (i.manager = e),
        (i.id = ae.id),
        (ae.id += 1),
        (i.defaults = {
            zone: document.body,
            multitouch: !1,
            maxNumberOfNipples: 10,
            mode: "dynamic",
            position: { top: 0, left: 0 },
            catchDistance: 200,
            size: 100,
            threshold: 0.1,
            color: "white",
            fadeTime: 250,
            dataOnly: !1,
            restJoystick: !0,
            restOpacity: 0.5,
            lockX: !1,
            lockY: !1,
            shape: "circle",
            dynamicPage: !1,
            follow: !1,
        }),
        i.config(t),
        (i.options.mode === "static" || i.options.mode === "semi") && (i.options.multitouch = !1),
        i.options.multitouch || (i.options.maxNumberOfNipples = 1);
    const s = getComputedStyle(i.options.zone.parentElement);
    return s && s.display === "flex" && (i.parentIsFlex = !0), i.updateBox(), i.prepareNipples(), i.bindings(), i.begin(), i.nipples;
}
ae.prototype = new Ve();
ae.constructor = ae;
ae.id = 0;
ae.prototype.prepareNipples = function () {
    var e = this,
        t = e.nipples;
    (t.on = e.on.bind(e)),
        (t.off = e.off.bind(e)),
        (t.options = e.options),
        (t.destroy = e.destroy.bind(e)),
        (t.ids = e.ids),
        (t.id = e.id),
        (t.processOnMove = e.processOnMove.bind(e)),
        (t.processOnEnd = e.processOnEnd.bind(e)),
        (t.get = function (i) {
            if (i === void 0) return t[0];
            for (var s = 0, n = t.length; s < n; s += 1) if (t[s].identifier === i) return t[s];
            return !1;
        });
};
ae.prototype.bindings = function () {
    var e = this;
    e.bindEvt(e.options.zone, "start"), (e.options.zone.style.touchAction = "none"), (e.options.zone.style.msTouchAction = "none");
};
ae.prototype.begin = function () {
    var e = this,
        t = e.options;
    if (t.mode === "static") {
        var i = e.createNipple(t.position, e.manager.getIdentifier());
        i.add(), e.idles.push(i);
    }
};
ae.prototype.createNipple = function (e, t) {
    var i = this,
        s = i.manager.scroll,
        n = {},
        r = i.options,
        o = { x: i.parentIsFlex ? s.x : s.x + i.box.left, y: i.parentIsFlex ? s.y : s.y + i.box.top };
    if (e.x && e.y) n = { x: e.x - o.x, y: e.y - o.y };
    else if (e.top || e.right || e.bottom || e.left) {
        var l = document.createElement("DIV");
        (l.style.display = "hidden"), (l.style.top = e.top), (l.style.right = e.right), (l.style.bottom = e.bottom), (l.style.left = e.left), (l.style.position = "absolute"), r.zone.appendChild(l);
        var c = l.getBoundingClientRect();
        r.zone.removeChild(l), (n = e), (e = { x: c.left + s.x, y: c.top + s.y });
    }
    var a = new he(i, {
        color: r.color,
        size: r.size,
        threshold: r.threshold,
        fadeTime: r.fadeTime,
        dataOnly: r.dataOnly,
        restJoystick: r.restJoystick,
        restOpacity: r.restOpacity,
        mode: r.mode,
        identifier: t,
        position: e,
        zone: r.zone,
        frontPosition: { x: 0, y: 0 },
        shape: r.shape,
    });
    return r.dataOnly || (ir(a.ui.el, n), ir(a.ui.front, a.frontPosition)), i.nipples.push(a), i.trigger("added " + a.identifier + ":added", a), i.manager.trigger("added " + a.identifier + ":added", a), i.bindNipple(a), a;
};
ae.prototype.updateBox = function () {
    var e = this;
    e.box = e.options.zone.getBoundingClientRect();
};
ae.prototype.bindNipple = function (e) {
    var t = this,
        i,
        s = function (n, r) {
            (i = n.type + " " + r.id + ":" + n.type), t.trigger(i, r);
        };
    e.on("destroyed", t.onDestroyed.bind(t)), e.on("shown hidden rested dir plain", s), e.on("dir:up dir:right dir:down dir:left", s), e.on("plain:up plain:right plain:down plain:left", s);
};
ae.prototype.pressureFn = function (e, t, i) {
    var s = this,
        n = 0;
    clearInterval(s.pressureIntervals[i]),
        (s.pressureIntervals[i] = setInterval(
            function () {
                var r = e.force || e.pressure || e.webkitForce || 0;
                r !== n && (t.trigger("pressure", r), s.trigger("pressure " + t.identifier + ":pressure", r), (n = r));
            }.bind(s),
            100
        ));
};
ae.prototype.onstart = function (e) {
    var t = this,
        i = t.options,
        s = e;
    (e = ao(e)), t.updateBox();
    var n = function (r) {
        t.actives.length < i.maxNumberOfNipples
            ? t.processOnStart(r)
            : s.type.match(/^touch/) &&
              (Object.keys(t.manager.ids).forEach(function (o) {
                  if (
                      Object.values(s.touches).findIndex(function (c) {
                          return c.identifier === o;
                      }) < 0
                  ) {
                      var l = [e[0]];
                      (l.identifier = o), t.processOnEnd(l);
                  }
              }),
              t.actives.length < i.maxNumberOfNipples && t.processOnStart(r));
    };
    return zn(e, n), t.manager.bindDocument(), !1;
};
ae.prototype.processOnStart = function (e) {
    var t = this,
        i = t.options,
        s,
        n = t.manager.getIdentifier(e),
        r = e.force || e.pressure || e.webkitForce || 0,
        o = { x: e.pageX, y: e.pageY },
        l = t.getOrCreate(n, o);
    l.identifier !== n && t.manager.removeIdentifier(l.identifier), (l.identifier = n);
    var c = function (u) {
        u.trigger("start", u), t.trigger("start " + u.id + ":start", u), u.show(), r > 0 && t.pressureFn(e, u, u.identifier), t.processOnMove(e);
    };
    if (((s = t.idles.indexOf(l)) >= 0 && t.idles.splice(s, 1), t.actives.push(l), t.ids.push(l.identifier), i.mode !== "semi")) c(l);
    else {
        var a = fi(o, l.position);
        if (a <= i.catchDistance) c(l);
        else {
            l.destroy(), t.processOnStart(e);
            return;
        }
    }
    return l;
};
ae.prototype.getOrCreate = function (e, t) {
    var i = this,
        s = i.options,
        n;
    return /(semi|static)/.test(s.mode) ? ((n = i.idles[0]), n ? (i.idles.splice(0, 1), n) : s.mode === "semi" ? i.createNipple(t, e) : (console.warn("Coudln't find the needed nipple."), !1)) : ((n = i.createNipple(t, e)), n);
};
ae.prototype.processOnMove = function (e) {
    var t = this,
        i = t.options,
        s = t.manager.getIdentifier(e),
        n = t.nipples.get(s),
        r = t.manager.scroll;
    if (!wh(e)) {
        this.processOnEnd(e);
        return;
    }
    if (!n) {
        console.error("Found zombie joystick with ID " + s), t.manager.removeIdentifier(s);
        return;
    }
    if (i.dynamicPage) {
        var o = n.el.getBoundingClientRect();
        n.position = { x: r.x + o.left, y: r.y + o.top };
    }
    n.identifier = s;
    var l = n.options.size / 2,
        c = { x: e.pageX, y: e.pageY };
    i.lockX && (c.y = n.position.y), i.lockY && (c.x = n.position.x);
    var a = fi(c, n.position),
        u = mh(c, n.position),
        p = Bn(u),
        h = a / l,
        m = { distance: a, position: c },
        w,
        v;
    if ((n.options.shape === "circle" ? ((w = Math.min(a, l)), (v = gh(n.position, w, u))) : ((v = xh(c, n.position, l)), (w = fi(v, n.position))), i.follow)) {
        if (a > l) {
            let S = c.x - v.x,
                O = c.y - v.y;
            (n.position.x += S), (n.position.y += O), (n.el.style.top = n.position.y - (t.box.top + r.y) + "px"), (n.el.style.left = n.position.x - (t.box.left + r.x) + "px"), (a = fi(c, n.position));
        }
    } else (c = v), (a = w);
    var x = c.x - n.position.x,
        D = c.y - n.position.y;
    (n.frontPosition = { x, y: D }), i.dataOnly || (n.ui.front.style.transform = "translate(" + x + "px," + D + "px)");
    var k = {
        identifier: n.identifier,
        position: c,
        force: h,
        pressure: e.force || e.pressure || e.webkitForce || 0,
        distance: a,
        angle: { radian: p, degree: u },
        vector: { x: x / l, y: -D / l },
        raw: m,
        instance: n,
        lockX: i.lockX,
        lockY: i.lockY,
    };
    (k = n.computeDirection(k)), (k.angle = { radian: Bn(180 - u), degree: 180 - u }), n.trigger("move", k), t.trigger("move " + n.id + ":move", k);
};
ae.prototype.processOnEnd = function (e) {
    var t = this,
        i = t.options,
        s = t.manager.getIdentifier(e),
        n = t.nipples.get(s),
        r = t.manager.removeIdentifier(n.identifier);
    n &&
        (i.dataOnly ||
            n.hide(function () {
                i.mode === "dynamic" && (n.trigger("removed", n), t.trigger("removed " + n.id + ":removed", n), t.manager.trigger("removed " + n.id + ":removed", n), n.destroy());
            }),
        clearInterval(t.pressureIntervals[n.identifier]),
        n.resetDirection(),
        n.trigger("end", n),
        t.trigger("end " + n.id + ":end", n),
        t.ids.indexOf(n.identifier) >= 0 && t.ids.splice(t.ids.indexOf(n.identifier), 1),
        t.actives.indexOf(n) >= 0 && t.actives.splice(t.actives.indexOf(n), 1),
        /(semi|static)/.test(i.mode) ? t.idles.push(n) : t.nipples.indexOf(n) >= 0 && t.nipples.splice(t.nipples.indexOf(n), 1),
        t.manager.unbindDocument(),
        /(semi|static)/.test(i.mode) && (t.manager.ids[r.id] = r.identifier));
};
ae.prototype.onDestroyed = function (e, t) {
    var i = this;
    i.nipples.indexOf(t) >= 0 && i.nipples.splice(i.nipples.indexOf(t), 1),
        i.actives.indexOf(t) >= 0 && i.actives.splice(i.actives.indexOf(t), 1),
        i.idles.indexOf(t) >= 0 && i.idles.splice(i.idles.indexOf(t), 1),
        i.ids.indexOf(t.identifier) >= 0 && i.ids.splice(i.ids.indexOf(t.identifier), 1),
        i.manager.removeIdentifier(t.identifier),
        i.manager.unbindDocument();
};
ae.prototype.destroy = function () {
    var e = this;
    e.unbindEvt(e.options.zone, "start"),
        e.nipples.forEach(function (i) {
            i.destroy();
        });
    for (var t in e.pressureIntervals) e.pressureIntervals.hasOwnProperty(t) && clearInterval(e.pressureIntervals[t]);
    e.trigger("destroyed", e.nipples), e.manager.unbindDocument(), e.off();
};
function de(e) {
    var t = this;
    (t.ids = {}), (t.index = 0), (t.collections = []), (t.scroll = tr()), t.config(e), t.prepareCollections();
    var i = function () {
        var n;
        t.collections.forEach(function (r) {
            r.forEach(function (o) {
                (n = o.el.getBoundingClientRect()), (o.position = { x: t.scroll.x + n.left, y: t.scroll.y + n.top });
            });
        });
    };
    wi(window, "resize", function () {
        js(i);
    });
    var s = function () {
        t.scroll = tr();
    };
    return (
        wi(window, "scroll", function () {
            js(s);
        }),
        t.collections
    );
}
de.prototype = new Ve();
de.constructor = de;
de.prototype.prepareCollections = function () {
    var e = this;
    (e.collections.create = e.create.bind(e)),
        (e.collections.on = e.on.bind(e)),
        (e.collections.off = e.off.bind(e)),
        (e.collections.destroy = e.destroy.bind(e)),
        (e.collections.get = function (t) {
            var i;
            return (
                e.collections.every(function (s) {
                    return (i = s.get(t)), !i;
                }),
                i
            );
        });
};
de.prototype.create = function (e) {
    return this.createCollection(e);
};
de.prototype.createCollection = function (e) {
    var t = this,
        i = new ae(t, e);
    return t.bindCollection(i), t.collections.push(i), i;
};
de.prototype.bindCollection = function (e) {
    var t = this,
        i,
        s = function (n, r) {
            (i = n.type + " " + r.id + ":" + n.type), t.trigger(i, r);
        };
    e.on("destroyed", t.onDestroyed.bind(t)), e.on("shown hidden rested dir plain", s), e.on("dir:up dir:right dir:down dir:left", s), e.on("plain:up plain:right plain:down plain:left", s);
};
de.prototype.bindDocument = function () {
    var e = this;
    e.binded || (e.bindEvt(document, "move").bindEvt(document, "end"), (e.binded = !0));
};
de.prototype.unbindDocument = function (e) {
    var t = this;
    (!Object.keys(t.ids).length || e === !0) && (t.unbindEvt(document, "move").unbindEvt(document, "end"), (t.binded = !1));
};
de.prototype.getIdentifier = function (e) {
    var t;
    return (
        e ? ((t = e.identifier === void 0 ? e.pointerId : e.identifier), t === void 0 && (t = this.latest || 0)) : (t = this.index), this.ids[t] === void 0 && ((this.ids[t] = this.index), (this.index += 1)), (this.latest = t), this.ids[t]
    );
};
de.prototype.removeIdentifier = function (e) {
    var t = {};
    for (var i in this.ids)
        if (this.ids[i] === e) {
            (t.id = i), (t.identifier = this.ids[i]), delete this.ids[i];
            break;
        }
    return t;
};
de.prototype.onmove = function (e) {
    var t = this;
    return t.onAny("move", e), !1;
};
de.prototype.onend = function (e) {
    var t = this;
    return t.onAny("end", e), !1;
};
de.prototype.oncancel = function (e) {
    var t = this;
    return t.onAny("end", e), !1;
};
de.prototype.onAny = function (e, t) {
    var i = this,
        s,
        n = "processOn" + e.charAt(0).toUpperCase() + e.slice(1);
    t = ao(t);
    var r = function (l, c, a) {
            a.ids.indexOf(c) >= 0 && (a[n](l), (l._found_ = !0));
        },
        o = function (l) {
            (s = i.getIdentifier(l)), zn(i.collections, r.bind(null, l, s)), l._found_ || i.removeIdentifier(s);
        };
    return zn(t, o), !1;
};
de.prototype.destroy = function () {
    var e = this;
    e.unbindDocument(!0),
        (e.ids = {}),
        (e.index = 0),
        e.collections.forEach(function (t) {
            t.destroy();
        }),
        e.off();
};
de.prototype.onDestroyed = function (e, t) {
    var i = this;
    if (i.collections.indexOf(t) < 0) return !1;
    i.collections.splice(i.collections.indexOf(t), 1);
};
const nr = new de(),
    sr = {
        create: function (e) {
            return nr.create(e);
        },
        factory: nr,
    };
let rr = !1;
const Ih = (e) => {
        if (rr) return;
        rr = !0;
        const t = document.getElementById("touch-controls-left"),
            i = sr.create({ zone: t });
        i.on("start", e.onStartMoving), i.on("end", e.onStopMoving), i.on("move", e.onRotateMoving);
        const s = document.getElementById("touch-controls-right"),
            n = sr.create({ zone: s });
        n.on("start", e.onStartAttacking), n.on("end", e.onStopAttacking), n.on("move", e.onRotateAttacking), (t.style.display = "block"), (s.style.display = "block");
    },
    Mh = { enable: Ih };
window.loadedScript = !0;
const Eh = location.hostname !== "localhost" && location.hostname !== "127.0.0.1" && !location.hostname.startsWith("192.168."),
    co = location.hostname === "sandbox-dev.moomoo.io" || location.hostname === "sandbox.moomoo.io",
    Ph = location.hostname === "dev.moomoo.io" || location.hostname === "dev2.moomoo.io",
    Hn = new uc();
let ui, di;
const ki = location.hostname === "localhost" || location.hostname === "127.0.0.1",
    Ch = !1,
    ls = ki || Ch;
co ? ((ui = "https://api-sandbox.moomoo.io"), (di = "moomoo.io")) : Ph ? ((ui = "https://api-dev.moomoo.io"), (di = "moomoo.io")) : ((ui = "https://api.moomoo.io"), (di = "moomoo.io"));
const Ah = !ls,
    qe = new we(di, 443, T.maxPlayers, 5, Ah);
qe.debugLog = !1;
const Me = { animationTime: 0, land: null, lava: null, x: T.volcanoLocationX, y: T.volcanoLocationY };
function Dh() {
    let e = !1;
    return (
        (function (t) {
            (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(
                t
            ) ||
                /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
                    t.substr(0, 4)
                )) &&
                (e = !0);
        })(navigator.userAgent || navigator.vendor || window.opera),
        e
    );
}
const ho = Dh();
let vi = !1,
    Fn = !1;
function Oh() {
    !ps ||
        Fn ||
        ((Fn = !0),
        Eh || ls
            ? window.turnstileToken
                ? gn(window.turnstileToken)
                : window.grecaptcha.ready(() => {
                      window.grecaptcha
                          .execute("6LfahtgjAAAAAF8SkpjyeYMcxMdxIaQeh-VoPATP", { action: "homepage" })
                          .then(function (e) {
                              gn("re:" + e);
                          })
                          .catch(console.error);
                  })
            : gn());
}
let Vn = !1;
function gn(e) {
    qe.start(
        bi,
        function (t, i, s) {
            let r = "wss" + "://" + t;
            e && (r += "?token=" + encodeURIComponent(e)),
                ki && (r = "wss://localhost:3000"),
                ee.connect(
                    r,
                    function (o) {
                        if (Vn) {
                            Vn = !1;
                            return;
                        }
                        Vo(), o ? bn(o) : ((vi = !0), bs());
                    },
                    {
                        A: qh,
                        B: bn,
                        C: If,
                        D: Qf,
                        E: Zf,
                        a: iu,
                        G: Df,
                        H: qf,
                        I: Kf,
                        J: $f,
                        K: _f,
                        L: Wf,
                        M: Xf,
                        N: eu,
                        O: tu,
                        P: Ef,
                        Q: Cf,
                        R: Pf,
                        S: jf,
                        T: Ro,
                        U: Oo,
                        V: To,
                        X: Gf,
                        Y: Yf,
                        Z: ru,
                        g: Zh,
                        1: tf,
                        2: Qh,
                        3: jh,
                        4: ef,
                        5: ff,
                        6: gf,
                        7: af,
                        8: Mf,
                        9: rf,
                        0: su,
                    }
                );
        },
        function (t) {
            console.error("Vultr error:", t),
                alert(
                    `Error:
` + t
                ),
                bn("disconnected");
        },
        ki
    );
}
function cs() {
    return ee.connected;
}
function Rh() {
    const t = prompt("party key", bi);
    t && ((window.onbeforeunload = void 0), (window.location.href = "/?server=" + t));
}
const _h = new dc(T),
    fo = Math.PI,
    Ze = fo * 2;
Math.lerpAngle = function (e, t, i) {
    Math.abs(t - e) > fo && (e > t ? (t += Ze) : (e += Ze));
    const n = t + (e - t) * i;
    return n >= 0 && n <= Ze ? n : n % Ze;
};
CanvasRenderingContext2D.prototype.roundRect = function (e, t, i, s, n) {
    return (
        i < 2 * n && (n = i / 2),
        s < 2 * n && (n = s / 2),
        n < 0 && (n = 0),
        this.beginPath(),
        this.moveTo(e + n, t),
        this.arcTo(e + i, t, e + i, t + s, n),
        this.arcTo(e + i, t + s, e, t + s, n),
        this.arcTo(e, t + s, e, t, n),
        this.arcTo(e, t, e + i, t, n),
        this.closePath(),
        this
    );
};
let hs;
typeof Storage < "u" && (hs = !0);
function Di(e, t) {
    hs && localStorage.setItem(e, t);
}
function Nt(e) {
    return hs ? localStorage.getItem(e) : null;
}
let xi = Nt("moofoll");
function Bh() {
    xi || ((xi = !0), Di("moofoll", 1));
}
let uo,
    $e,
    mt = 1,
    be,
    It,
    yn,
    or = Date.now();
var He;
let Ee;
const ye = [],
    J = [];
let Oe = [];
const et = [],
    Mt = [],
    po = new gc(Hc, Mt, J, ye, ue, R, T, C),
    ar = new yc(ye, wc, J, R, null, T, C);
let E,
    mo,
    y,
    ct = 1,
    wn = 0,
    go = 0,
    yo = 0,
    Re,
    _e,
    lr,
    fs = 0;
const se = T.maxScreenWidth,
    re = T.maxScreenHeight;
let gt,
    yt,
    Jt = !1;
document.getElementById("ad-container");
const Oi = document.getElementById("mainMenu"),
    Un = document.getElementById("enterGame"),
    kn = document.getElementById("promoImg");
document.getElementById("partyButton");
const vn = document.getElementById("joinPartyButton"),
    Ln = document.getElementById("settingsButton"),
    cr = Ln.getElementsByTagName("span")[0],
    hr = document.getElementById("allianceButton"),
    fr = document.getElementById("storeButton"),
    ur = document.getElementById("chatButton"),
    xt = document.getElementById("gameCanvas"),
    M = xt.getContext("2d");
var zh = document.getElementById("serverBrowser");
const Nn = document.getElementById("nativeResolution"),
    xn = document.getElementById("showPing");
document.getElementById("playMusic");
const Qt = document.getElementById("pingDisplay"),
    dr = document.getElementById("shutdownDisplay"),
    Zt = document.getElementById("menuCardHolder"),
    qt = document.getElementById("guideCard"),
    Et = document.getElementById("loadingText"),
    us = document.getElementById("gameUI"),
    pr = document.getElementById("actionBar"),
    Hh = document.getElementById("scoreDisplay"),
    Fh = document.getElementById("foodDisplay"),
    Vh = document.getElementById("woodDisplay"),
    Uh = document.getElementById("stoneDisplay"),
    Lh = document.getElementById("killCounter"),
    mr = document.getElementById("leaderboardData"),
    jt = document.getElementById("nameInput"),
    Le = document.getElementById("itemInfoHolder"),
    gr = document.getElementById("ageText"),
    yr = document.getElementById("ageBarBody"),
    ht = document.getElementById("upgradeHolder"),
    ri = document.getElementById("upgradeCounter"),
    Te = document.getElementById("allianceMenu"),
    oi = document.getElementById("allianceHolder"),
    ai = document.getElementById("allianceManager"),
    me = document.getElementById("mapDisplay"),
    Wt = document.getElementById("diedText"),
    Nh = document.getElementById("skinColorHolder"),
    ce = me.getContext("2d");
me.width = 300;
me.height = 300;
const We = document.getElementById("storeMenu"),
    wr = document.getElementById("storeHolder"),
    ft = document.getElementById("noticationDisplay"),
    Xt = $r.hats,
    Gt = $r.accessories;
var ue = new mc(kc, et, C, T);
const ei = "#525252",
    kr = "#3d3f42",
    Xe = 5.5;
T.DAY_INTERVAL / 24;
T.DAY_INTERVAL / 2;
function qh(e) {
    Oe = e.teams;
}
let ds = !0;
var ps = !1;
(!ls || ki) && (ps = !0);
window.onblur = function () {
    ds = !1;
};
window.onfocus = function () {
    (ds = !0), E && E.alive && xs();
};
window.captchaCallbackHook = function () {
    ps = !0;
};
window.captchaCallbackComplete && window.captchaCallbackHook();
window.addEventListener("keydown", function (e) {
    e.keyCode == 32 && e.target == document.body && e.preventDefault();
});
xt.oncontextmenu = function () {
    return !1;
};
["touch-controls-left", "touch-controls-right", "touch-controls-fullscreen", "storeMenu"].forEach((e) => {
    document.getElementById(e) &&
        (document.getElementById(e).oncontextmenu = function (t) {
            t.preventDefault();
        });
});
function bn(e) {
    (vi = !1), ee.close(), ms(e);
}
function ms(e, t) {
    (Oi.style.display = "block"),
        (us.style.display = "none"),
        (Zt.style.display = "none"),
        (Wt.style.display = "none"),
        (Et.style.display = "block"),
        (Et.innerHTML = e + (t ? "<a href='javascript:window.location.href=window.location.href' class='ytLink'>reload</a>" : ""));
}
function Wh() {
    (Qt.hidden = !0), (Et.style.display = "none"), (Oi.style.display = "block"), (Zt.style.display = "block"), uf(), Xh(), Af(), (Et.style.display = "none"), (Zt.style.display = "block");
    let e = Nt("moo_name") || "";
    !e.length && FRVR.profile && ((e = FRVR.profile.name()), e && (e += Math.floor(Math.random() * 90) + 9)), (jt.value = e || "");
}
function Xh() {
    (Un.onclick = C.checkTrusted(function () {
        ms("Connecting..."), cs() ? bs() : Oh();
    })),
        C.hookTouchEvents(Un),
        kn &&
            ((kn.onclick = C.checkTrusted(function () {
                Lo("https://krunker.io/?play=SquidGame_KB");
            })),
            C.hookTouchEvents(kn)),
        vn &&
            ((vn.onclick = C.checkTrusted(function () {
                setTimeout(function () {
                    Rh();
                }, 10);
            })),
            C.hookTouchEvents(vn)),
        (Ln.onclick = C.checkTrusted(function () {
            pf();
        })),
        C.hookTouchEvents(Ln),
        (hr.onclick = C.checkTrusted(function () {
            nf();
        })),
        C.hookTouchEvents(hr),
        (fr.onclick = C.checkTrusted(function () {
            hf();
        })),
        C.hookTouchEvents(fr),
        (ur.onclick = C.checkTrusted(function () {
            Mo();
        })),
        C.hookTouchEvents(ur),
        (me.onclick = C.checkTrusted(function () {
            Ao();
        })),
        C.hookTouchEvents(me);
}
let bi;
const Gh = {
    view: () => {
        if (!qe.servers) return;
        let e = 0;
        const t = Object.keys(qe.servers).map((i) => {
            const s = qe.regionInfo[i].name;
            let n = 0;
            const r = qe.servers[i].map((o) => {
                var h;
                n += o.playerCount;
                const l = o.selected;
                let c = s + " " + o.name + " [" + Math.min(o.playerCount, o.playerCapacity) + "/" + o.playerCapacity + "]";
                const a = o.name,
                    u = l ? "selected" : "";
                o.ping && ((h = o.pings) == null ? void 0 : h.length) >= 2 ? (c += ` [${Math.floor(o.ping)}ms]`) : l || (c += " [?]");
                let p = { value: i + ":" + a };
                return u && ((bi = i + ":" + a), (p.selected = !0)), Ne("option", p, c);
            });
            return (e += n), [Ne("option[disabled]", `${s} - ${n} players`), r, Ne("option[disabled]")];
        });
        return Ne(
            "select",
            {
                value: bi,
                onfocus: () => {
                    window.blockRedraw = !0;
                },
                onblur: () => {
                    window.blockRedraw = !1;
                },
                onchange: Kh,
            },
            [t, Ne("option[disabled]", `All Servers - ${e} players`)]
        );
    },
};
Ne.mount(zh, Gh);
var qn, Wn;
location.hostname == "sandbox.moomoo.io" ? ((qn = "Back to MooMoo"), (Wn = "//moomoo.io/")) : ((qn = "Try the sandbox"), (Wn = "//sandbox.moomoo.io/"));
document.getElementById("altServer").innerHTML = "<a href='" + Wn + "'>" + qn + "<i class='material-icons' style='font-size:10px;vertical-align:middle'>arrow_forward_ios</i></a>";
const Yh = `${ui}/servers?v=1.22`,
    wo = async () =>
        fetch(Yh)
            .then((e) => e.json())
            .then(async (e) => qe.processServers(e))
            .catch((e) => {
                console.error("Failed to load server data with status code:", e);
            }),
    $h = () =>
        wo()
            .then(Wh)
            .catch((e) => {
                console.error("Failed to load.");
            });
window.frvrSdkInitPromise.then(() => window.FRVR.bootstrapper.complete()).then(() => $h());
const Kh = (e) => {
    if (((window.blockRedraw = !1), FRVR.channelCharacteristics.allowNavigation)) {
        const [t, i] = e.target.value.split(":");
        qe.switchServer(t, i);
    } else vi && ((vi = !1), (Fn = !1), (Vn = !0), (Ei = !0), ee.close());
};
document.getElementById("pre-content-container");
function Jh() {
    FRVR.ads.show("interstitial", bs);
}
window.showPreAd = Jh;
function Se(e, t, i) {
    if (E && e) {
        if ((C.removeAllChildren(Le), Le.classList.add("visible"), C.generateElement({ id: "itemInfoName", text: C.capitalizeFirst(e.name), parent: Le }), C.generateElement({ id: "itemInfoDesc", text: e.desc, parent: Le }), !i))
            if (t) C.generateElement({ class: "itemInfoReq", text: e.type ? "secondary" : "primary", parent: Le });
            else {
                for (let n = 0; n < e.req.length; n += 2) C.generateElement({ class: "itemInfoReq", html: e.req[n] + "<span class='itemInfoReqVal'> x" + e.req[n + 1] + "</span>", parent: Le });
                const s = co ? e.group.sandboxLimit || Math.max(e.group.limit * 3, 99) : e.group.limit;
                e.group.limit && C.generateElement({ class: "itemInfoLmt", text: (E.itemCounts[e.group.id] || 0) + "/" + s, parent: Le });
            }
    } else Le.classList.remove("visible");
}
let Pt = [],
    wt = [];
function Qh(e, t) {
    Pt.push({ sid: e, name: t }), gs();
}
function gs() {
    if (Pt[0]) {
        const e = Pt[0];
        C.removeAllChildren(ft),
            (ft.style.display = "block"),
            C.generateElement({ class: "notificationText", text: e.name, parent: ft }),
            C.generateElement({
                class: "notifButton",
                html: "<i class='material-icons' style='font-size:28px;color:#cc5151;'>&#xE14C;</i>",
                parent: ft,
                onclick: function () {
                    Gn(0);
                },
                hookTouch: !0,
            }),
            C.generateElement({
                class: "notifButton",
                html: "<i class='material-icons' style='font-size:28px;color:#8ecc51;'>&#xE876;</i>",
                parent: ft,
                onclick: function () {
                    Gn(1);
                },
                hookTouch: !0,
            });
    } else ft.style.display = "none";
}
function Zh(e) {
    Oe.push(e), Te.style.display == "block" && ti();
}
function jh(e, t) {
    E && ((E.team = e), (E.isOwner = t), Te.style.display == "block" && ti());
}
function ef(e) {
    (wt = e), Te.style.display == "block" && ti();
}
function tf(e) {
    for (let t = Oe.length - 1; t >= 0; t--) Oe[t].sid == e && Oe.splice(t, 1);
    Te.style.display == "block" && ti();
}
function nf() {
    xs(), Te.style.display != "block" ? ti() : Xn();
}
function Xn() {
    Te.style.display == "block" && (Te.style.display = "none");
}
function ti() {
    if (E && E.alive) {
        if ((Ri(), (We.style.display = "none"), (Te.style.display = "block"), C.removeAllChildren(oi), E.team))
            for (var e = 0; e < wt.length; e += 2)
                (function (t) {
                    const i = C.generateElement({ class: "allianceItem", style: "color:" + (wt[t] == E.sid ? "#fff" : "rgba(255,255,255,0.6)"), text: wt[t + 1], parent: oi });
                    E.isOwner &&
                        wt[t] != E.sid &&
                        C.generateElement({
                            class: "joinAlBtn",
                            text: "Kick",
                            onclick: function () {
                                ko(wt[t]);
                            },
                            hookTouch: !0,
                            parent: i,
                        });
                })(e);
        else if (Oe.length)
            for (var e = 0; e < Oe.length; ++e)
                (function (i) {
                    const s = C.generateElement({ class: "allianceItem", style: "color:" + (Oe[i].sid == E.team ? "#fff" : "rgba(255,255,255,0.6)"), text: Oe[i].sid, parent: oi });
                    C.generateElement({
                        class: "joinAlBtn",
                        text: "Join",
                        onclick: function () {
                            vo(i);
                        },
                        hookTouch: !0,
                        parent: s,
                    });
                })(e);
        else C.generateElement({ class: "allianceItem", text: "No Tribes Yet", parent: oi });
        C.removeAllChildren(ai),
            E.team
                ? C.generateElement({
                      class: "allianceButtonM",
                      style: "width: 360px",
                      text: E.isOwner ? "Delete Tribe" : "Leave Tribe",
                      onclick: function () {
                          xo();
                      },
                      hookTouch: !0,
                      parent: ai,
                  })
                : (C.generateElement({
                      tag: "input",
                      type: "text",
                      id: "allianceInput",
                      maxLength: 7,
                      placeholder: "unique name",
                      onchange: (t) => {
                          t.target.value = (t.target.value || "").slice(0, 7);
                      },
                      onkeypress: (t) => {
                          if (t.key === "Enter") return t.preventDefault(), Yn(), !1;
                      },
                      parent: ai,
                  }),
                  C.generateElement({
                      tag: "div",
                      class: "allianceButtonM",
                      style: "width: 140px;",
                      text: "Create",
                      onclick: function () {
                          Yn();
                      },
                      hookTouch: !0,
                      parent: ai,
                  }));
    }
}
function Gn(e) {
    ee.send("P", Pt[0].sid, e), Pt.splice(0, 1), gs();
}
function ko(e) {
    ee.send("Q", e);
}
function vo(e) {
    ee.send("b", Oe[e].sid);
}
function Yn() {
    ee.send("L", document.getElementById("allianceInput").value);
}
function xo() {
    (Pt = []), gs(), ee.send("N");
}
let pi, Ht, je;
const bt = [];
let Je;
function sf() {
    (this.init = function (e, t) {
        (this.scale = 0), (this.x = e), (this.y = t), (this.active = !0);
    }),
        (this.update = function (e, t) {
            this.active &&
                ((this.scale += 0.05 * t),
                this.scale >= T.mapPingScale
                    ? (this.active = !1)
                    : ((e.globalAlpha = 1 - Math.max(0, this.scale / T.mapPingScale)), e.beginPath(), e.arc((this.x / T.mapScale) * me.width, (this.y / T.mapScale) * me.width, this.scale, 0, 2 * Math.PI), e.stroke()));
        });
}
function rf(e, t) {
    for (let i = 0; i < bt.length; ++i)
        if (!bt[i].active) {
            Je = bt[i];
            break;
        }
    Je || ((Je = new sf()), bt.push(Je)), Je.init(e, t);
}
function of() {
    je || (je = {}), (je.x = E.x), (je.y = E.y);
}
function af(e) {
    Ht = e;
}
function lf(e) {
    if (E && E.alive) {
        ce.clearRect(0, 0, me.width, me.height), (ce.strokeStyle = "#fff"), (ce.lineWidth = 4);
        for (var t = 0; t < bt.length; ++t) (Je = bt[t]), Je.update(ce, e);
        if (((ce.globalAlpha = 1), (ce.fillStyle = "#fff"), Q((E.x / T.mapScale) * me.width, (E.y / T.mapScale) * me.height, 7, ce, !0), (ce.fillStyle = "rgba(255,255,255,0.35)"), E.team && Ht))
            for (var t = 0; t < Ht.length; ) Q((Ht[t] / T.mapScale) * me.width, (Ht[t + 1] / T.mapScale) * me.height, 7, ce, !0), (t += 2);
        pi && ((ce.fillStyle = "#fc5553"), (ce.font = "34px Hammersmith One"), (ce.textBaseline = "middle"), (ce.textAlign = "center"), ce.fillText("x", (pi.x / T.mapScale) * me.width, (pi.y / T.mapScale) * me.height)),
            je && ((ce.fillStyle = "#fff"), (ce.font = "34px Hammersmith One"), (ce.textBaseline = "middle"), (ce.textAlign = "center"), ce.fillText("x", (je.x / T.mapScale) * me.width, (je.y / T.mapScale) * me.height));
    }
}
let $n = 0;
function cf(e) {
    $n != e && (($n = e), ys());
}
function hf() {
    We.style.display != "block" ? ((We.style.display = "block"), (Te.style.display = "none"), Ri(), ys()) : Kn();
}
function Kn() {
    We.style.display == "block" && ((We.style.display = "none"), Se());
}
function ff(e, t, i) {
    i ? (e ? (E.tailIndex = t) : (E.tails[t] = 1)) : e ? (E.skinIndex = t) : (E.skins[t] = 1), We.style.display == "block" && ys();
}
function ys() {
    if (E) {
        C.removeAllChildren(wr);
        const e = $n,
            t = e ? Gt : Xt;
        for (let i = 0; i < t.length; ++i)
            t[i].dontSell ||
                (function (s) {
                    const n = C.generateElement({
                        id: "storeDisplay" + s,
                        class: "storeItem",
                        onmouseout: function () {
                            Se();
                        },
                        onmouseover: function () {
                            Se(t[s], !1, !0);
                        },
                        parent: wr,
                    });
                    C.hookTouchEvents(n, !0),
                        C.generateElement({ tag: "img", class: "hatPreview", src: "./img/" + (e ? "accessories/access_" : "hats/hat_") + t[s].id + (t[s].topSprite ? "_p" : "") + ".png", parent: n }),
                        C.generateElement({ tag: "span", text: t[s].name, parent: n }),
                        (e ? !E.tails[t[s].id] : !E.skins[t[s].id])
                            ? (C.generateElement({
                                  class: "joinAlBtn",
                                  style: "margin-top: 5px",
                                  text: "Buy",
                                  onclick: function () {
                                      bo(t[s].id, e);
                                  },
                                  hookTouch: !0,
                                  parent: n,
                              }),
                              C.generateElement({ tag: "span", class: "itemPrice", text: t[s].price, parent: n }))
                            : (e ? E.tailIndex : E.skinIndex) == t[s].id
                            ? C.generateElement({
                                  class: "joinAlBtn",
                                  style: "margin-top: 5px",
                                  text: "Unequip",
                                  onclick: function () {
                                      Jn(0, e);
                                  },
                                  hookTouch: !0,
                                  parent: n,
                              })
                            : C.generateElement({
                                  class: "joinAlBtn",
                                  style: "margin-top: 5px",
                                  text: "Equip",
                                  onclick: function () {
                                      Jn(t[s].id, e);
                                  },
                                  hookTouch: !0,
                                  parent: n,
                              });
                })(i);
    }
}
function Jn(e, t) {
    ee.send("c", 0, e, t);
}
function bo(e, t) {
    ee.send("c", 1, e, t);
}
function So() {
    (We.style.display = "none"), (Te.style.display = "none"), Ri();
}
function uf() {
    const e = Nt("native_resolution");
    Sn(e ? e == "true" : typeof cordova < "u"),
        ($e = Nt("show_ping") == "true"),
        (Qt.hidden = !$e || !Jt),
        Nt("moo_moosic"),
        setInterval(function () {
            window.cordova && (document.getElementById("downloadButtonContainer").classList.add("cordova"), document.getElementById("mobileDownloadButtonContainer").classList.add("cordova"));
        }, 1e3),
        Io(),
        C.removeAllChildren(pr);
    for (var t = 0; t < R.weapons.length + R.list.length; ++t)
        (function (i) {
            C.generateElement({
                id: "actionBarItem" + i,
                class: "actionBarItem",
                style: "display:none",
                onmouseout: function () {
                    Se();
                },
                parent: pr,
            });
        })(t);
    for (var t = 0; t < R.list.length + R.weapons.length; ++t)
        (function (s) {
            const n = document.createElement("canvas");
            n.width = n.height = 66;
            const r = n.getContext("2d");
            if ((r.translate(n.width / 2, n.height / 2), (r.imageSmoothingEnabled = !1), (r.webkitImageSmoothingEnabled = !1), (r.mozImageSmoothingEnabled = !1), R.weapons[s])) {
                r.rotate(Math.PI / 4 + Math.PI);
                var o = new Image();
                (jn[R.weapons[s].src] = o),
                    (o.onload = function () {
                        this.isLoaded = !0;
                        const c = 1 / (this.height / this.width),
                            a = R.weapons[s].iPad || 1;
                        r.drawImage(this, -(n.width * a * T.iconPad * c) / 2, -(n.height * a * T.iconPad) / 2, n.width * a * c * T.iconPad, n.height * a * T.iconPad),
                            (r.fillStyle = "rgba(0, 0, 70, 0.1)"),
                            (r.globalCompositeOperation = "source-atop"),
                            r.fillRect(-n.width / 2, -n.height / 2, n.width, n.height),
                            (document.getElementById("actionBarItem" + s).style.backgroundImage = "url(" + n.toDataURL() + ")");
                    }),
                    (o.src = "./img/weapons/" + R.weapons[s].src + ".png");
                var l = document.getElementById("actionBarItem" + s);
                (l.onmouseover = C.checkTrusted(function () {
                    Se(R.weapons[s], !0);
                })),
                    (l.onclick = C.checkTrusted(function () {
                        Yt(s, !0);
                    })),
                    C.hookTouchEvents(l);
            } else {
                var o = Ss(R.list[s - R.weapons.length], !0);
                const a = Math.min(n.width - T.iconPadding, o.width);
                (r.globalAlpha = 1),
                    r.drawImage(o, -a / 2, -a / 2, a, a),
                    (r.fillStyle = "rgba(0, 0, 70, 0.1)"),
                    (r.globalCompositeOperation = "source-atop"),
                    r.fillRect(-a / 2, -a / 2, a, a),
                    (document.getElementById("actionBarItem" + s).style.backgroundImage = "url(" + n.toDataURL() + ")");
                var l = document.getElementById("actionBarItem" + s);
                (l.onmouseover = C.checkTrusted(function () {
                    Se(R.list[s - R.weapons.length]);
                })),
                    (l.onclick = C.checkTrusted(function () {
                        Yt(s - R.weapons.length);
                    })),
                    C.hookTouchEvents(l);
            }
        })(t);
    (jt.onchange = (i) => {
        i.target.value = (i.target.value || "").slice(0, 15);
    }),
        (jt.onkeypress = (i) => {
            if (i.key === "Enter") return i.preventDefault(), Un.onclick(i), !1;
        }),
        (Nn.checked = uo),
        (Nn.onchange = C.checkTrusted(function (i) {
            Sn(i.target.checked);
        })),
        (xn.checked = $e),
        (xn.onchange = C.checkTrusted(function (i) {
            ($e = xn.checked), (Qt.hidden = !$e), Di("show_ping", $e ? "true" : "false");
        }));
}
function To(e, t) {
    e && (t ? (E.weapons = e) : (E.items = e));
    for (var i = 0; i < R.list.length; ++i) {
        const s = R.weapons.length + i;
        document.getElementById("actionBarItem" + s).style.display = E.items.indexOf(R.list[i].id) >= 0 ? "inline-block" : "none";
    }
    for (var i = 0; i < R.weapons.length; ++i) document.getElementById("actionBarItem" + i).style.display = E.weapons[R.weapons[i].type] == R.weapons[i].id ? "inline-block" : "none";
}
function Sn(e) {
    (uo = e), (mt = (e && window.devicePixelRatio) || 1), (Nn.checked = e), Di("native_resolution", e.toString()), ws();
}
function df() {
    ii ? qt.classList.add("touch") : qt.classList.remove("touch");
}
function pf() {
    qt.classList.contains("showing") ? (qt.classList.remove("showing"), (cr.innerText = "Settings")) : (qt.classList.add("showing"), (cr.innerText = "Close"));
}
function Io() {
    let e = "";
    for (let t = 0; t < T.skinColors.length; ++t)
        t == fs
            ? (e += "<div class='skinColorItem activeSkin' style='background-color:" + T.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>")
            : (e += "<div class='skinColorItem' style='background-color:" + T.skinColors[t] + "' onclick='selectSkinColor(" + t + ")'></div>");
    Nh.innerHTML = e;
}
function mf(e) {
    (fs = e), Io();
}
const Ft = document.getElementById("chatBox"),
    Si = document.getElementById("chatHolder");
function Mo() {
    ii
        ? setTimeout(function () {
              const e = prompt("chat message");
              e && vr(e);
          }, 1)
        : Si.style.display == "block"
        ? (Ft.value && vr(Ft.value), Ri())
        : ((We.style.display = "none"), (Te.style.display = "none"), (Si.style.display = "block"), Ft.focus(), xs()),
        (Ft.value = "");
}
function vr(e) {
    ee.send("6", e.slice(0, 30));
}
function Ri() {
    (Ft.value = ""), (Si.style.display = "none");
}
function gf(e, t) {
    const i = _i(e);
    i && ((i.chatMessage = t), (i.chatCountdown = T.chatCountdown));
}
window.addEventListener("resize", C.checkTrusted(ws));
function ws() {
    (gt = window.innerWidth), (yt = window.innerHeight);
    const e = Math.max(gt / se, yt / re) * mt;
    (xt.width = gt * mt), (xt.height = yt * mt), (xt.style.width = gt + "px"), (xt.style.height = yt + "px"), M.setTransform(e, 0, 0, e, (gt * mt - se * e) / 2, (yt * mt - re * e) / 2);
}
ws();
let ii;
tt(!1);
function tt(e) {
    (ii = e), df();
}
window.setUsingTouch = tt;
let yf = document.getElementById("leaderboardButton"),
    Eo = document.getElementById("leaderboard");
yf.addEventListener("touchstart", () => {
    Eo.classList.add("is-showing");
});
const ks = () => {
    Eo.classList.remove("is-showing");
};
document.body.addEventListener("touchend", ks);
document.body.addEventListener("touchleave", ks);
document.body.addEventListener("touchcancel", ks);
if (!ho) {
    let t = function (n) {
            n.preventDefault(), n.stopPropagation(), tt(!1), (go = n.clientX), (yo = n.clientY);
        },
        i = function (n) {
            tt(!1), Ee != 1 && ((Ee = 1), it());
        },
        s = function (n) {
            tt(!1), Ee != 0 && ((Ee = 0), it());
        };
    var gameInput = t,
        mouseDown = i,
        mouseUp = s;
    const e = document.getElementById("touch-controls-fullscreen");
    (e.style.display = "block"), e.addEventListener("mousemove", t, !1), e.addEventListener("mousedown", i, !1), e.addEventListener("mouseup", s, !1);
}
let Qn = !1,
    Po;
function wf() {
    let e = 0,
        t = 0,
        i;
    if (ii) {
        if (!Qn) return;
        i = Po;
    }
    for (const s in Ii) {
        const n = Ii[s];
        (e += !!He[s] * n[0]), (t += !!He[s] * n[1]);
    }
    if (((e != 0 || t != 0) && (i = Math.atan2(t, e)), i !== void 0)) return C.fixTo(i, 2);
}
let Ti;
function vs() {
    return E ? (!E.lockDir && !ii && (Ti = Math.atan2(yo - yt / 2, go - gt / 2)), C.fixTo(Ti || 0, 2)) : 0;
}
var He = {},
    Ii = { 87: [0, -1], 38: [0, -1], 83: [0, 1], 40: [0, 1], 65: [-1, 0], 37: [-1, 0], 68: [1, 0], 39: [1, 0] };
function xs() {
    (He = {}), ee.send("e");
}
function Co() {
    return Te.style.display != "block" && Si.style.display != "block";
}
function kf(e) {
    const t = e.which || e.keyCode || 0;
    t == 27
        ? So()
        : E &&
          E.alive &&
          Co() &&
          (He[t] ||
              ((He[t] = 1),
              t == 69
                  ? bf()
                  : t == 67
                  ? of()
                  : t == 88
                  ? xf()
                  : E.weapons[t - 49] != null
                  ? Yt(E.weapons[t - 49], !0)
                  : E.items[t - 49 - E.weapons.length] != null
                  ? Yt(E.items[t - 49 - E.weapons.length])
                  : t == 81
                  ? Yt(E.items[0])
                  : t == 82
                  ? Ao()
                  : Ii[t]
                  ? Mi()
                  : t == 32 && ((Ee = 1), it())));
}
window.addEventListener("keydown", C.checkTrusted(kf));
function vf(e) {
    if (E && E.alive) {
        const t = e.which || e.keyCode || 0;
        if (t == 13) {
            if (Te.style.display === "block") return;
            Mo();
        } else Co() && He[t] && ((He[t] = 0), Ii[t] ? Mi() : t == 32 && ((Ee = 0), it()));
    }
}
window.addEventListener("keyup", C.checkTrusted(vf));
function it() {
    E && E.alive && ee.send("d", Ee, E.buildIndex >= 0 ? vs() : null);
}
let Tn;
function Mi() {
    const e = wf();
    (Tn == null || e == null || Math.abs(e - Tn) > 0.3) && (ee.send("a", e), (Tn = e));
}
function xf() {
    (E.lockDir = E.lockDir ? 0 : 1), ee.send("K", 0);
}
function Ao() {
    ee.send("S", 1);
}
function bf() {
    ee.send("K", 1);
}
function Yt(e, t) {
    ee.send("G", e, t);
}
window.io = ee;
function bs() {
    (Qt.hidden = !$e),
        (window.onbeforeunload = function (e) {
            return "Are you sure?";
        }),
        window.FRVR && window.FRVR.tracker.levelStart("game_start"),
        Di("moo_name", jt.value),
        !Jt && cs() && ((Jt = !0), _h.stop("menu"), ms("Loading..."), ee.send("M", { name: jt.value, moofoll: xi, skin: fs })),
        Sf();
}
function Sf() {
    var e = document.getElementById("ot-sdk-btn-floating");
    e && (e.style.display = "none");
}
function Tf() {
    var e = document.getElementById("ot-sdk-btn-floating");
    e && (e.style.display = "block");
}
let Ei = !0,
    In = !1;
function If(e) {
    (Et.style.display = "none"),
        (Zt.style.display = "block"),
        (Oi.style.display = "none"),
        (He = {}),
        (mo = e),
        (Ee = 0),
        (Jt = !0),
        Ei && ((Ei = !1), (et.length = 0)),
        ho &&
            Mh.enable({
                onStartMoving: () => {
                    Kn(), Xn(), tt(!0), (Qn = !0);
                },
                onStopMoving: () => {
                    (Qn = !1), Mi();
                },
                onRotateMoving: (t, i) => {
                    i.force < 0.25 || ((Po = -i.angle.radian), Mi(), In || (Ti = -i.angle.radian));
                },
                onStartAttacking: () => {
                    Kn(), Xn(), tt(!0), (In = !0), E.buildIndex < 0 && ((Ee = 1), it());
                },
                onStopAttacking: () => {
                    E.buildIndex >= 0 && ((Ee = 1), it()), (Ee = 0), it(), (In = !1);
                },
                onRotateAttacking: (t, i) => {
                    i.force < 0.25 || (Ti = -i.angle.radian);
                },
            });
}
function Mf(e, t, i, s) {
    s === -1 ? Hn.showText(e, t, 50, 0.18, 500, i, "#ee5551") : Hn.showText(e, t, 50, 0.18, 500, Math.abs(i), i >= 0 ? "#fff" : "#8ecc51");
}
let mi = 99999;
function Ef() {
    (Jt = !1), Tf();
    try {
        factorem.refreshAds([2], !0);
    } catch {}
    (us.style.display = "none"),
        So(),
        (pi = { x: E.x, y: E.y }),
        (Et.style.display = "none"),
        (Wt.style.display = "block"),
        (Wt.style.fontSize = "0px"),
        (mi = 0),
        setTimeout(function () {
            (Zt.style.display = "block"), (Oi.style.display = "block"), (Wt.style.display = "none");
        }, T.deathFadeout),
        wo();
}
function Pf(e) {
    E && ue.removeAllItems(e);
}
function Cf(e) {
    ue.disableBySid(e);
}
function Do() {
    (Hh.innerText = E.points), (Fh.innerText = E.food), (Vh.innerText = E.wood), (Uh.innerText = E.stone), (Lh.innerText = E.kills);
}
const Vt = {},
    Mn = ["crown", "skull"];
function Af() {
    for (let e = 0; e < Mn.length; ++e) {
        const t = new Image();
        (t.onload = function () {
            this.isLoaded = !0;
        }),
            (t.src = "./img/icons/" + Mn[e] + ".png"),
            (Vt[Mn[e]] = t);
    }
}
const ut = [];
function Oo(e, t) {
    if (((E.upgradePoints = e), (E.upgrAge = t), e > 0)) {
        (ut.length = 0), C.removeAllChildren(ht);
        for (var i = 0; i < R.weapons.length; ++i)
            if (R.weapons[i].age == t && (R.weapons[i].pre == null || E.weapons.indexOf(R.weapons[i].pre) >= 0)) {
                var s = C.generateElement({
                    id: "upgradeItem" + i,
                    class: "actionBarItem",
                    onmouseout: function () {
                        Se();
                    },
                    parent: ht,
                });
                (s.style.backgroundImage = document.getElementById("actionBarItem" + i).style.backgroundImage), ut.push(i);
            }
        for (var i = 0; i < R.list.length; ++i)
            if (R.list[i].age == t && (R.list[i].pre == null || E.items.indexOf(R.list[i].pre) >= 0)) {
                const r = R.weapons.length + i;
                var s = C.generateElement({
                    id: "upgradeItem" + r,
                    class: "actionBarItem",
                    onmouseout: function () {
                        Se();
                    },
                    parent: ht,
                });
                (s.style.backgroundImage = document.getElementById("actionBarItem" + r).style.backgroundImage), ut.push(r);
            }
        for (var i = 0; i < ut.length; i++)
            (function (r) {
                const o = document.getElementById("upgradeItem" + r);
                (o.onmouseover = function () {
                    R.weapons[r] ? Se(R.weapons[r], !0) : Se(R.list[r - R.weapons.length]);
                }),
                    (o.onclick = C.checkTrusted(function () {
                        ee.send("H", r);
                    })),
                    C.hookTouchEvents(o);
            })(ut[i]);
        ut.length ? ((ht.style.display = "block"), (ri.style.display = "block"), (ri.innerHTML = "SELECT ITEMS (" + e + ")")) : ((ht.style.display = "none"), (ri.style.display = "none"), Se());
    } else (ht.style.display = "none"), (ri.style.display = "none"), Se();
}
function Ro(e, t, i) {
    e != null && (E.XP = e), t != null && (E.maxXP = t), i != null && (E.age = i), i == T.maxAge ? ((gr.innerHTML = "MAX AGE"), (yr.style.width = "100%")) : ((gr.innerHTML = "AGE " + E.age), (yr.style.width = (E.XP / E.maxXP) * 100 + "%"));
}
function Df(e) {
    C.removeAllChildren(mr);
    let t = 1;
    for (let i = 0; i < e.length; i += 3)
        (function (s) {
            C.generateElement({
                class: "leaderHolder",
                parent: mr,
                children: [
                    C.generateElement({ class: "leaderboardItem", style: "color:" + (e[s] == mo ? "#fff" : "rgba(255,255,255,0.6)"), text: t + ". " + (e[s + 1] != "" ? e[s + 1] : "unknown") }),
                    C.generateElement({ class: "leaderScore", text: C.kFormat(e[s + 2]) || "0" }),
                ],
            });
        })(i),
            t++;
}
let xr = null;
function Of() {
    {
        if (E && (!yn || It - yn >= 1e3 / T.clientSendRate)) {
            yn = It;
            const a = vs();
            xr !== a && ((xr = a), ee.send("D", a));
        }
        if ((mi < 120 && ((mi += 0.1 * be), (Wt.style.fontSize = Math.min(Math.round(mi), 120) + "px")), E)) {
            const a = C.getDistance(Re, _e, E.x, E.y),
                u = C.getDirection(E.x, E.y, Re, _e),
                p = Math.min(a * 0.01 * be, a);
            a > 0.05 ? ((Re += p * Math.cos(u)), (_e += p * Math.sin(u))) : ((Re = E.x), (_e = E.y));
        } else (Re = T.mapScale / 2), (_e = T.mapScale / 2);
        const o = It - 1e3 / T.serverUpdateRate;
        for (var e, t = 0; t < J.length + ye.length; ++t)
            if (((y = J[t] || ye[t - J.length]), y && y.visible))
                if (y.forcePos) (y.x = y.x2), (y.y = y.y2), (y.dir = y.d2);
                else {
                    const a = y.t2 - y.t1,
                        p = (o - y.t1) / a,
                        h = 170;
                    y.dt += be;
                    const m = Math.min(1.7, y.dt / h);
                    var e = y.x2 - y.x1;
                    (y.x = y.x1 + e * m), (e = y.y2 - y.y1), (y.y = y.y1 + e * m), (y.dir = Math.lerpAngle(y.d2, y.d1, Math.min(1.2, p)));
                }
        const l = Re - se / 2,
            c = _e - re / 2;
        T.snowBiomeTop - c <= 0 && T.mapScale - T.snowBiomeTop - c >= re
            ? ((M.fillStyle = "#b6db66"), M.fillRect(0, 0, se, re))
            : T.mapScale - T.snowBiomeTop - c <= 0
            ? ((M.fillStyle = "#dbc666"), M.fillRect(0, 0, se, re))
            : T.snowBiomeTop - c >= re
            ? ((M.fillStyle = "#fff"), M.fillRect(0, 0, se, re))
            : T.snowBiomeTop - c >= 0
            ? ((M.fillStyle = "#fff"), M.fillRect(0, 0, se, T.snowBiomeTop - c), (M.fillStyle = "#b6db66"), M.fillRect(0, T.snowBiomeTop - c, se, re - (T.snowBiomeTop - c)))
            : ((M.fillStyle = "#b6db66"), M.fillRect(0, 0, se, T.mapScale - T.snowBiomeTop - c), (M.fillStyle = "#dbc666"), M.fillRect(0, T.mapScale - T.snowBiomeTop - c, se, re - (T.mapScale - T.snowBiomeTop - c))),
            Ei ||
                ((ct += wn * T.waveSpeed * be),
                ct >= T.waveMax ? ((ct = T.waveMax), (wn = -1)) : ct <= 1 && (ct = wn = 1),
                (M.globalAlpha = 1),
                (M.fillStyle = "#dbc666"),
                Tr(l, c, M, T.riverPadding),
                (M.fillStyle = "#91b2db"),
                Tr(l, c, M, (ct - 1) * 250)),
            (M.lineWidth = 4),
            (M.strokeStyle = "#000"),
            (M.globalAlpha = 0.06),
            M.beginPath();
        for (var i = -Re; i < se; i += re / 18) i > 0 && (M.moveTo(i, 0), M.lineTo(i, re));
        for (let a = -_e; a < re; a += re / 18) i > 0 && (M.moveTo(0, a), M.lineTo(se, a));
        M.stroke(), (M.globalAlpha = 1), (M.strokeStyle = ei), zt(-1, l, c), (M.globalAlpha = 1), (M.lineWidth = Xe), br(0, l, c), Ir(l, c, 0), (M.globalAlpha = 1);
        for (var t = 0; t < ye.length; ++t) (y = ye[t]), y.active && y.visible && (y.animate(be), M.save(), M.translate(y.x - l, y.y - c), M.rotate(y.dir + y.dirPlus - Math.PI / 2), Jf(y, M), M.restore());
        if ((zt(0, l, c), br(1, l, c), zt(1, l, c), Ir(l, c, 1), zt(2, l, c), zt(3, l, c), (M.fillStyle = "#000"), (M.globalAlpha = 0.09), l <= 0 && M.fillRect(0, 0, -l, re), T.mapScale - l <= se)) {
            var s = Math.max(0, -c);
            M.fillRect(T.mapScale - l, s, se - (T.mapScale - l), re - s);
        }
        if ((c <= 0 && M.fillRect(-l, 0, se + l, -c), T.mapScale - c <= re)) {
            var n = Math.max(0, -l);
            let a = 0;
            T.mapScale - l <= se && (a = se - (T.mapScale - l)), M.fillRect(n, T.mapScale - c, se - n - a, re - (T.mapScale - c));
        }
        (M.globalAlpha = 1), (M.fillStyle = "rgba(0, 0, 70, 0.35)"), M.fillRect(0, 0, se, re), (M.strokeStyle = kr);
        for (var t = 0; t < J.length + ye.length; ++t)
            if (((y = J[t] || ye[t - J.length]), y.visible && (y.skinIndex != 10 || y == E || (y.team && y.team == E.team)))) {
                const u = (y.team ? "[" + y.team + "] " : "") + (y.name || "");
                if (u != "") {
                    if (
                        ((M.font = (y.nameScale || 30) + "px Hammersmith One"),
                        (M.fillStyle = "#fff"),
                        (M.textBaseline = "middle"),
                        (M.textAlign = "center"),
                        (M.lineWidth = y.nameScale ? 11 : 8),
                        (M.lineJoin = "round"),
                        M.strokeText(u, y.x - l, y.y - c - y.scale - T.nameY),
                        M.fillText(u, y.x - l, y.y - c - y.scale - T.nameY),
                        y.isLeader && Vt.crown.isLoaded)
                    ) {
                        var r = T.crownIconScale,
                            n = y.x - l - r / 2 - M.measureText(u).width / 2 - T.crownPad;
                        M.drawImage(Vt.crown, n, y.y - c - y.scale - T.nameY - r / 2 - 5, r, r);
                    }
                    if (y.iconIndex == 1 && Vt.skull.isLoaded) {
                        var r = T.crownIconScale,
                            n = y.x - l - r / 2 + M.measureText(u).width / 2 + T.crownPad;
                        M.drawImage(Vt.skull, n, y.y - c - y.scale - T.nameY - r / 2 - 5, r, r);
                    }
                }
                y.health > 0 &&
                    (T.healthBarWidth,
                    (M.fillStyle = kr),
                    M.roundRect(y.x - l - T.healthBarWidth - T.healthBarPad, y.y - c + y.scale + T.nameY, T.healthBarWidth * 2 + T.healthBarPad * 2, 17, 8),
                    M.fill(),
                    (M.fillStyle = y == E || (y.team && y.team == E.team) ? "#8ecc51" : "#cc5151"),
                    M.roundRect(y.x - l - T.healthBarWidth, y.y - c + y.scale + T.nameY + T.healthBarPad, T.healthBarWidth * 2 * (y.health / y.maxHealth), 17 - T.healthBarPad * 2, 7),
                    M.fill());
            }
        Hn.update(be, M, l, c);
        for (var t = 0; t < J.length; ++t)
            if (((y = J[t]), y.visible && y.chatCountdown > 0)) {
                (y.chatCountdown -= be), y.chatCountdown <= 0 && (y.chatCountdown = 0), (M.font = "32px Hammersmith One");
                const u = M.measureText(y.chatMessage);
                (M.textBaseline = "middle"), (M.textAlign = "center");
                var n = y.x - l,
                    s = y.y - y.scale - c - 90;
                const m = 47,
                    w = u.width + 17;
                (M.fillStyle = "rgba(0,0,0,0.2)"), M.roundRect(n - w / 2, s - m / 2, w, m, 6), M.fill(), (M.fillStyle = "#fff"), M.fillText(y.chatMessage, n, s);
            }
    }
    lf(be);
}
function br(e, t, i) {
    for (let s = 0; s < Mt.length; ++s) (y = Mt[s]), y.active && y.layer == e && (y.update(be), y.active && Bo(y.x - t, y.y - i, y.scale) && (M.save(), M.translate(y.x - t, y.y - i), M.rotate(y.dir), Zn(0, 0, y, M), M.restore()));
}
const Sr = {};
function Zn(e, t, i, s, n) {
    if (i.src) {
        const r = R.projectiles[i.indx].src;
        let o = Sr[r];
        o ||
            ((o = new Image()),
            (o.onload = function () {
                this.isLoaded = !0;
            }),
            (o.src = "./img/weapons/" + r + ".png"),
            (Sr[r] = o)),
            o.isLoaded && s.drawImage(o, e - i.scale / 2, t - i.scale / 2, i.scale, i.scale);
    } else i.indx == 1 && ((s.fillStyle = "#939393"), Q(e, t, i.scale, s));
}
function Rf() {
    const e = Re - se / 2,
        t = _e - re / 2;
    (Me.animationTime += be), (Me.animationTime %= T.volcanoAnimationDuration);
    const i = T.volcanoAnimationDuration / 2,
        s = 1.7 + 0.3 * (Math.abs(i - Me.animationTime) / i),
        n = T.innerVolcanoScale * s;
    M.drawImage(Me.land, Me.x - T.volcanoScale - e, Me.y - T.volcanoScale - t, T.volcanoScale * 2, T.volcanoScale * 2), M.drawImage(Me.lava, Me.x - n - e, Me.y - n - t, n * 2, n * 2);
}
function Tr(e, t, i, s) {
    const n = T.riverWidth + s,
        r = T.mapScale / 2 - t - n / 2;
    r < re && r + n > 0 && i.fillRect(0, r, se, n);
}
function zt(e, t, i) {
    let s, n, r;
    for (let o = 0; o < et.length; ++o)
        (y = et[o]),
            y.active &&
                ((n = y.x + y.xWiggle - t),
                (r = y.y + y.yWiggle - i),
                e == 0 && y.update(be),
                y.layer == e &&
                    Bo(n, r, y.scale + (y.blocker || 0)) &&
                    ((M.globalAlpha = y.hideFromEnemy ? 0.6 : 1),
                    y.isItem
                        ? ((s = Ss(y)),
                          M.save(),
                          M.translate(n, r),
                          M.rotate(y.dir),
                          M.drawImage(s, -(s.width / 2), -(s.height / 2)),
                          y.blocker && ((M.strokeStyle = "#db6e6e"), (M.globalAlpha = 0.3), (M.lineWidth = 6), Q(0, 0, y.blocker, M, !1, !0)),
                          M.restore())
                        : y.type === 4
                        ? Rf()
                        : ((s = Hf(y)), M.drawImage(s, n - s.width / 2, r - s.height / 2))));
}
function _f(e, t, i) {
    (y = _i(e)), y && y.startAnim(t, i);
}
function Ir(e, t, i) {
    M.globalAlpha = 1;
    for (let s = 0; s < J.length; ++s)
        (y = J[s]), y.zIndex == i && (y.animate(be), y.visible && ((y.skinRot += 0.002 * be), (lr = (y == E ? vs() : y.dir) + y.dirPlus), M.save(), M.translate(y.x - e, y.y - t), M.rotate(lr), Bf(y, M), M.restore()));
}
function Bf(e, t) {
    (t = t || M), (t.lineWidth = Xe), (t.lineJoin = "miter");
    const i = (Math.PI / 4) * (R.weapons[e.weaponIndex].armS || 1),
        s = (e.buildIndex < 0 && R.weapons[e.weaponIndex].hndS) || 1,
        n = (e.buildIndex < 0 && R.weapons[e.weaponIndex].hndD) || 1;
    if (
        (e.tailIndex > 0 && zf(e.tailIndex, t, e),
        e.buildIndex < 0 &&
            !R.weapons[e.weaponIndex].aboveHand &&
            (Ar(R.weapons[e.weaponIndex], T.weaponVariants[e.weaponVariant].src, e.scale, 0, t),
            R.weapons[e.weaponIndex].projectile != null && !R.weapons[e.weaponIndex].hideProjectile && Zn(e.scale, 0, R.projectiles[R.weapons[e.weaponIndex].projectile], M)),
        (t.fillStyle = T.skinColors[e.skinColor]),
        Q(e.scale * Math.cos(i), e.scale * Math.sin(i), 14),
        Q(e.scale * n * Math.cos(-i * s), e.scale * n * Math.sin(-i * s), 14),
        e.buildIndex < 0 &&
            R.weapons[e.weaponIndex].aboveHand &&
            (Ar(R.weapons[e.weaponIndex], T.weaponVariants[e.weaponVariant].src, e.scale, 0, t),
            R.weapons[e.weaponIndex].projectile != null && !R.weapons[e.weaponIndex].hideProjectile && Zn(e.scale, 0, R.projectiles[R.weapons[e.weaponIndex].projectile], M)),
        e.buildIndex >= 0)
    ) {
        const r = Ss(R.list[e.buildIndex]);
        t.drawImage(r, e.scale - R.list[e.buildIndex].holdOffset, -r.width / 2);
    }
    Q(0, 0, e.scale, t), e.skinIndex > 0 && (t.rotate(Math.PI / 2), _o(e.skinIndex, t, null, e));
}
const Mr = {},
    Er = {};
let De;
function _o(e, t, i, s) {
    if (((De = Mr[e]), !De)) {
        const r = new Image();
        (r.onload = function () {
            (this.isLoaded = !0), (this.onload = null);
        }),
            (r.src = "./img/hats/hat_" + e + ".png"),
            (Mr[e] = r),
            (De = r);
    }
    let n = i || Er[e];
    if (!n) {
        for (let r = 0; r < Xt.length; ++r)
            if (Xt[r].id == e) {
                n = Xt[r];
                break;
            }
        Er[e] = n;
    }
    De.isLoaded && t.drawImage(De, -n.scale / 2, -n.scale / 2, n.scale, n.scale), !i && n.topSprite && (t.save(), t.rotate(s.skinRot), _o(e + "_top", t, n, s), t.restore());
}
const Pr = {},
    Cr = {};
function zf(e, t, i) {
    if (((De = Pr[e]), !De)) {
        const n = new Image();
        (n.onload = function () {
            (this.isLoaded = !0), (this.onload = null);
        }),
            (n.src = "./img/accessories/access_" + e + ".png"),
            (Pr[e] = n),
            (De = n);
    }
    let s = Cr[e];
    if (!s) {
        for (let n = 0; n < Gt.length; ++n)
            if (Gt[n].id == e) {
                s = Gt[n];
                break;
            }
        Cr[e] = s;
    }
    De.isLoaded && (t.save(), t.translate(-20 - (s.xOff || 0), 0), s.spin && t.rotate(i.skinRot), t.drawImage(De, -(s.scale / 2), -(s.scale / 2), s.scale, s.scale), t.restore());
}
var jn = {};
function Ar(e, t, i, s, n) {
    const r = e.src + (t || "");
    let o = jn[r];
    o ||
        ((o = new Image()),
        (o.onload = function () {
            this.isLoaded = !0;
        }),
        (o.src = "./img/weapons/" + r + ".png"),
        (jn[r] = o)),
        o.isLoaded && n.drawImage(o, i + e.xOff - e.length / 2, s + e.yOff - e.width / 2, e.length, e.width);
}
const Dr = {};
function Hf(e) {
    const t = e.y >= T.mapScale - T.snowBiomeTop ? 2 : e.y <= T.snowBiomeTop ? 1 : 0,
        i = e.type + "_" + e.scale + "_" + t;
    let s = Dr[i];
    if (!s) {
        const r = document.createElement("canvas");
        r.width = r.height = e.scale * 2.1 + Xe;
        const o = r.getContext("2d");
        if ((o.translate(r.width / 2, r.height / 2), o.rotate(C.randFloat(0, Math.PI)), (o.strokeStyle = ei), (o.lineWidth = Xe), e.type == 0)) {
            let l;
            for (var n = 0; n < 2; ++n) (l = y.scale * (n ? 0.5 : 1)), Ie(o, y.sid % 2 === 0 ? 5 : 7, l, l * 0.7), (o.fillStyle = t ? (n ? "#fff" : "#e3f1f4") : n ? "#b4db62" : "#9ebf57"), o.fill(), n || o.stroke();
        } else if (e.type == 1)
            if (t == 2) (o.fillStyle = "#606060"), Ie(o, 6, e.scale * 0.3, e.scale * 0.71), o.fill(), o.stroke(), (o.fillStyle = "#89a54c"), Q(0, 0, e.scale * 0.55, o), (o.fillStyle = "#a5c65b"), Q(0, 0, e.scale * 0.3, o, !0);
            else {
                Uf(o, 6, y.scale, y.scale * 0.7), (o.fillStyle = t ? "#e3f1f4" : "#89a54c"), o.fill(), o.stroke(), (o.fillStyle = t ? "#6a64af" : "#c15555");
                let l;
                const c = 4,
                    a = Ze / c;
                for (var n = 0; n < c; ++n) (l = C.randInt(y.scale / 3.5, y.scale / 2.3)), Q(l * Math.cos(a * n), l * Math.sin(a * n), C.randInt(10, 12), o);
            }
        else
            (e.type == 2 || e.type == 3) &&
                ((o.fillStyle = e.type == 2 ? (t == 2 ? "#938d77" : "#939393") : "#e0c655"),
                Ie(o, 3, e.scale, e.scale),
                o.fill(),
                o.stroke(),
                (o.fillStyle = e.type == 2 ? (t == 2 ? "#b2ab90" : "#bcbcbc") : "#ebdca3"),
                Ie(o, 3, e.scale * 0.55, e.scale * 0.65),
                o.fill());
        (s = r), (Dr[i] = s);
    }
    return s;
}
function Or(e, t, i) {
    const s = e.lineWidth || 0;
    (i /= 2), e.beginPath();
    let n = (Math.PI * 2) / t;
    for (let r = 0; r < t; r++) e.lineTo(i + (i - s / 2) * Math.cos(n * r), i + (i - s / 2) * Math.sin(n * r));
    e.closePath();
}
function Ff() {
    const t = T.volcanoScale * 2,
        i = document.createElement("canvas");
    (i.width = t), (i.height = t);
    const s = i.getContext("2d");
    (s.strokeStyle = "#3e3e3e"), (s.lineWidth = Xe * 2), (s.fillStyle = "#7f7f7f"), Or(s, 10, t), s.fill(), s.stroke(), (Me.land = i);
    const n = document.createElement("canvas"),
        r = T.innerVolcanoScale * 2;
    (n.width = r), (n.height = r);
    const o = n.getContext("2d");
    (o.strokeStyle = ei), (o.lineWidth = Xe * 1.6), (o.fillStyle = "#f54e16"), (o.strokeStyle = "#f56f16"), Or(o, 10, r), o.fill(), o.stroke(), (Me.lava = n);
}
Ff();
const Rr = [];
function Ss(e, t) {
    let i = Rr[e.id];
    if (!i || t) {
        const c = document.createElement("canvas");
        c.width = c.height = e.scale * 2.5 + Xe + (R.list[e.id].spritePadding || 0);
        const a = c.getContext("2d");
        if ((a.translate(c.width / 2, c.height / 2), a.rotate(t ? 0 : Math.PI / 2), (a.strokeStyle = ei), (a.lineWidth = Xe * (t ? c.width / 81 : 1)), e.name == "apple")) {
            (a.fillStyle = "#c15555"), Q(0, 0, e.scale, a), (a.fillStyle = "#89a54c");
            const u = -(Math.PI / 2);
            Vf(e.scale * Math.cos(u), e.scale * Math.sin(u), 25, u + Math.PI / 2, a);
        } else if (e.name == "cookie") {
            (a.fillStyle = "#cca861"), Q(0, 0, e.scale, a), (a.fillStyle = "#937c4b");
            for (var s = 4, n = Ze / s, r, o = 0; o < s; ++o) (r = C.randInt(e.scale / 2.5, e.scale / 1.7)), Q(r * Math.cos(n * o), r * Math.sin(n * o), C.randInt(4, 5), a, !0);
        } else if (e.name == "cheese") {
            (a.fillStyle = "#f4f3ac"), Q(0, 0, e.scale, a), (a.fillStyle = "#c3c28b");
            for (var s = 4, n = Ze / s, r, o = 0; o < s; ++o) (r = C.randInt(e.scale / 2.5, e.scale / 1.7)), Q(r * Math.cos(n * o), r * Math.sin(n * o), C.randInt(4, 5), a, !0);
        } else if (e.name == "wood wall" || e.name == "stone wall" || e.name == "castle wall") {
            a.fillStyle = e.name == "castle wall" ? "#83898e" : e.name == "wood wall" ? "#a5974c" : "#939393";
            const u = e.name == "castle wall" ? 4 : 3;
            Ie(a, u, e.scale * 1.1, e.scale * 1.1), a.fill(), a.stroke(), (a.fillStyle = e.name == "castle wall" ? "#9da4aa" : e.name == "wood wall" ? "#c9b758" : "#bcbcbc"), Ie(a, u, e.scale * 0.65, e.scale * 0.65), a.fill();
        } else if (e.name == "spikes" || e.name == "greater spikes" || e.name == "poison spikes" || e.name == "spinning spikes") {
            a.fillStyle = e.name == "poison spikes" ? "#7b935d" : "#939393";
            var l = e.scale * 0.6;
            Ie(a, e.name == "spikes" ? 5 : 6, e.scale, l), a.fill(), a.stroke(), (a.fillStyle = "#a5974c"), Q(0, 0, l, a), (a.fillStyle = "#c9b758"), Q(0, 0, l / 2, a, !0);
        } else if (e.name == "windmill" || e.name == "faster windmill" || e.name == "power mill")
            (a.fillStyle = "#a5974c"), Q(0, 0, e.scale, a), (a.fillStyle = "#c9b758"), En(0, 0, e.scale * 1.5, 29, 4, a), (a.fillStyle = "#a5974c"), Q(0, 0, e.scale * 0.5, a);
        else if (e.name == "mine") (a.fillStyle = "#939393"), Ie(a, 3, e.scale, e.scale), a.fill(), a.stroke(), (a.fillStyle = "#bcbcbc"), Ie(a, 3, e.scale * 0.55, e.scale * 0.65), a.fill();
        else if (e.name == "sapling")
            for (var o = 0; o < 2; ++o) {
                var l = e.scale * (o ? 0.5 : 1);
                Ie(a, 7, l, l * 0.7), (a.fillStyle = o ? "#b4db62" : "#9ebf57"), a.fill(), o || a.stroke();
            }
        else if (e.name == "pit trap") (a.fillStyle = "#a5974c"), Ie(a, 3, e.scale * 1.1, e.scale * 1.1), a.fill(), a.stroke(), (a.fillStyle = ei), Ie(a, 3, e.scale * 0.65, e.scale * 0.65), a.fill();
        else if (e.name == "boost pad") (a.fillStyle = "#7e7f82"), kt(0, 0, e.scale * 2, e.scale * 2, a), a.fill(), a.stroke(), (a.fillStyle = "#dbd97d"), Lf(e.scale * 1, a);
        else if (e.name == "turret") {
            (a.fillStyle = "#a5974c"), Q(0, 0, e.scale, a), a.fill(), a.stroke(), (a.fillStyle = "#939393");
            const u = 50;
            kt(0, -u / 2, e.scale * 0.9, u, a), Q(0, 0, e.scale * 0.6, a), a.fill(), a.stroke();
        } else if (e.name == "platform") {
            a.fillStyle = "#cebd5f";
            const u = 4,
                p = e.scale * 2,
                h = p / u;
            let m = -(e.scale / 2);
            for (var o = 0; o < u; ++o) kt(m - h / 2, 0, h, e.scale * 2, a), a.fill(), a.stroke(), (m += p / u);
        } else
            e.name == "healing pad"
                ? ((a.fillStyle = "#7e7f82"), kt(0, 0, e.scale * 2, e.scale * 2, a), a.fill(), a.stroke(), (a.fillStyle = "#db6e6e"), En(0, 0, e.scale * 0.65, 20, 4, a, !0))
                : e.name == "spawn pad"
                ? ((a.fillStyle = "#7e7f82"), kt(0, 0, e.scale * 2, e.scale * 2, a), a.fill(), a.stroke(), (a.fillStyle = "#71aad6"), Q(0, 0, e.scale * 0.6, a))
                : e.name == "blocker"
                ? ((a.fillStyle = "#7e7f82"), Q(0, 0, e.scale, a), a.fill(), a.stroke(), a.rotate(Math.PI / 4), (a.fillStyle = "#db6e6e"), En(0, 0, e.scale * 0.65, 20, 4, a, !0))
                : e.name == "teleporter" && ((a.fillStyle = "#7e7f82"), Q(0, 0, e.scale, a), a.fill(), a.stroke(), a.rotate(Math.PI / 4), (a.fillStyle = "#d76edb"), Q(0, 0, e.scale * 0.5, a, !0));
        (i = c), t || (Rr[e.id] = i);
    }
    return i;
}
function Vf(e, t, i, s, n) {
    const r = e + i * Math.cos(s),
        o = t + i * Math.sin(s),
        l = i * 0.4;
    n.moveTo(e, t),
        n.beginPath(),
        n.quadraticCurveTo((e + r) / 2 + l * Math.cos(s + Math.PI / 2), (t + o) / 2 + l * Math.sin(s + Math.PI / 2), r, o),
        n.quadraticCurveTo((e + r) / 2 - l * Math.cos(s + Math.PI / 2), (t + o) / 2 - l * Math.sin(s + Math.PI / 2), e, t),
        n.closePath(),
        n.fill(),
        n.stroke();
}
function Q(e, t, i, s, n, r) {
    (s = s || M), s.beginPath(), s.arc(e, t, i, 0, 2 * Math.PI), r || s.fill(), n || s.stroke();
}
function Ie(e, t, i, s) {
    let n = (Math.PI / 2) * 3,
        r,
        o;
    const l = Math.PI / t;
    e.beginPath(), e.moveTo(0, -i);
    for (let c = 0; c < t; c++) (r = Math.cos(n) * i), (o = Math.sin(n) * i), e.lineTo(r, o), (n += l), (r = Math.cos(n) * s), (o = Math.sin(n) * s), e.lineTo(r, o), (n += l);
    e.lineTo(0, -i), e.closePath();
}
function kt(e, t, i, s, n, r) {
    n.fillRect(e - i / 2, t - s / 2, i, s), r || n.strokeRect(e - i / 2, t - s / 2, i, s);
}
function En(e, t, i, s, n, r, o) {
    r.save(), r.translate(e, t), (n = Math.ceil(n / 2));
    for (let l = 0; l < n; l++) kt(0, 0, i * 2, s, r, o), r.rotate(Math.PI / n);
    r.restore();
}
function Uf(e, t, i, s) {
    let n = (Math.PI / 2) * 3;
    const r = Math.PI / t;
    let o;
    e.beginPath(), e.moveTo(0, -s);
    for (let l = 0; l < t; l++) (o = C.randInt(i + 0.9, i * 1.2)), e.quadraticCurveTo(Math.cos(n + r) * o, Math.sin(n + r) * o, Math.cos(n + r * 2) * s, Math.sin(n + r * 2) * s), (n += r * 2);
    e.lineTo(0, -s), e.closePath();
}
function Lf(e, t) {
    t = t || M;
    const i = e * (Math.sqrt(3) / 2);
    t.beginPath(), t.moveTo(0, -i / 2), t.lineTo(-e / 2, i / 2), t.lineTo(e / 2, i / 2), t.lineTo(0, -i / 2), t.fill(), t.closePath();
}
function Nf() {
    const e = T.mapScale / 2;
    ue.add(0, e, e + 200, 0, T.treeScales[3], 0),
        ue.add(1, e, e - 480, 0, T.treeScales[3], 0),
        ue.add(2, e + 300, e + 450, 0, T.treeScales[3], 0),
        ue.add(3, e - 950, e - 130, 0, T.treeScales[2], 0),
        ue.add(4, e - 750, e - 400, 0, T.treeScales[3], 0),
        ue.add(5, e - 700, e + 400, 0, T.treeScales[2], 0),
        ue.add(6, e + 800, e - 200, 0, T.treeScales[3], 0),
        ue.add(7, e - 260, e + 340, 0, T.bushScales[3], 1),
        ue.add(8, e + 760, e + 310, 0, T.bushScales[3], 1),
        ue.add(9, e - 800, e + 100, 0, T.bushScales[3], 1),
        ue.add(10, e - 800, e + 300, 0, R.list[4].scale, R.list[4].id, R.list[10]),
        ue.add(11, e + 650, e - 390, 0, R.list[4].scale, R.list[4].id, R.list[10]),
        ue.add(12, e - 400, e - 450, 0, T.rockScales[2], 2);
}
function qf(e) {
    for (let t = 0; t < e.length; ) ue.add(e[t], e[t + 1], e[t + 2], e[t + 3], e[t + 4], e[t + 5], R.list[e[t + 6]], !0, e[t + 7] >= 0 ? { sid: e[t + 7] } : null), (t += 8);
}
function Wf(e, t) {
    (y = Ho(t)), y && ((y.xWiggle += T.gatherWiggle * Math.cos(e)), (y.yWiggle += T.gatherWiggle * Math.sin(e)));
}
function Xf(e, t) {
    (y = Ho(e)), y && ((y.dir = t), (y.xWiggle += T.gatherWiggle * Math.cos(t + Math.PI)), (y.yWiggle += T.gatherWiggle * Math.sin(t + Math.PI)));
}
function Gf(e, t, i, s, n, r, o, l) {
    ds && (po.addProjectile(e, t, i, s, n, r, null, null, o).sid = l);
}
function Yf(e, t) {
    for (let i = 0; i < Mt.length; ++i) Mt[i].sid == e && (Mt[i].range = t);
}
function $f(e) {
    (y = zo(e)), y && y.startAnim();
}
function Kf(e) {
    for (var t = 0; t < ye.length; ++t) (ye[t].forcePos = !ye[t].visible), (ye[t].visible = !1);
    if (e) {
        const i = Date.now();
        for (var t = 0; t < e.length; )
            (y = zo(e[t])),
                y
                    ? ((y.index = e[t + 1]),
                      (y.t1 = y.t2 === void 0 ? i : y.t2),
                      (y.t2 = i),
                      (y.x1 = y.x),
                      (y.y1 = y.y),
                      (y.x2 = e[t + 2]),
                      (y.y2 = e[t + 3]),
                      (y.d1 = y.d2 === void 0 ? e[t + 4] : y.d2),
                      (y.d2 = e[t + 4]),
                      (y.health = e[t + 5]),
                      (y.dt = 0),
                      (y.visible = !0))
                    : ((y = ar.spawn(e[t + 2], e[t + 3], e[t + 4], e[t + 1])),
                      (y.x2 = y.x),
                      (y.y2 = y.y),
                      (y.d2 = y.dir),
                      (y.health = e[t + 5]),
                      ar.aiTypes[e[t + 1]].name || (y.name = T.cowNames[e[t + 6]]),
                      (y.forcePos = !0),
                      (y.sid = e[t]),
                      (y.visible = !0)),
                (t += 7);
    }
}
const _r = {};
function Jf(e, t) {
    const i = e.index;
    let s = _r[i];
    if (!s) {
        const n = new Image();
        (n.onload = function () {
            (this.isLoaded = !0), (this.onload = null);
        }),
            (n.src = "./img/animals/" + e.src + ".png"),
            (s = n),
            (_r[i] = s);
    }
    if (s.isLoaded) {
        const n = e.scale * 1.2 * (e.spriteMlt || 1);
        t.drawImage(s, -n, -n, n * 2, n * 2);
    }
}
function Bo(e, t, i) {
    return e + i >= 0 && e - i <= se && t + i >= 0 && t - i <= re;
}
function Qf(e, t) {
    let i = nu(e[0]);
    i || ((i = new _c(e[0], e[1], T, C, po, ue, J, ye, R, Xt, Gt)), J.push(i)),
        i.spawn(t ? xi : null),
        (i.visible = !1),
        (i.x2 = void 0),
        (i.y2 = void 0),
        i.setData(e),
        t && ((E = i), (Re = E.x), (_e = E.y), To(), Do(), Ro(), Oo(0), (us.style.display = "block"));
}
function Zf(e) {
    for (let t = 0; t < J.length; t++)
        if (J[t].id == e) {
            J.splice(t, 1);
            break;
        }
}
function jf(e, t) {
    E && (E.itemCounts[e] = t);
}
function eu(e, t, i) {
    E && ((E[e] = t), i && Do());
}
function tu(e, t) {
    (y = _i(e)), y && (y.health = t);
}
function iu(e) {
    const t = Date.now();
    for (var i = 0; i < J.length; ++i) (J[i].forcePos = !J[i].visible), (J[i].visible = !1);
    for (var i = 0; i < e.length; )
        (y = _i(e[i])),
            y &&
                ((y.t1 = y.t2 === void 0 ? t : y.t2),
                (y.t2 = t),
                (y.x1 = y.x),
                (y.y1 = y.y),
                (y.x2 = e[i + 1]),
                (y.y2 = e[i + 2]),
                (y.d1 = y.d2 === void 0 ? e[i + 3] : y.d2),
                (y.d2 = e[i + 3]),
                (y.dt = 0),
                (y.buildIndex = e[i + 4]),
                (y.weaponIndex = e[i + 5]),
                (y.weaponVariant = e[i + 6]),
                (y.team = e[i + 7]),
                (y.isLeader = e[i + 8]),
                (y.skinIndex = e[i + 9]),
                (y.tailIndex = e[i + 10]),
                (y.iconIndex = e[i + 11]),
                (y.zIndex = e[i + 12]),
                (y.visible = !0)),
            (i += 13);
}
function nu(e) {
    for (let t = 0; t < J.length; ++t) if (J[t].id == e) return J[t];
    return null;
}
function _i(e) {
    for (let t = 0; t < J.length; ++t) if (J[t].sid == e) return J[t];
    return null;
}
function zo(e) {
    for (let t = 0; t < ye.length; ++t) if (ye[t].sid == e) return ye[t];
    return null;
}
function Ho(e) {
    for (let t = 0; t < et.length; ++t) if (et[t].sid == e) return et[t];
    return null;
}
let Fo = -1;
function su() {
    const e = Date.now() - Fo;
    (window.pingTime = e), (Qt.innerText = "Ping: " + e + "Â ms");
}
let Pn;
function Vo() {
    Pn && clearTimeout(Pn), cs() && ((Fo = Date.now()), ee.send("0")), (Pn = setTimeout(Vo, 2500));
}
function ru(e) {
    if (e < 0) return;
    const t = Math.floor(e / 60);
    let i = e % 60;
    (i = ("0" + i).slice(-2)), (dr.innerText = "Server restarting in " + t + ":" + i), (dr.hidden = !1);
}
window.requestAnimFrame = (function () {
    return (
        window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        function (e) {
            window.setTimeout(e, 1e3 / 60);
        }
    );
})();
function Uo() {
    (It = Date.now()), (be = It - or), (or = It), Of(), requestAnimFrame(Uo);
}
Nf();
Uo();
function Lo(e) {
    window.open(e, "_blank");
}
window.openLink = Lo;
window.aJoinReq = Gn;
window.follmoo = Bh;
window.kickFromClan = ko;
window.sendJoin = vo;
window.leaveAlliance = xo;
window.createAlliance = Yn;
window.storeBuy = bo;
window.storeEquip = Jn;
window.showItemInfo = Se;
window.selectSkinColor = mf;
window.changeStoreIndex = cf;
window.config = T;
window.io = ee;
window.player = E;
window.tmpObj = y;
window.items = R;